我是OpenGL的新手,我试图用两个三角形制作一个表面。我不知道这个代码在哪里出错了。我知道所有的位置和颜色都进入了三角形类并且正在制作三角形,但它没有输出。有人可以帮忙吗?
我试图获得Triangle类的输出,但它似乎没有工作。我不认为我调用显示功能的方式有任何问题。
代码:
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
#include<iostream>
#include<vector>
using namespace std;
class Triangle
{
public:
float position[9],color[3];
Triangle()
{}
Triangle(float position_t[], float color_t[])
{
for(int i=0;i<9;i++)
{position[i] = position_t[i];}
for(int i=0;i<3;i++)
{color[i]= color_t[i];}
}
void makeTriangle()
{
glBegin(GL_TRIANGLES);
glColor3f(color[0],color[1],color[2]);glVertex3f(position[0],position[1],position[2]);
glColor3f(color[0],color[1],color[2]);glVertex3f(position[3],position[4],position[5]);
glColor3f(color[0],color[1],color[2]);glVertex3f(position[6],position[7],position[8]);
glEnd();}
};
class Mesh
{
public:
/*float center[3],position[9],color[3];
float size;*/
vector<Triangle> elements;
float center[3],position[9],color[3];
float size;
Mesh(){}
Mesh(float center_in[3], float color_in[3])
{
for (int i=0;i<3;i++)
{
color[i] = color_in[i];
center[i] = center_in[i];
}
}
void getPositions()
{
position[0] = 1;position[1] = 1; position[2] = 1;
position[3] = -1;position[4] = -1; position[5] = 1;
position[6] = 1;position[7] = -1; position[8] = 1;
}
void getColor()
{
color[0] = 1; color[1]=0; color[2]=0;
}
static Mesh makeMesh()
{
Mesh a;
a.elements.resize(2);
a.getPositions();
a.getColor();
Triangle T(a.position,a.color);
a.elements[0] = T;
//Triangle O(2);
//a.elements[1] = 0;
return a;
}
};
void render()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Mesh a;
a.elements.resize(2);
a.getPositions();
a.getColor();
Triangle T(a.position,a.color);
//vector<Mesh> m;
//m.push_back(Mesh::makeMesh());
glPushMatrix();
T.makeTriangle();
glPopMatrix();
glFlush();
glutSwapBuffers();
glutPostRedisplay();
}
答案 0 :(得分:2)
正如我在评论中建议你的那样,你没有设置gluLookat()
功能。一切都在被吸引,但你只是没有看到它!
答案 1 :(得分:1)
您的代码未指定任何转换。因此,您的坐标必须位于默认视图体积内,在所有坐标方向上均为[-1,1]。
或者更技术上,模型/视图/投影变换(或者如果使用可编程管道,在顶点着色器中应用的所有变换)将坐标转换为剪辑坐标空间,并在透视后划分为规范化设备坐标(又名NDC)空间。所有坐标的NDC空间范围均为[-1,1]。
如果您不应用任何转换(例如代码中的情况),则您的原始坐标必须位于NDC空间中。
使用您当前的坐标:
position[0] = 1;position[1] = 1; position[2] = 1;
position[3] = -1;position[4] = -1; position[5] = 1;
position[6] = 1;position[7] = -1; position[8] = 1;
所有z坐标的值均为1,这意味着整个三角形位于剪辑体积的边界上。要使其可见,您只需将z坐标设置为0:
position[0] = 1;position[1] = 1; position[2] = 0;
position[3] = -1;position[4] = -1; position[5] = 0;
position[6] = 1;position[7] = -1; position[8] = 0;
这使其在z方向的NDC空间内居中,顶点位于xy平面中的3个角上。因此,您将看到三角形覆盖的窗户的一半,沿对角线将其切成两半。
在OpenGL中,将原始坐标放在不同的坐标空间中,然后应用转换将它们放置在视图体积中,这当然很常见。
你可能已经意识到了这一点,但我认为无论如何我都会提到它:如果你刚刚开始学习OpenGL,我会建议你学习人们常说的内容&# 34;现代OpenGL&#34;。这包括OpenGL核心配置文件或OpenGL ES 2.0或更高版本。您现在使用的调用在较新版本的OpenGL中大部分已弃用,并且在Core Profile和ES中不再可用。现代OpenGL&#34;的最初障碍有点高,特别是因为你必须编写自己的着色器,但是你将会获得仍然是最新的知识。