2018-05-09
旋转看起来挺费劲的,其实非常简单。我们只需要给shader传入MVP矩阵即可。旋转分为两类:camera旋转、物体旋转。当指定MVP矩阵时,Model矩阵是每个物体携带的数据,Projection矩阵是由camera 的fov、aspect、near/far距离决定的,对于camera旋转,我们只需要更新View矩阵即可。View矩阵由三部分组成:eye pos,lookat center,up。这就是一个camera参数。camera一般围绕center旋转,up不变,那么eye 新的位置就可以通过旋转角度求出。对于物体旋转,我们只需要更新M矩阵即可。
我们在屏幕像素空间拖动鼠标,这个操作只影响三个空间维度中两个维度。我们很容易就能求解出两个方向的旋转角度。假设屏幕横纵向的距离代表的角度为90°,横纵方向移动的像素距离w,w/width() * 90°就是横向旋转的角度了,纵向同理。开始移动的时候,我们需要确定旋转所围绕的向量。
旋转物体时,需要以物体中心构造arcball来旋转。有两种处理方式:改变物体的坐标、改变物体的Model矩阵。对于显示来讲,无甚区别。一般,我们拖动物体或者旋转物体的时候,都会以物体的中心构造arcball,就是轨迹球。物体旋转示例代码如下:
glm::vec3 get_arcball_vector(double x, double y)
{
glm::vec3 coord = glm::vec3(1.0*x / width() * 2 - 1.0,
1.0*y / height() * 2 - 1.0, 0);
coord.y = -coord.y;
float length_squared = coord.x * coord.x + coord.y * coord.y;
if (length_squared <= 1.0)