opengl学习笔记Ⅴ——磨人的轨迹球真可爱

本文介绍了如何使用轨迹球实现OpenGL中模型的更人性化的旋转交互。通过正交投影简化问题,将鼠标坐标转换为球心坐标系,并计算旋转轴和角度,构建旋转矩阵。在鼠标释放时更新累计旋转矩阵,并讨论了OpenGL矩阵操作的注意事项。同时,为解决光照模型导致的球体颜色变化,设置了球体自发光颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这回我们继续优化交互。使用轨迹球来使得模型转得更加人性化。

轨迹球可以理解为模型外部套一个球体,在我们鼠标拖动旋转模型时,能够准确地模拟出球体被拖动的感觉。

首先,我在这里放弃了透视投影,考虑透视投影的话太复杂了。(搞不出来,就很烦)

用简单的正交投影来做吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值