- 主要讲解如何在OpenGL中实现Arcball效果.
- Arcball效果: 当按下鼠标左键并移动时, 场景窗口中鼠标下方的物体会围绕其中心旋转. 好比人用手指按住地球仪让其旋转的效果.
- 本例主要运用矩阵变换来实现. 首先根据鼠标的移动得到旋转轴以及旋转角度. 而后转换成四元数格式, 再转换成变换矩阵.
- 首先得到投影矩阵和视图变换矩阵
1 GLdouble projection_matrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
2 GLdouble modelview_matrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
3 int viewport_matrix[4] = {0,0,640,480};
4
5 glGetDoublev(GL_PROJECTION_MATRIX,projection_matrix);
6 glGetIntegerv(GL_VIEWPORT,viewport_matrix);
2 GLdouble modelview_matrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
3 int viewport_matrix[4] = {0,0,640,480};
4
5 glGetDoublev(GL_PROJECTION_MATRIX,projection_matrix);
6 glGetIntegerv(GL_VIEWPORT,viewport_matrix);
- 得到鼠标位置在模型空间中的位置
1 GLdouble x,y,z;
2 gluUnProject(mouse_x, mouse_y, 0.0,
3 modelview_matrix,
4 projection_matrix,
5 viewport_matrix,
6 &x, &y, &z);
2 gluUnProject(mouse_x, mouse_y, 0.0,
3 modelview_matrix,
4 projection_matrix,
5 viewport_matrix,
6 &x, &y, &z);
- 而后从眼睛位置以及上面得到的鼠标位置得到一条射线, 而后根据射线方程得到球面上一点的位置.
- 而后根据鼠标的移动得到另外一个球面点的位置. 从而得到球心到达两个球面上点的向量, 叉乘得到旋转轴, 点乘得到旋转角度.
- 根据旋转轴和旋转角度得到四元数. 而后四元数变换得到旋转矩阵.