如何使用 opengl 函数制作 3D window 以在 c 中绘制 3D 点?
How to make a 3D window for drawing 3D points in c using opengl functions?
我可以制作 2D window 并绘制点、线等。我想制作 3D window 以便我可以通过绘制 3D dots/lines(例如 glVertex3d (x,y,z))(类似于 2D glVertex2d(x,y))。
但我无法制作 3D window。我只想制作一个 3D window 给我一个绘制 3D 点的平台。
我的 2D 示例代码 window -
#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
。
- 可以使用
gluPerspective()
(或glFrustum()
)设置透视投影矩阵
- 然后
gluLookAt()
将 "camera" 推离原点,以便您可以看到所画的内容
- 还有一些基于计时器的动画,这样您就可以看到实际的视角
- 双缓冲,因为
GLUT_SINGLE
在现代复合 window 管理器上有时很奇怪
总计:
#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();
}
我可以制作 2D window 并绘制点、线等。我想制作 3D window 以便我可以通过绘制 3D dots/lines(例如 glVertex3d (x,y,z))(类似于 2D glVertex2d(x,y))。
但我无法制作 3D window。我只想制作一个 3D window 给我一个绘制 3D 点的平台。
我的 2D 示例代码 window -
#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
。
- 可以使用
gluPerspective()
(或glFrustum()
)设置透视投影矩阵 - 然后
gluLookAt()
将 "camera" 推离原点,以便您可以看到所画的内容 - 还有一些基于计时器的动画,这样您就可以看到实际的视角
- 双缓冲,因为
GLUT_SINGLE
在现代复合 window 管理器上有时很奇怪
总计:
#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();
}