进行三维软件的开发,旋转是必不可少而且非常重要的一部分.
下面谈谈我对旋转的理解,偶的文字表述能力非常差,如果你觉得表述有问题,请无视.
旋转有两种方式:旋转场景或对象,旋转摄像机.
1.旋转场景或对象.
这是对场景或对象直接操作,操作之后物体的坐标值在应用矩阵后是发生了变化的.可用图形开发库提供的命令执行,或者直接操作三维矩阵.
1.1用图形开发库提供的命令执行.
比如在opengl中
glrotatef rotangle,rotaxis.x,rotaxis.y,rotaxis.z
绘制场景或对象
1.2 对三维矩阵操作.
有两种情况:
一.你不会写旋转矩阵:让opengl代替这部分工作
glloadidentity
glrotatef rotangle,rotaxis.x,rotaxis.y,rotaxis.z
glgetdoublev glmodelviewmatrix ,m'此时得到的就是旋转矩阵
'此次的旋转应该和以前对场景的操作起作用,使用矩阵相乘
glloadmatrixd 之前操作场景的矩阵
glmultmatrixd m'也可以自己写矩阵相乘.
二.你会计算旋转矩阵
'自己算出当前的旋转矩阵
'与之前的矩阵相乘.
2.旋转摄像机
这种情况,保持了场景或物体的坐标值不变,只是移动了摄像机.可以创建一个摄像机类,最基本有的
eyepos
lookcenter
up
right
旋转前,即鼠标按下时获得旋转的中心rotcenter,在鼠标移动时:
计算旋转轴
围绕旋转轴旋转eyepos,lookcenter,up,right
下一次渲染时直接glulookat eyepos,lookcenter,up即可.
关于旋转中心的问题:
旋转中心可以是:场景原点,物体包围盒的中心,鼠标拾取的位置,或者即时计算出的位置.
即时计算旋转中心(适合整个场景只有一个大的对象,由于移动,缩放等操作,仅有它的一部分可见,可见部分在视区是随意的):
每次旋转时找出所有在可见区的点
计算出这些点的包围盒
求出中心
这样很精确,但有一个缺点,当数据量很大时,电脑就会死掉.改进的方法是找出物体关键位置,只计算这些关键位置与视区的交.