如何使用鼠标在PyOpenGL中控制相机?

0 python opengl mouse view pyopengl

我们需要在python中制作3D游戏,所以在我的研究中我发现了PyOpenGL.经过一段时间的游戏,我变得难以理解如何移动相机.给我一些示例代码和解释.

Alf*_*ssi 6

PyOpenGL是OpenGL的绑定.您需要使用一些框架来创建窗口并处理窗口事件.在过去,我使用pyglet进行窗口创建/输入处理/声音.这里的其他常见选项包括SDL和pySFML,但实际上有很多.

之后,确定相机应如何工作并使用输入来修改相机属性.一旦你拥有了明确定义的摄像机位置,前移和向上矢量,你就可以将这些东西变成一个矩阵,将你的场景转换成摄像机的视角.

直接使用OpenGL是非常低的水平.您可以自行定义它应该如何工作.

是我的一些使用numpy的代码.您可以使用spatial.py中的接口函数操作相机(将这些功能与鼠标输入事件联系起来)

一旦这些工作,您可以获得相关的矩阵(如numpy数组)

Camera.get_projection_matrix()
Run Code Online (Sandbox Code Playgroud)

Camera.get_camera_matrix()
Run Code Online (Sandbox Code Playgroud)

例如,在我的一个项目中,我用相机初始化相机

def setupView(self):
    self.camera = Camera()
    self.camera.set_position(v3(3, 0, 10))
    self.camera.look_at(v3(0, 0, 0))
Run Code Online (Sandbox Code Playgroud)

然后用相机将相机同步到播放器(另一个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())
Run Code Online (Sandbox Code Playgroud)

鼠标事件会影响播放器

def on_mouse_motion(self, x, y, dx, dy):
    self.player.yaw(-dx * 0.005)
    self.player.pitch(dy * 0.005)
Run Code Online (Sandbox Code Playgroud)

在绘制时,然后将相机矩阵传递到顶点着色器

def on_draw(self, renderer, t, dt):
    ...
    matC = camera.get_camera_matrix()
    renderer.set_shader_mat44('matC', matC)
    ...
Run Code Online (Sandbox Code Playgroud)

并且顶点着色器通过左边将C与当前模型视图矩阵相乘来处理实际的顶点变换.

这不适合胆小的人:)