在OpenGL中移动3d形状
Moving 3d Shape in OpenGL
我正在用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"是错误的。相反,你有一个"绘制"函数。
所以你要做的很简单:重新绘制场景,但你的几何图形在不同的位置。
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 旋转模型矩阵时的形状失真
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 形状对象的旋转和缩放不正确C++
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 如何绘制自定义形状的元素?
- 如何从 3D 曲面网格中删除自相交三角形?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- CUDA 使用共享内存平铺 3D 卷积实现
- 在 OpenGL 中使用键盘移动 3D 形状,C++
- 射影几何形状 - 使用特征元素在3D中找到平面
- ITK-图像处理,计算3D图像的形状特征
- 使用形状参数时,如何灵活地使用可以处理 2D 和 3D 形状的方法参数
- 缩放 3D 形状(OpenGL 和 C++)
- 在OpenGL中移动3d形状
- 为什么 opengl 不想识别我的 3D 形状的颜色?
- 在CGAL中确定一个点是在3D alpha形状曲面的内部还是外部