Beispiel #1
0
void Camera_GetViewMat(Camera *camera)
{
	mat4x4 R;
	mat4x4_Rot(R, camera->transform.quaternion);
	
	vec3 forward = { 0.0f, 0.0f, -1.0f };
	vec3 cam_forward;
	mat3x3_MulVec3(cam_forward, R, forward);

	vec3 right = { 1.0f, 0.0f, 0.0f };
	vec3 cam_right;
	mat3x3_MulVec3(cam_right, R, right);

	vec3 cam_up;
	vec3_CrossProd(cam_up, cam_right, cam_forward);
	
	vec3 target;
	vec3_Add(target, cam_forward, camera->transform.position);
	
	vec3 n;
	vec3_Sub(n, camera->transform.position, target);
	vec3_Norm(n, n);
	
	vec3 u;
	vec3_CrossProd(u, cam_up, n);
	vec3_Norm(u, u);
	
	vec3 v;
	vec3_CrossProd(v, n, u);
	
	int i = 0;
	for(i = 0; i < 3; ++i)
		camera->view_matrix[0][i] = u[i];
	
	for(i = 0; i < 3; ++i)
		camera->view_matrix[1][i] = v[i];
		
	for(i = 0; i < 3; ++i)
		camera->view_matrix[2][i] = n[i];
		
	for(i = 0; i < 3; ++i)
		camera->view_matrix[3][i] = 0.0f;
		
	vec3_Negate(u, u);
	vec3_Negate(v, v);
	vec3_Negate(n, n);
	
	camera->view_matrix[0][3] = vec3_DotProd(u, camera->transform.position);
	camera->view_matrix[1][3] = vec3_DotProd(v, camera->transform.position);
	camera->view_matrix[2][3] = vec3_DotProd(n, camera->transform.position);
	camera->view_matrix[3][3] = 1.0f;
}
Beispiel #2
0
Matrix4* mat4_LookAtView( const Vector3* eyePos, const Vector3* lookPos, const Vector3* up, Matrix4* out )
{
	assert( out != NULL );

	Vector3 u, f, s;

	memcpy( out, &IDENTITY_MATRIX, sizeof( Matrix4 ) );

	vec3_Subtract( lookPos, eyePos, &f );
	vec3_Normalize( &f );

	memcpy( &u, up, sizeof( Vector3 ) );
	vec3_Normalize( &u );

	vec3_CrossProd( &f, &u, &s );
	vec3_Normalize( &s );

	vec3_CrossProd( &s, &f, &u );

	out->m[0] = s.v[0];
	out->m[4] = s.v[1];
	out->m[8] = s.v[2];

	out->m[1] = u.v[0];
	out->m[5] = u.v[1];
	out->m[9] = u.v[2];

	out->m[2] = -f.v[0];
	out->m[6] = -f.v[1];
	out->m[10] = -f.v[2];

	out->m[12] = -vec3_DotProd( &s, eyePos );
	out->m[13] = -vec3_DotProd( &u, eyePos );
	out->m[14] = vec3_DotProd( &f, eyePos );

	return out;
}