Opengl创建3d长方体而不是简单的三角形 我用C++编写了下面的代码,使用OpenGL库,它给了我一个简单的三角形(屏幕)(2D)< /P>
如何更改渲染函数中的代码以编写3d长方体或基本体对象 代码如下:Opengl创建3d长方体而不是简单的三角形 我用C++编写了下面的代码,使用OpenGL库,它给了我一个简单的三角形(屏幕)(2D)< /P>,c++,opengl,C++,Opengl,如何更改渲染函数中的代码以编写3d长方体或基本体对象 代码如下: #include <iostream> #include <GLUT/GLUT.h> #include <OpenGL/OpenGL.h> void render(void); int main(int argc, char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT
#include <iostream>
#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>
void render(void);
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(800,600);
glutCreateWindow("Welcome");
glutDisplayFunc(render);
glutMainLoop();
return 0;
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(0.0,1.0,0.0);
glVertex2f(-0.5, -0.5);
glColor3f(1.0,0.0,0.0);
glVertex2f(0.5,0.0);
glColor3f(0.0,0.0,1.0);
glVertex2f(0.0,0.5);
glEnd();
glutSwapBuffers();
}
#包括
#包括
#包括
无效渲染(无效);
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGBA | GLUT_深度);
位置(100100);
glutInitWindowSize(800600);
“欢迎”窗口;
glutDisplayFunc(渲染);
glutMainLoop();
返回0;
}
无效渲染(无效)
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glBegin(GL_多边形);
GL3F(0.0,1.0,0.0);
glVertex2f(-0.5,-0.5);
GL3F(1.0,0.0,0.0);
glVertex2f(0.5,0.0);
GL3F(0.0,0.0,1.0);
glVertex2f(0.0,0.5);
格伦德();
glutSwapBuffers();
}
如果您只想显示一个简单的多维数据集,请查看“glutSolidCube”(以及其他“glutSolidABC”函数):
但是,在显示三维对象时,必须设置投影矩阵、世界矩阵(“查看器”或“摄影机”的变换),如果要变换对象,还必须为每个对象设置模型矩阵
可以在“教程->glut”部分找到一些好的kickstart课程
如果要创建自己的网格(立方体、球体等),必须编写包含顶点和索引的网格或曲面类。当rendercall出现时,这个类必须绘制它的所有顶点和三角形-你的立方体/球体/等等。作为Denis答案的后续 如果您愿意学习更多的OpenGL(如果您只想绘制一个立方体,可能需要更高的要求…),下面是我在进行小演示时重用的代码。它使用顶点数组+缓冲区对象,并创建一个以(0,0,0)为中心的纹理矩形棱柱。您需要提供自己的纹理 生成矩形棱镜的代码为:
void GLmakeRect(GLuint vao, GLuint vbo[2], float w, float h, float d, GLuint storageHint) {
/*
8|---|9
0|BAC|1
10|---|---|---|12
|LEF|TOP|RIG|
11|---|---|---|13
3|FRO|2
4|---|5
|BOT|
6|---|7
*/
float verts[] = {
-0.5*w, 0.5*h, -0.5*d, 1.0/3.0, 0.25,
0.5*w, 0.5*h, -0.5*d, 2.0/3.0, 0.25,
0.5*w, 0.5*h, 0.5*d, 2.0/3.0, 0.5,
-0.5*w, 0.5*h, 0.5*d, 1.0/3.0, 0.5,
-0.5*w, -0.5*h, 0.5*d, 1.0/3.0, 0.75,
0.5*w, -0.5*h, 0.5*d, 2.0/3.0, 0.75,
-0.5*w, -0.5*h, -0.5*d, 1.0/3.0, 1.0,
0.5*w, -0.5*h, -0.5*d, 2.0/3.0, 1.0,
-0.5*w, -0.5*h, -0.5*d, 1.0/3.0, 0.0,
0.5*w, -0.5*h, -0.5*d, 2.0/3.0, 0.0,
-0.5*w, -0.5*h, -0.5*d, 0.0, 0.25,
-0.5*w, -0.5*h, 0.5*d, 0.0, 0.5,
0.5*w, -0.5*h, -0.5*d, 1.0, 0.25,
0.5*w, -0.5*h, 0.5*d, 1.0, 0.5
};
int polys[] = {
0, 3, 1, 1, 3, 2, // TOP
3, 4, 2, 2, 4, 5, // FRONT
4, 6, 5, 5, 6, 7, // BOTTOM
8, 0, 9, 9, 0, 1, // BACK
10, 11, 0, 0, 11, 3, // LEFT
1, 2, 12, 12, 2, 13 // RIGHT
};
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts[0], storageHint);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float)));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(polys), &polys[0], storageHint);
}
您可以在初始化过程中调用如下函数:
GLuint vao, vbo[2]
glGenVertexArrays(1, &vao);
glGenBuffers(2, &vbo[0]);
GLmakeRect(vao, vbo, 1, 1, 1, GL_STATIC_DRAW);
要在渲染循环中绘制立方体,请执行以下操作:
glBindTexture(GL_TEXTURE_2D, yourTextureHandleHere);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
OpenGL不是一个实用工具工具箱,如果你想绘制原语,你需要将它们描述为三角形的集合。。。或者,您也可以使用各种许可证提供的众多3D引擎之一。