我想通过将球体投影到屏幕上来绘制椭圆形(如光栅化)。这是我的代码,但屏幕上什么都没有显示。我应该使用更多功能来初始化投影吗?这样可以通过使用球体在屏幕上绘制椭圆形吗?

GLfloat xRotated, yRotated, zRotated;
GLdouble radius=1;

void display(void);
void reshape(int x, int y);

int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(800,800);
    glutCreateWindow("OVAL");
    zRotated = 30.0;
    xRotated=43;
    yRotated=50;
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

void display(void)
{
    glMatrixMode(GL_PROJECTION);
    glOrtho(0.1, 1.0, 0.1, 1.0, -1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-5.0);
    glColor3f(0.9, 0.3, 0.2);
    glRotatef(xRotated,1.0,0.0,0.0);
    glRotatef(yRotated,0.0,1.0,0.0);
    glRotatef(zRotated,0.0,0.0,1.0);
    glScalef(1.0,1.0,1.0);glutSolidSphere(radius,20,20);
    glFlush();
    }

void reshape(int x, int y)
{
    if (y == 0 || x == 0) return;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(39.0,(GLdouble)x/(GLdouble)y,0.6,21.0);
    glMatrixMode(GL_MODELVIEW);
    glViewport(0,0,x,y);
}

最佳答案

您正在视口之外完全绘制一个球体,因此看不到它也就不足为奇了。

您的代码有几个问题:


glLoadIndentityglLoadMatrix之外的所有OpenGL矩阵函数始终将矩阵后乘以当前矩阵堆栈的当前顶部元素。在display函数中,调用glOrtho之前无需将投影矩阵重置为恒等。如果多次调用display回调,将导致完全不同的结果。

您应该在呼叫glLoadIdentity()之前立即向glOrtho添加呼叫。
您可以设置模型视图转换,以使球体的中心始终位于眼空间的(0,0,-5)处。但是,您设置了一个投影矩阵,该矩阵定义了在眼部空间中从z=1(近平面)到z=-1(远平面)的查看体积,因此您的笔尖实际上位于远平面之后。

有几种方法可以解决此问题。最简单的方法是通过修改glOrtho的参数来更改视锥。例如,您可以尝试(-2, 2, -2, 2, 1, 10)来查看球体。
目前还不清楚


  我想通过将球体投影到屏幕上来绘制椭圆形(如光栅化)。


确切的意思。如果只希望球体变形为椭圆形,则可以应用一些非均匀缩放。原则上,这可以在投影矩阵中完成(如果没有其他对象要显示),但是将其应用于球体的模型矩阵更有意义-您已经在其中调用了glScale可以尝试类似glScalef(1.0f, 0.5f, 1.0f);的方法。

还要注意,如果您的视口不完全是正方形,那么我先前建议的正交参数会导致一些变形。在现实世界中,人们希望将视口的宽高比合并到投影矩阵中。

如果要看到球体由于透视投影而变形,则必须跳过glOrtho测高仪并切换到透视投影矩阵。
您使用的代码已经完全过时了。 OpenGL矩阵堆栈已在OpenGL 3.0(2008)中弃用,并且在现代OpenGL的核心配置文件中不可用。内置顶点属性(例如glColor或即时模式绘图和客户端顶点数组)也是如此。结果,GLUT的绘图功能也不能再与现代GL一起使用。

如果您现在真的打算学习OpenGL,我强烈建议您不要理会这种古老的知识和技巧,以现代方式学习。

关于c++ - 在Opengl中用球形绘制椭圆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34395257/

10-11 22:44
查看更多