OpenGL与旋转、缩放、平移

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)
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值