/* \brief calcualate view matrix */ static void _glhckCameraViewMatrix(glhckCamera *object) { kmMat4 rotation, tmp; kmVec3 upvector; CALL(2, "%p", object); assert(object); /* build rotation for upvector */ kmMat4RotationAxisAngle(&rotation, &(kmVec3){0,0,1}, kmDegreesToRadians(object->object->view.rotation.z)); kmMat4RotationAxisAngle(&tmp, &(kmVec3){0,1,0}, kmDegreesToRadians(object->object->view.rotation.y)); kmMat4Multiply(&rotation, &rotation, &tmp); kmMat4RotationAxisAngle(&tmp, &(kmVec3){1,0,0}, kmDegreesToRadians(object->object->view.rotation.x)); kmMat4Multiply(&rotation, &rotation, &tmp); /* assuming upvector is normalized */ kmVec3Transform(&upvector, &object->view.upVector, &rotation); /* build view matrix */ kmMat4LookAt(&object->view.view, &object->object->view.translation, &object->object->view.target, &upvector); kmMat4Multiply(&object->view.viewProj, &object->view.projection, &object->view.view); glhckFrustumBuild(&object->frustum, &object->view.viewProj); }
void kmGLRotatef(float angle, float x, float y, float z) { kmVec3 axis; kmMat4 rotation; //Create an axis vector kmVec3Fill(&axis, x, y, z); //Create a rotation matrix using the axis and the angle kmMat4RotationAxisAngle(&rotation, &axis, kmDegreesToRadians(angle)); //Multiply the rotation matrix by the current matrix kmMat4Multiply(current_stack->top, current_stack->top, &rotation); }
void kmGLRotatef(float angle, float x, float y, float z) { km_mat4_stack_context *current_context = (km_mat4_stack_context *)pthread_getspecific(current_context_key); kmVec3 axis; kmMat4 rotation; /*Create an axis vector*/ kmVec3Fill(&axis, x, y, z); /*Create a rotation matrix using the axis and the angle*/ kmMat4RotationAxisAngle(&rotation, &axis, kmDegreesToRadians(angle)); /*Multiply the rotation matrix by the current matrix*/ kmMat4Multiply(current_context->current_stack->top, current_context->current_stack->top, &rotation); }