在其一侧显示 glutSolidCone

Posted

技术标签:

【中文标题】在其一侧显示 glutSolidCone【英文标题】:Show glutSolidCone on its side 【发布时间】:2019-03-28 11:21:07 【问题描述】:

我正试图从上方看一个侧卧的圆锥体。为此,我编写了以下代码:

void display(void)
   
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(250, 250, 0);
    glRotatef(90, 1, 0, 0);
    glutSolidCone(20, 20, 20, 20);
    glTranslatef(-250, -250, 0);
    glRotatef(-90, 1, 0, 0);

    glFlush();
    glutSwapBuffers(); 


int main(int argc, char **argv)

    float x, y;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Cone");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutMotionFunc(drag);
    glutMouseFunc(click);
    glutSpecialFunc(catchKey);   

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();         
    return 0;

我平移到屏幕中间,然后绕 x 轴旋转 90 度,在我的想法中,这应该会在其一侧产生圆锥。然而,结果不是一个圆锥,而是一条不是倾斜 90 度而是 45 度的线。我应该改变什么才能让锥体按我想要的方式显示?

【问题讨论】:

【参考方案1】:

投影矩阵在哪里?

如果您不设置投影矩阵,则必须在规范化设备空间中设置坐标。在 NDC 中,所有坐标都在 [-1.0, 1.0] 范围内:

例如

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.5, 0.5, 0);
glRotatef(90, 1, 0, 0);
glutSolidCone(1.0, 1.0, 20, 20);
glTranslatef(-0.5, -0.5, 0);
glRotatef(-90, 1, 0, 0);

或者,您可以设置正交投影,将世界坐标 1:1 投影到窗口坐标。投影矩阵可以通过glOrtho设置:

例如

void display(void)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 500.0, 500.0, 0.0, -100.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(250, 250, 0);
    glRotatef(90, 1, 0, 0);
    glutSolidCone(20, 20, 20, 20);
    glTranslatef(-250, -250, 0);
    glRotatef(-90, 1, 0, 0);

    glFlush();
    glutSwapBuffers(); 

投影矩阵描述了从场景上的 3D 点到视口上的 2D 点的映射。在正交投影中,视图空间坐标线性映射到剪辑空间坐标。剪辑空间坐标等于标准化设备坐标。 标准化的设备坐标线性映射到视口矩形。 视口矩形可以由glViewport 定义。最初它由窗口的大小定义。


注意,由glBegin/glEnd 序列和固定函数矩阵堆栈绘制的绘图自几十年以来已被弃用。请参阅 Fixed Function Pipeline 和 Legacy OpenGL。 阅读Vertex Specification 和Shader,了解最先进的渲染方式。

【讨论】:

以上是关于在其一侧显示 glutSolidCone的主要内容,如果未能解决你的问题,请参考以下文章

样式化 SwiperJS 以在任一侧显示部分幻灯片

iOS 让视图UIView 单独显示某一侧的边框线

iOS 让视图UIView 单独显示某一侧的边框线

按下时使用 UIViewAnimationTransitionFlipFromRight 翻转 UIButton 并在“另一侧”显示新按钮

flex布局 一侧固定宽度 一侧自适应

如何在 Flutter Web 中显示 Firebase 存储图像。我有图片网址。显示 URL 而不是图像。但另一侧图像链接已完美完成