我将如何用鼠标旋转相机(播放器)?在几乎任何 3D 游戏中,您都可以使用鼠标环顾世界。我可以glRotatef()
用来完成这个吗?还是有一个特定的功能可以用来旋转视口?
4 回答
您必须使用鼠标坐标来计算您必须旋转的方向。
例如:如果您每帧存储鼠标坐标,您可以执行以下操作:
if (thisFrameMouse.x >= lastFrameMouse.x) {
// mouse moved to right
} else {
// mouse moved to left
}
然后,您可以使用此信息根据两个值的差异计算新的旋转角度。使用旋转角度和旋转轴,您可以创建一个新的旋转矩阵或使用glRotatef
(使用矩阵模式GL_MODELVIEW
,感谢 datenwolf)更新现有矩阵。
如果您使用 GLU,您还可以使用gluLookAt函数
这取决于您想要拥有的视图类型。您可以使用 glOrtho():这里对象的深度无关紧要,对象被投影在屏幕上与屏幕平行。当您在谷歌图像上搜索 glOrtho() 时,您可以看到一些带有图像的示例。您也可以使用 glLookAt():这是人类的观点。更远的物体是多么不可见。
对于 glOrtho(),您必须使用 glRotated 并用鼠标正确连接它。使用 glLookAt 稍微困难一些。在这里,您必须使用一些数学来计算要查看的点。灯塔的教程很好。
请记住,您必须再次计算每一帧的相机。因为鼠标移动。
首先你必须明白,在 OpenGL 上没有相机!
OpenGL 所做的是,它获取顶点位置并将它们通过一系列线性变换(在固定函数管道中)。
通常的管道是
顶点局部空间位置到眼睛空间位置(模型视图变换)
v_eye = M · v
从那里进入剪辑空间(投影变换)
v_clip = P · v_eye
然后它进入标准化设备坐标(NDC)空间
v_ndc = v_clip / v_clip.w
就是这样。没有相机。那么如何定义视口呢?可以这样想:在世界中移动相机,或者保持相机在适当位置并移动整个世界,视觉结果没有区别。所以魔法必须发生在眼睛空间的变换中(即视图中顶点的位置)。
为此,我们将模型视图矩阵 M 分解为模型到世界部分 (W) 和移动世界到视图
M = V · W
所以这个矩阵 V 定义了“相机”。让我们假设世界上有一个相机对象,由相机到世界的转换C定义,转换到眼空间后相机对象位置的位置应该是不变的,即身份
1 = V · C
因此
C = V^-1
即视图变换是将相机从原点放置到世界的变换的逆。
那么哪个OpenGL函数定义了视图呢?没有特别的。固定函数 OpenGL 使用了许多矩阵。并且固定函数OpenGL提供了原始矩阵操作方法glScale、glTranslate、glRotate,可以用来创建复合矩阵。从这里开始,您就靠自己了,因为您必须自己弄清楚如何根据您要处理的用户输入来实现相机变换。
是的,你可以使用 glRotatef() 但你需要计算你将旋转多少以及你将在哪里旋转。