如何在opengl中按像素移动3D对象

时间:2021-07-27 10:37:36

标签: python opengl pygame pyopengl

我在前面有一个 3d 模型,在背景中有一个图像。我正在尝试按像素移动 3d 模型 (x, y)。但是 glTranslatef 函数将它移到其他一些指标中。
我尝试 glViewport(0, 0, width, height) 然后 glOrtho(x, width, height, y, 0.0, 1.0) 但它使对象 消失。
这是我的代码:

# draw the 3d model

        glViewport(0, 0, width, height)
        
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()

        glOrtho(0.0, width, height, 0.0, 0.0, 1.0)

        gluPerspective(45, (width / height), 0.1, 50.0)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslatef(0, 0, -5)

        glEnable(GL_DEPTH_TEST)
        # reddering the 3d object
        box.render()

1 个答案:

答案 0 :(得分:1)

此答案扩展了@user253751 在上述问题中的最后一条评论:

是的,您将需要三个矩阵 Model, View and Projection 将对象从局部空间转换为 screen coordinates(像素空间)。

OpenGL 转换一般是这样发生的:

World space //Model Matrix --> View Space //View Matrix --> NDC Coordinates (Clip Space) //Projection Matrix --> Screen Coordinates //OpenGL 自动执行此操作

所以要从屏幕坐标(像素坐标)出发,您只需应用这些矩阵的逆。

例如,您在屏幕坐标 (100, 100) 处有一个对象,并且您想将其移动到 (300, 300)

通过逆视图和投影将坐标 (300, 300) 恢复到 3D 世界空间,找到世界空间坐标 (x, y, z),并在那里变换您的对象位置。 (这也称为光线投射

如果没有 MVP 系统设置,您将很难通过像素移动对象。

这是 OpenGL 中 spacecoordinates 上的 good tutorial by LearnOpenGL