这回我们继续优化交互。使用轨迹球来使得模型转得更加人性化。
轨迹球可以理解为模型外部套一个球体,在我们鼠标拖动旋转模型时,能够准确地模拟出球体被拖动的感觉。
首先,我在这里放弃了透视投影,考虑透视投影的话太复杂了。(搞不出来,就很烦)
用简单的正交投影来做吧
glMatrixMode(GL_PROJECTION);//设置投影矩阵
glLoadIdentity();
glOrtho(-1500, 1500, -1500, 1500, 1, 10000);
这样,我们可以简单地算出球在窗口中的大小。(这里我的窗口大小为250,1500为正交投影规定的视景体的一半)
work_size = a*(R/1500.0)*250;//a为缩放比例,初始为1
接着我们换算一下鼠标回调函数得到的坐标,把它转化成球心为原点的坐标系(窗口中间)。因为鼠标回馈的坐标是以左上为原点,向右为x,向下为y。所以我们这么转化:
x -= 250;
y -= 250;
y = -y;
这样,可以算出我们点击的点的“坐标”A,这里是针对窗口里显示的球(work_size为半径)的中心的坐标系,朝外为Z正。
r_x1 = x;
r_y1 = y;
r_z1 = sqrt(work_size*work_size - x*x - y*y);
同样,在鼠标移动的回调函数里,我们会得到另外一个点B的坐标(r_x2,r_y2,r_z2)。
计算出OA X OB(叉乘)的值,即为旋转轴,记得要把长度缩放为1。
rx = r_y1*r_z2-r_z1*r_y2;
ry = r_z1*r_x2 - r_x1*r_z2;
rz = r_x1*r_y2 - r_y1