如何使用鼠标控制 PyOpenGL 中的相机?
How do I control the camera in PyOpenGL using a mouse?
我们需要在 python 中制作 3D 游戏,因此在我的研究中我发现了 PyOpenGL。玩了一会儿之后,我对如何移动相机感到困惑。给我一些示例代码和解释。
PyOpenGL 是 OpenGL 的绑定。您需要使用一些框架来创建 windows 和处理 windowing 事件。过去,我曾使用 pyglet window 创建/输入处理/声音。这里的其他常见选项包括 SDL 和 pySFML,但确实有很多。
之后就是决定相机应该如何工作并使用输入来修改相机属性的问题。一旦你有了明确定义的相机位置、前向和向上矢量,你就可以把这些东西变成一个矩阵,将你的场景转换成相机的视角。
直接使用OpenGL是很低级的。具体如何工作由您决定。
这是一些使用 numpy 的 code of mine。您可以使用 spatial.py 中的接口函数来操作相机(将这些与鼠标输入事件相关联)
完成这些工作后,您可以使用
获得相关矩阵(作为 numpy 数组)
Camera.get_projection_matrix()
和
Camera.get_camera_matrix()
例如,在我的一个项目中,我用
初始化相机
def setupView(self):
self.camera = Camera()
self.camera.set_position(v3(3, 0, 10))
self.camera.look_at(v3(0, 0, 0))
然后使用
将相机同步到播放器(只是另一个Spatial
)
def updateCamera(self):
up = v3(*self.player.get_world_up())
position = v3(*self.player.get_position())
position += (v3(*self.player.get_world_forward()) * -10.0)
position += (up * 3.0)
self.camera.set_position(position)
self.camera.set_orientation(self.player.get_orientation())
鼠标事件影响玩家
def on_mouse_motion(self, x, y, dx, dy):
self.player.yaw(-dx * 0.005)
self.player.pitch(dy * 0.005)
然后在绘制时将相机矩阵传递给顶点着色器
def on_draw(self, renderer, t, dt):
...
matC = camera.get_camera_matrix()
renderer.set_shader_mat44('matC', matC)
...
顶点着色器通过将 C 与当前模型视图矩阵左乘来处理实际的顶点变换。
这不适合胆小的人:)
我们需要在 python 中制作 3D 游戏,因此在我的研究中我发现了 PyOpenGL。玩了一会儿之后,我对如何移动相机感到困惑。给我一些示例代码和解释。
PyOpenGL 是 OpenGL 的绑定。您需要使用一些框架来创建 windows 和处理 windowing 事件。过去,我曾使用 pyglet window 创建/输入处理/声音。这里的其他常见选项包括 SDL 和 pySFML,但确实有很多。
之后就是决定相机应该如何工作并使用输入来修改相机属性的问题。一旦你有了明确定义的相机位置、前向和向上矢量,你就可以把这些东西变成一个矩阵,将你的场景转换成相机的视角。
直接使用OpenGL是很低级的。具体如何工作由您决定。
这是一些使用 numpy 的 code of mine。您可以使用 spatial.py 中的接口函数来操作相机(将这些与鼠标输入事件相关联)
完成这些工作后,您可以使用
获得相关矩阵(作为 numpy 数组)Camera.get_projection_matrix()
和
Camera.get_camera_matrix()
例如,在我的一个项目中,我用
初始化相机def setupView(self):
self.camera = Camera()
self.camera.set_position(v3(3, 0, 10))
self.camera.look_at(v3(0, 0, 0))
然后使用
将相机同步到播放器(只是另一个Spatial
)
def updateCamera(self):
up = v3(*self.player.get_world_up())
position = v3(*self.player.get_position())
position += (v3(*self.player.get_world_forward()) * -10.0)
position += (up * 3.0)
self.camera.set_position(position)
self.camera.set_orientation(self.player.get_orientation())
鼠标事件影响玩家
def on_mouse_motion(self, x, y, dx, dy):
self.player.yaw(-dx * 0.005)
self.player.pitch(dy * 0.005)
然后在绘制时将相机矩阵传递给顶点着色器
def on_draw(self, renderer, t, dt):
...
matC = camera.get_camera_matrix()
renderer.set_shader_mat44('matC', matC)
...
顶点着色器通过将 C 与当前模型视图矩阵左乘来处理实际的顶点变换。
这不适合胆小的人:)