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

Python 如何使用鼠标在PyOpenGL中控制相机?,python,opengl,view,mouse,pyopengl,Python,Opengl,View,Mouse,Pyopengl,我们需要用python制作一个3D游戏,所以在我的研究中,我发现了PyOpenGL。在玩了一会儿之后,我对如何移动相机感到困惑。给我一些示例代码和解释。PyOpenGL是OpenGL的绑定。您需要使用一些框架来创建窗口和处理窗口事件。在过去,我使用pyglet创建窗口/输入处理/声音。这里的其他常见选项包括SDL和pySFML,但实际上有很多 在此之后,决定相机应该如何工作,并使用输入修改相机属性。一旦你为相机定义好了位置、向前和向上向量,你就可以把这些东西变成一个矩阵,把你的场景转换成相机的视

我们需要用python制作一个3D游戏,所以在我的研究中,我发现了PyOpenGL。在玩了一会儿之后,我对如何移动相机感到困惑。给我一些示例代码和解释。

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

在此之后,决定相机应该如何工作,并使用输入修改相机属性。一旦你为相机定义好了位置、向前和向上向量,你就可以把这些东西变成一个矩阵,把你的场景转换成相机的视点

直接使用OpenGL是非常低级的。这完全取决于您如何定义它应该如何工作

这里有一些使用numpy的。您可以使用spatial.py中的界面函数操纵相机(将这些函数与鼠标输入事件关联起来)

一旦这些工作完成,您就可以使用

例如,在我的一个项目中,我使用

def setupView(self):
    self.camera = Camera()
    self.camera.set_position(v3(3, 0, 10))
    self.camera.look_at(v3(0, 0, 0))
然后将相机与播放器同步(只是另一个
Spatial

鼠标事件会影响玩家

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与当前modelview矩阵左乘来处理实际的顶点变换


这不是为胆小鬼准备的:)

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

在此之后,决定相机应该如何工作,并使用输入修改相机属性。一旦你为相机定义好了位置、向前和向上向量,你就可以把这些东西变成一个矩阵,把你的场景转换成相机的视点

直接使用OpenGL是非常低级的。这完全取决于您如何定义它应该如何工作

这里有一些使用numpy的。您可以使用spatial.py中的界面函数操纵相机(将这些函数与鼠标输入事件关联起来)

一旦这些工作完成,您就可以使用

例如,在我的一个项目中,我使用

def setupView(self):
    self.camera = Camera()
    self.camera.set_position(v3(3, 0, 10))
    self.camera.look_at(v3(0, 0, 0))
然后将相机与播放器同步(只是另一个
Spatial

鼠标事件会影响玩家

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与当前modelview矩阵左乘来处理实际的顶点变换


这不是为胆小鬼准备的:)

哇,谢谢,我没想到会有这么快的反应。我会试试你的代码:)哇,谢谢,我没想到会有这么快的反应。我将试用您的代码:)