扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:张正波 牟 彦 黄 华 刘 波 来源:计算机与信息技术 2007年10月19日
关键字:
Matrix4fT Transform // 最终的变换,4*4矩阵,初始化为单位矩阵 Matrix3fT LastRot // 上一次的旋转,3*3矩阵,需要它是因为旋转的结果是要叠加起来的 Matrix3fT ThisRot //这次的旋转,3*3矩阵。 Point2fT MousePt; // 当前的鼠标坐标 bool isClicked = false; // 鼠标按下的标识 bool isRClicked = false; // 右键点击的标识 bool isDragging = false; //鼠标拖动的标识 |
void CRenderView::OnTimer(UINT nIDEvent) { if(m_Completed) { m_Completed = false; if (isRClicked) // 如果点击右键,重置旋转 { Matrix3fSetIdentity(&LastRot); //把LastRot重置为单位矩阵 Matrix3fSetIdentity(&ThisRot); //把ThisRot重置为单位矩阵 Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot); } if (!isDragging) // 没有拖动 { if (isClicked) // 第一次点击 { isDragging = true; // 为拖动作准备 LastRot = ThisRot; VirtualBall.click(&MousePt); } } // 更新起始点,为拖动作准备 else { if (isClicked) // 鼠标仍然被按下,说明仍处于拖动状态 { Quat4fT ThisQuat; //一个四元数,用来存旋转的信息 ArcBall.drag(&MousePt, &ThisQuat); //将四元数转化为旋转矩阵 Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat); Matrix3fMulMatrix3f(&ThisRot, &LastRot); //累积旋转结果 //得到我们最终的旋转结果 Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot); } else //没有拖动的 isDragging = false; } m_OpenGLDisplay.DisplayScene(m_p3DModel);// m_Completed = true; } CView::OnTimer(nIDEvent); } |
static void Matrix3fSetRotationFromQuat4f(Matrix3fT* NewObj, const Quat4fT* q1) { GLfloat n, s; GLfloat xs, ys, zs; GLfloat wx, wy, wz; GLfloat xx, xy, xz; GLfloat yy, yz, zz; assert(NewObj && q1); n = (q1->s.X * q1->s.X) + (q1->s.Y * q1->s.Y) + (q1->s.Z * q1->s.Z) + (q1->s.W * q1->s.W); s = (n > 0.0f) ? (2.0f / n) : 0.0f; xs = q1->s.X * s; ys = q1->s.Y * s; zs = q1->s.Z * s; wx = q1->s.W * xs; wy = q1->s.W * ys; wz = q1->s.W * zs; xx = q1->s.X * xs; xy = q1->s.X * ys; xz = q1->s.X * zs; yy = q1->s.Y * ys; yz = q1->s.Y * zs; zz = q1->s.Z * zs; NewObj->s.XX = 1.0f - (yy + zz); NewObj->s.YX = xy - wz; NewObj->s.ZX = xz + wy; NewObj->s.XY = xy + wz; NewObj->s.YY = 1.0f - (xx + zz); NewObj->s.ZY = yz - wx; NewObj->s.XZ = xz - wy; NewObj->s.YZ = yz + wx; NewObj->s.ZZ = 1.0f - (xx + yy); } |
glPushMatrix(); glMultMatrixf(Transform.M); //将旋转的矩阵作用于模型上 glBegin(DrawingMode); ………//此处为画模型的地方,即画模型各个面的地方 glEnd(); glPopMatrix(); |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者