大佬教程收集整理的这篇文章主要介绍了C OpenGL Quaternion for Camera翻转它,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_678_7@matrix4x4 camera::GetViewMat() { Matrix4x4 oRotate,oView; oView.SetIdentity(); Vector3 lookAtDir = m_targetPosition - m_camPosition; Vector3 lookAtHorizontal = Vector3(lookAtDir.GetX(),0.0f,lookAtDir.GetZ()); lookAtHorizontal.Normalize(); float angle = acosf(Vector3(0.0f,-1.0f).Dot(lookAtHorizontal)); Quaternions horizontalOrient(angle,Vector3(0.0f,1.0f,0.0f)); ori = horizontalOrient; ori.Conjugate(); oRotate = ori.ToMatrix(); Vector3 inverseTranslate = Vector3(-m_camPosition.GetX(),-m_camPosition.GetY(),-m_camPosition.GetZ()); oRotate.Transform(inverseTranslatE); oRotate.Set(0,3,inverseTranslate.GetX()); oRotate.Set(1,inverseTranslate.GetY()); oRotate.Set(2,inverseTranslate.GetZ()); oView = oRotate; return oView; }
首先,我们需要一种从角度和轴构造四元数的方法,我碰巧在pastebin上有这个,角度输入是弧度:
确保你没有输入轴(0,0),这没有任何意义.
现在是实际的更新方法,我们需要让四元数从默认方向旋转相机指向目标点.请注意我刚刚写了这篇文章,它可能需要一些调试,可能需要一些优化,但这至少应该给你一个正确的方向.
void camera::update() { // First get the direction from the camera's position to the target point vec3 lookAtDir = m_targetPoint - m_position; // I'm going to divide the vector into two 'components',the Y axis rotation // and the Up/Down rotation,like a regular camera would work. // First to calculate the rotation around the Y axis,so we zero out the y // component: vec3 lookAtHorizontal = vec3(lookAtDir.x,lookAtDir.z).normalize(); // Get the quaternion from 'default' direction to the horizontal direction // In this case,'default' direction is along the -z axis,like most OpenGL // programs. Make sure the projection matrix works according to this. float angle = acos(vec3(0.0f,-1.0f).dot(lookAtHorizontal)); quaternion horizontalOrient(angle,vec3(0.0f,0.0f)); // Since we already Stripped the Y component,we can simply get the up/down // rotation from it as well. angle = acos(lookAtDir.normalize().dot(lookAtHorizontal)); if(anglE) horizontalOrient *= quaternion(angle,lookAtDir.cross(lookAtHorizontal)); // ... m_orientation = horizontalOrient; }
现在实际上采用m_orientation和m_position来获取世界 – >相机矩阵
// First inverse each element (-position and inverse the quaternion),// the position is rotated since the position within a matrix is 'added' last // to the output vector,so it needs to account for rotation of the space. mat3 rotationMatrix = m_orientation.inverse().toMatrix(); vec3 inverseTranslate = rotationMatrix * -m_position; // Note the minus mat4 matrix = mat3; // just means the matrix is expanded,the last entry (bottom right of the matriX) is a 1.0f like an identity matrix would be. // This bit is row-major in my case,you just need to set the translation of the matrix. matrix[3] = inverseTranslate.x; matrix[7] = inverseTranslate.y; matrix[11] = inverseTranslate.z;
编辑我认为它应该是显而易见的,但只是为了完整性,.dot()采用向量的点积,.cross()采用叉积,执行方法的对象是向量A,方法的参数是向量B.
以上是大佬教程为你收集整理的C OpenGL Quaternion for Camera翻转它全部内容,希望文章能够帮你解决C OpenGL Quaternion for Camera翻转它所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。