c++ - 为什么我的二十面体画不出来?

标签 c++ opengl glut

作为引用,我正在使用 this指导。

我已经阅读了几份指南,其中一份几乎能找到我正在寻找的答案。

我正在尝试绘制一个二十面体(球体的近似值),一旦我弄清楚为什么不绘制,我就会将其 segmentation ,这样我就可以从绘制 20 个三角形到 80 个三角形,然后到 320,但目前我只是想画一个有 20 个面的。

我已经调试过了,真的看不出程序有什么问题,所有变量在遇到函数时都有正确的值。

这是我的程序:

#define _USE_MATH_DEFINES
#define X .525731112119133606f
#define Z .850650808352039932f
#define N 0.0f
#include <glut.h>
#include <math.h>
#include <iostream>


using namespace std;


GLsizei winWidth = 1000, winHeight = 1000;

static GLfloat vdata[12][3] = {
    { -X,N,Z },{ X,N,Z },{ -X,N,-Z },{ X,N,-Z },
    { N,Z,X },{ N,Z,-X },{ N,-Z,X },{ N,-Z,-X },
    { Z,X,N },{ -Z,X, N },{ Z,-X,N },{ -Z,-X, N }
};

static GLuint tindices[20][3] = {
    { 0,4,1 },{ 0,9,4 },{ 9,5,4 },{ 4,5,8 },{ 4,8,1 },
    { 8,10,1 },{ 8,3,10 },{ 5,3,8 },{ 5,2,3 },{ 2,7,3 },
    { 7,10,3 },{ 7,6,10 },{ 7,11,6 },{ 11,0,6 },{ 0,1,6 },
    { 6,1,10 },{ 9,0,11 },{ 9,11,2 },{ 9,2,5 },{ 7,2,11 } 
};

double randFrac() {
    return (double)rand() / RAND_MAX;
}

void init(void){
    glClearColor(1.0, 1.0, 1.0, 0.0); // White display window.
}

void drawTriangle(float* v1, float* v2, float* v3) {
    glBegin(GL_TRIANGLES);
        glNormal3fv(v1);
        glVertex3fv(v1);
        glNormal3fv(v2);
        glVertex3fv(v2);
        glNormal3fv(v3);
        glVertex3fv(v3);
    glEnd();
}

void normalize(float v[3]) {
    GLfloat d = sqrt(v[0] * v[0] + v[1] * v[1] + v[1] * v[2]);
    if (!d) {
        cerr << "VECTOR HAS LENGTH OF ZERO";
        return;
    }
    v[0] /= d;
    v[1] /= d;
    v[2] /= d;
}
void subdivide(float* v1, float* v2, float* v3, long depth) {
    GLfloat v12[3],v23[3], v31[3];

    if (!depth) {
        drawTriangle(v1, v2, v3);
        return;
    }

    for (GLint i = 0; i < 3; i++) {
        v12[i] = (v1[i] + v2[i]) / 2.0;
        v23[i] = (v2[i] + v3[i]) / 2.0;
        v31[i] = (v1[i] + v3[i]) / 2.0;;
    }
    normalize(v12);
    normalize(v23);
    normalize(v31);
    subdivide(v1, v12, v31, depth - 1);
    subdivide(v2, v23, v12, depth - 1);
    subdivide(v3, v31, v23, depth - 1);
    subdivide(v12, v23, v31, depth - 1);
}

void drawIcosahedrons() {
    glClear(GL_COLOR_BUFFER_BIT); // Clear display window.
    glColor3f(0.0, 0.0, 1.0); // Set line color to blue.
                              /* Set viewing transformation. */
    gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    for (int i = 0; i < 20; i++) {
        glColor3f(randFrac(), randFrac(), randFrac());  // set sides to random color
        drawTriangle(&vdata[tindices[i][0]][0], &vdata[tindices[i][1]][0], &vdata[tindices[i][2]][0]);
    }
}

void winReshapeFcn(GLint newWidth, GLint newHeight) {
    glViewport(0, 0, newWidth, newHeight);
    glMatrixMode(GL_PROJECTION);
    glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);
}

void main (int argc, char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition (100, 100);
    glutInitWindowSize (winWidth, winHeight);
    glutCreateWindow ("title");
    init();
    glutDisplayFunc (drawIcosahedrons);
    glutReshapeFunc (winReshapeFcn);
    glutMainLoop();
}

最佳答案

对不起大家,我忘了 glFlush();画完之后。

关于c++ - 为什么我的二十面体画不出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821537/

相关文章:

opengl - GLSL 片段着色器输出类型

c++ - OpenGL/GLUT 使乘坐顺畅的简单问题

c++ - 如何正确扩展接口(interface)?

c++ - 程序不会退出 do-while 循环

c++ - 无效的静态转换

c++ - 获取当前像素后面的像素

c++ - 鼠标移动opengl

c++ - 出现随机 ascii 字符

c++ - OpenGL:程序渲染纯白色正方形而不是变换后的正方形

java - 如何停止 3D 转换为 2D 坐标,在另一侧创建 "ghost"坐标?