如何用鼠标旋转相机(播放器)?在几乎任何3D游戏中,您都可以使用鼠标环顾世界。我可以使用glRotatef()
来完成此任务吗?或者是否有一个特定的函数用于旋转视口?
答案 0 :(得分:0)
您必须使用鼠标坐标来计算您必须旋转的方向。
例如:如果您每帧都存储鼠标坐标,则可以执行以下操作:
if (thisFrameMouse.x >= lastFrameMouse.x) {
// mouse moved to right
} else {
// mouse moved to left
}
然后,您可以使用此信息根据两个值的差异计算新的旋转角度。使用旋转角度和旋转轴,您可以创建新的旋转矩阵或使用glRotatef
更新现有矩阵(使用矩阵模式GL_MODELVIEW
,这要归功于datenwolf)。
如果您使用的是GLU,还可以使用gluLookAt功能
答案 1 :(得分:0)
这取决于你想拥有的那种观点。 你可以使用glOrtho():这里物体的深度无关紧要,物体被投射到屏幕上的屏幕上。在Google图片上搜索glOrtho()时,您可以看到一些带图片的示例。 你也可以使用glLookAt():这是人类的观点。如何进一步了解它们的可见度。
对于glOrtho(),您必须使用glRotated并使用鼠标正确连接。 使用glLookAt稍微困难一些。在这里,您必须使用一些数学来计算要查看的点。 灯塔的教程很好。
请记住,您必须再次计算相机的每一帧。因为鼠标移动了。
答案 2 :(得分:0)
首先你必须明白,在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,可用于创建复合矩阵。从这里你就是你自己,因为你必须弄明白自己,如何根据你想要处理的用户输入实现相机变换。
答案 3 :(得分:0)
是的,您可以使用glRotatef(),但您需要计算旋转的数量以及旋转的位置。