如何使用opengl函数制作一个用于在c中绘制3D点的3D窗口?

Posted

技术标签:

【中文标题】如何使用opengl函数制作一个用于在c中绘制3D点的3D窗口?【英文标题】:How to make a 3D window for drawing 3D points in c using opengl functions? 【发布时间】:2018-02-13 16:13:42 【问题描述】:

我可以制作 2D 窗口并绘制点、线等。我想制作一个 3D 窗口,以便我可以通过绘制 3D 点/线来绘制 3D 对象(例如 glVertex3d(x,y,z))(就像 2D glVertex2d(x,y))。

但我无法制作 3D 窗口。我只想制作一个 3D 窗口,为我提供一个绘制 3D 点的平台。

我的二维窗口示例代码 -

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double x_0 = -100;
double y_0 = -25;

double x_1 = 100;
double y_1 = -25;

double x_2 = 100;
double y_2 = 25;

double x_3 = -100;
double y_3 = 25;

void
drawRectangle()

    /* Clear the screen */
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glFlush();

    glBegin(GL_LINES);

    glVertex2d(x_0, y_0);
    glVertex2d(x_1, y_1);

    glVertex2d(x_1, y_1);
    glVertex2d(x_2, y_2);

    glVertex2d(x_2, y_2);
    glVertex2d(x_3, y_3);

    glVertex2d(x_3, y_3);
    glVertex2d(x_0, y_0);

    glEnd();
    glFlush();


void
init(void)

    /*initialize the x-y co-ordinate*/
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-320, 319,-240, 239);
    glClear(GL_COLOR_BUFFER_BIT);

    glFlush();


int
main(int argc, char *argv[])

    double x_0, y_0, x_1, y_1;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(400, 400);

    glutCreateWindow("Rectangle in 2D");
    init();
    drawRectangle();
    glutMainLoop();

我也尝试跟随,但没有显示该行。

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void
init(void)

    /*initialize the x-y co-ordinate*/
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-320, 319, -240, 239, 100, -150);
    glClear(GL_COLOR_BUFFER_BIT);

    glFlush();


int
main(int argc, char *argv[])

    double x_0, y_0, x_1, y_1;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(400, 400);

    glutCreateWindow("Special key");
    init();

    glBegin(GL_LINES);
    glVertex3d(0,0,0);
    glVertex3d(0,0,100);
    glVertex3d(0,100,0);
    glVertex3d(0,100,0);
    glEnd();
    glFlush();

    glutMainLoop();

编辑gluOrtho2D 在上述 MWE 中更新为 glOrtho

【问题讨论】:

什么是 3D 窗口? @NicolBolas 允许绘制 3D 点。(例如 drawpixel(x,y,z)) 为什么你认为这是窗口性质的函数? @NicolBolas 我不关心这个。如果我可以绘制 3D 点就可以了。你可以看到我的 MWE。 @helal 没有 3D 窗口之类的东西。这就是您使用投影矩阵的原因:它定义了 3D 坐标到 2D 窗口内的 2D 坐标的映射。提示:glLoadIdentity(); 不会删除它。 【参考方案1】: 可以使用gluPerspective()(或glFrustum())设置透视投影矩阵 和gluLookAt() 将“相机”从原点移开,这样您就可以看到您绘制的内容 还有一点基于计时器的动画,这样您就可以看到正在运行的透视图 双缓冲,因为 GLUT_SINGLE 在现代复合窗口管理器中有时很奇怪

大家一起:

#include <GL/glut.h>

double rnd( double lo, double hi )

    return lo + ( hi - lo ) * ( rand() / static_cast<double>( RAND_MAX ) );


double angle = 0.0;
void timer( int value )

    angle += 1.0;
    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();


void display()

    glClearColor( 0, 0, 0, 0 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective( 60.0, w / h, 0.1, 1000.0 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt( 100, 100, 100, 0, 0, 0, 0, 0, 1 );

    glRotated( angle, 0, 0, 1 );

    srand( 0 );
    glBegin( GL_LINES );
    for( size_t i = 0; i < 100; i++ )
    
        glColor3d( rnd( 0.0, 1.0 ), rnd( 0.0, 1.0 ), rnd( 0.0, 1.0 ) );
        glVertex3d( rnd( -50, 50 ), rnd( -50, 50 ), rnd( -50, 50 ) );
        glVertex3d( rnd( -50, 50 ), rnd( -50, 50 ), rnd( -50, 50 ) );
    
    glEnd();

    glutSwapBuffers();


int main( int argc, char *argv[] )

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "Special key" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();

【讨论】:

我喜欢你的代码输出。如果您的代码中有一些 cmets,我最好理解一下。我无法理解rnd() 函数的工作。 @helal:只是rand() 的一个包装器,它返回一个在lohi 范围内的随机数。

以上是关于如何使用opengl函数制作一个用于在c中绘制3D点的3D窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL 中绘制圆弧

在 3D 中查找 X、Y 和 Z 轴的角度 - OpenGL/C++

OpenGL ES

如何使用 Horde3d 和 OpenGL 绘制 Qt 小部件?

OpenGL编程 基础篇对象的变换——用实心体绘制3D场景

OpenGL- glDrawElements 只绘制第一个元素