OpenGL 自由旋转

来源:互联网 发布:js创建一个对象 编辑:程序博客网 时间:2024/05/02 01:40

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

     这篇日志是我在学习OpenGL的过程中的一点小小心得。因为本人刚刚接触OpenGL,并且还是业余时间自己捣腾,所以有些地方可能理解比较片面,或者解读有误的。如果有路过的正好看到这个文章,并且正好发现了里面错误的地方,希望能够留言指正,谢谢!!

     从一开始我就知道,voidglRotatef(GLfloatangle,GLfloat x,GLfloat y,GLfloatz)函数可以用来实现模型在场景中的旋转。我在做一个鼠标拖动旋转模型的小程序的时候,问题出现了。我的基本思路是,鼠标上下方向的移动解释为绕x轴转一定角度,鼠标左右方向的移动解释为绕y轴转动。在用户每次拖动鼠标是,都会既有横轴方向的移动,又有纵轴方向的移动。于是我就两次调用glRotatef函数,分别绕x轴和y轴转。但是,由于第一次调用的时候,坐标系已经变化了(我觉得可能是处于性能的考虑,glRotatef转的是坐标系,而不是模型),第二次调用就不能得到想要的结果。于是只能做到模型固定绕自己一条轴转,而不是绕用户看到的xy方向转。

     这时候就只能用变换矩阵的方式来实现旋转了。变换矩阵应该跟glRotatef内部做的事情是一个道理,就是把当前的模型变换矩阵乘一个特定的变换矩阵,来增加一个特定的变换效果。函数voidglMultMatrix{df}();就是用来完成这个功能的。这个函数在当前变换矩阵的基础上右乘一个增加效果的矩阵。具体使用的时候,我们只要把变换矩阵都乘在一起,就能够避免多次转动坐标系的问题。


 

PS:关于转角和变换矩阵的关系,可以参考这个网页:

http://www.cprogramming.com/tutorial/3d/rotationMatrices.html

 

原创粉丝点击