在OpenGL中移动3d形状

Moving 3d Shape in OpenGL

本文关键字:3d 形状 移动 OpenGL      更新时间:2023-10-16

我正在用OpenGL/c++编写一个程序,该程序创建了许多球体,然后将它们靠近屏幕,直到它们消失在视线之外。我知道如何创建球体,但我似乎不知道如何在它们创建后移动它们。有人知道我如何有效地改变move()函数,使它每次调用时都增加z 1吗?或者如果有更好的方法,请告诉我。谢谢!

 class Sphere {
public:
    double x, y, z;
    void create(double newx, double newy, double r, double g, double b) {
        x = newx;
        y = newy;
        z = -175; // start at back of projection matrix
        glPushMatrix();
        glTranslatef(x, y, z);
        glColor3f(r, g, b);
        glScalef(1.0, 1.0, 1.0);
        glutSolidSphere(1, 50, 50);
        glPopMatrix();
    }
    void move() {
        glPushMatrix();
        //if z is at front, move to start over in the back
        if (z >= 0) {
            z = -176;
            x = rand() % 100;
            y = rand() % 100;
            x = x - 50;
            y = y - 50;
        }
        x = x;
        y = y;
        glPushMatrix();
        z++;
        glTranslatef(x, y, z);
        glPopMatrix();
    }
};

为了改变球体的位置,不需要在move()函数中调用glPushMatrix()和glPopMatrix()函数。您可以将move()函数简化为:

    void Move() {
        //if z is at front, move to start over in the back
        if (z >= 0) {
            z = -176;
        }
        z++;
    }

此外,就像用户datenwolf说的,你不创建,但你'绘制'或'渲染'一个球体(或任何你想要OpenGL显示的3D对象)。为了给你一个例子,让我们用渲染。

您需要的是创建一个Render()函数,并将代码从create()函数移动到它。因为您希望稍后移动球体的位置,所以将x、y和z坐标移动到球体的构造函数并初始化它们。

的例子:

 class Sphere {
  public:
    double x,y,z;
    // We also set the color values of the sphere inside the sphere's
    // constructor for simplicity sake.
    double r,g,b;
   Sphere(double _x, double _y, double _z) {
        x = _x;
        y = _y;
        z = _z;
        r = 1.0;
        g = 0.0;
        b = 0.0;
    }
    void Render() {
        glPushMatrix();
        glTranslatef(x, y, z);
        glColor3f(r, g, b);
        glScalef(1.0, 1.0, 1.0);
        glutSolidSphere(1, 50, 50);
        glPopMatrix();
    }
};

OpenGL使用一个叫做glutDisplayFunc()的回调函数。你传递一个函数给这个glutDisplayFunc()来呈现你想要在屏幕上显示的一切。我将调用传递的函数"void Render3DEnvironment()"。你需要找到你的glutDisplayFunc()和传递给它的函数,并在那里调用球体的Render()函数。

下面是一个例子:

#include "Sphere.h"
Sphere* sphere;
void Render3DEnvironment()
{
    sphere->Render();
    sphere->Move();
}
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    sphere = new Sphere(50,50,50);
    glutDisplayFunc(Render3DEnvironment);
    glutMainLoop();
    return 0;
}

glutDisplayFunc()函数将不断调用传递给它的函数,在本例中是Render3DEnvironment()函数。正如您所看到的,Move()函数也在render3denvironment()函数中被调用。这意味着你的球体也在z轴上快速移动,并在z达到等于0或大于0的值时跳回-176。

提示:使用GLfloat而不是double作为x,y,z和r,g,b变量的数据类型,因为OpenGL函数使用GLfloat变量。

在OpenGL中没有"创建模型"。事实上,在OpenGL中甚至没有"模型"。所有的一切,是一个数字画布,称为帧缓冲,和绘图工具提供的OpenGL绘制点,线和三角形,一次一个。在你用OpenGL画东西的那一刻,它已经忘记了它。

因此,将函数命名为"create"是错误的。相反,你有一个"绘制"函数。

所以你要做的很简单:重新绘制场景,但你的几何图形在不同的位置。