c++ - 在 opengl 中应用转换函数后未显示对象

标签 c++ opengl transformation

我想使用 opengl 转换对象绘制花园。起初我已经开始绘制花瓣,我希望它旋转以便创建花,但是当我使用 glRotatef() 时,我再也看不到对象了。 这是我的部分代码:

const float DEG2RAD = 3.14159 / 180;

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 400.0, 0.0, 400.0);
    glMatrixMode(GL_MODELVIEW);
}

void petal(void)
{
    float x, y, z;
    float A = 20;
    float t;

    glColor3f(1.0, 0.0, 0.0);
    glPointSize(2);
    glLoadIdentity();
    glRotatef(90.0, 0.0, 0.0, 0.5);
    glTranslatef(10,10, 0);

    glBegin(GL_POINTS);
    t = 0;
    while (t < 90)
    {
        x = A*sin(2 * t*DEG2RAD)*cos(t*DEG2RAD);
        y = A*sin(2 * t*DEG2RAD)*sin(t*DEG2RAD);
        z = 0;
        glVertex3f(x, y, z);
        t++;
    }
    glEnd();
    glFlush();
}
int main(void)
{
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(200, 100);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Garden");
    init();
    glClear(GL_COLOR_BUFFER_BIT);
    glutDisplayFunc(petal);
    glutMainLoop();
    return 0;
}

最佳答案

我能够编译和测试您的完整代码。错误在于 petal 中的转换顺序:

glRotatef(90.0, 0.0, 0.0, 0.5);
glTranslatef(100,100, 0);

这将首先将花瓣平移到窗口的中心,然后围绕左下角(由 gluOrtho2D 设置的原点)旋转 90°。结果,花瓣飞到了窗外。您只需要交换两个调用:

glTranslatef(100,100, 0);
glRotatef(90.0, 0.0, 0.0, 1.0);

然后花瓣首先围绕原点(即它的尖端)旋转,然后平移到中心。

附带说明一下,您似乎在使用 GLUT 之前忘记调用 glutInit(&argc, argv),我在运行时遇到了一个硬错误。

关于c++ - 在 opengl 中应用转换函数后未显示对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477527/

相关文章:

c++ - C++ 中的有符号整数值溢出?

linux - glUseProgram() GL_INVALID_OPERATION 1282 在 Ubuntu Gnome 17.04 Intel HD4000 上

c++ - 如何在 OpenGL 中应用法线贴图?

c++ - 垂直化三角形

javascript - 描述两组数据之间的转换... "meta-transform"?

c++ vectors - 使用 find(begin, end, term)

c++ - 2种模板类型之间的转换

c++ - 有没有解决 nullptr_t 和指针重载之间歧义的好方法?

c++ - 带有 GLSL 的 OpenGL 中的简单二维矩阵旋转不产生任何输出

javascript - EaselJS、Matrix2D 和包装图像