c++ - 在 openGL + SDL 2.0 中绘制四面体

标签 c++ opengl geometry sdl

所以我对 openGL 编程还很陌生,现在只是复习基础知识。我知道我应该使用 VBO 之类的东西,但我想先打一点基础。我不会向您展示所有代码,只展示绘制和设置场景的代码。

这是设置我的相机的一些代码:

glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70, width / height, 1, 1000);
glEnable(GL_DEPTH_TEST);

// Move the camera back to view the scene
glTranslatef(0.0f, 0.0f, -5.0f);

我试着像这样围绕原点创建它(我也从不画底面):

void drawtetrahedron(GLfloat angle)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(angle, 0.0f, 1.0f, 0.0f);

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); //FRONT
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);

glColor3f(0.0f, 1.0f, 0.0f); //RIGHT
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

glColor3f(0.0f, 0.0f, 1.0f); //LEFT
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(0.0f, -1.0f, -1.0f);

glEnd();

}

当我的窗口第一次出现时,红色三角形看起来不错,但当我旋转它时,形状看起来有点变形。如果我一直旋转(我根本看不到红脸的地方),它看起来很正常……我在这里错过了什么?

从这里开始看起来很奇怪

此外,非常感谢任何关于我做错(或一般)的 openGL 事情的指示! :D

最佳答案

我不知道这是否是您认为的奇怪形状,但您的形状似乎不是规则的四面体: 底座的 3 个角与顶角的距离不同(两个前角到顶角的距离为 sqrt(6),而后角的距离为 sqrt(5))。 底座上的距离也偏离了:前角的距离为 sqrt(2),而任何前角和后角之间的距离为 sqrt(3)。

一个正四面体的例子是:

(请注意,这些坐标没有平行于 xz 平面的底面)

(1,1,1)(1,-1,-1)(-1,1,-1)(-1,-1,1)

您的代码本身看起来没问题。 (除了翻译投影矩阵)我自己更喜欢在 push/popmatrix 和 glbegin/end 之后创建代码块(这些东西 { ... }),但这只是为了让我的代码易于阅读。

此外,作为一般经验法则,在 opengl 中您不移动相机:您移动其他一切。 (这就是为什么平移负 z 会使物体远离你,平移正 x 会使它们向右移动等等......)

关于c++ - 在 openGL + SDL 2.0 中绘制四面体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506444/

相关文章:

c++ - 即使调用 InitializeGL() 也无法禁用旧的 OpenGL 灯光

math - 计算由 2 条贝塞尔曲线定义的曲面的边缘点?

vector - 从 3D 平面上的 3D 点检索 2D 坐标

c++ - AtmelATAES132 Mac一代

c++ - 设置标准 :cin to a string

opengl - glActiveTexture 和 glBindTexture 的区别和关系

c++ - 如何告诉 CMAKE 下载一些必要的头文件(更准确地说是 GLM 数学库)而不尝试编译它们?

c++ - 如何确保给定的一组点位于可能正方形的边界上?

c++ - 使用按位运算符消除 IF 语句

c++ - 删除指向 C++ 列表的指针非常非常慢。为什么?