gpt4 book ai didi

c++ - 使用 OpenGL 绘制随机点/星星?

转载 作者:太空狗 更新时间:2023-10-29 20:08:52 34 4
gpt4 key购买 nike

我正在尝试绘制一些随机点作为窗口中的星星,但积分没有显示。但其他对象显示正确。

我的源代码:

#include<windows.h>
#include <GL\glut.h>
#include <math.h> // For math routines (such as sqrt & trig).
GLfloat xRotated, yRotated, zRotated;
GLdouble radius=3;

GLfloat qaBlack[] = {0.0, 0.0, 0.0, 1.0}; //Black Color
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0}; //Green Color
GLfloat qaWhite[] = {1.0, 1.0, 1.0, 1.0}; //White Color
GLfloat qaRed[] = {1.0, 0.0, 0.0, 1.0}; //Red Color

// Set lighting intensity and color

GLfloat qaSpecularLight[] = {1.0, 1.0, 1.0, 1.0};
GLfloat emitLight[] = {0.9, 0.9, 0.9, 0.9};
GLfloat Noemit[] = {0.0, 0.0, 0.0, 1.0};

// Light source position

GLfloat qaLightPosition[] = {1, 1, 1, 1};

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

void idleFunc(void)
{
if ( zRotated > 360.0 ) {
zRotated -= 360.0*floor(zRotated/360.0); // Don't allow overflow
}

if ( yRotated > 360.0 ) {
yRotated -= 360.0*floor(yRotated/360.0); // Don't allow overflow
}
zRotated += 0.05;
yRotated +=0.01;

display();
}

void initLighting()
{

// Enable lighting
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);

}




void display(void){






glMatrixMode(GL_MODELVIEW);
// clear the drawing buffer.
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// clear the identity matrix.
glLoadIdentity();



glTranslatef(0.0,0.0,-40.0);

glPushMatrix();

glutSolidSphere(radius,25,25);

glPopMatrix();



glPopMatrix();


glPushMatrix();

glRotatef(yRotated,0.0,2.0,0.0);
glTranslatef(5.0,0.0,0.0);

// Set the light position
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emitLight); // Make sphere glow (emissive)
glutSolidSphere(radius/6,25,25);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Noemit);

glPopMatrix();

glTranslatef(0.0,0.0,0.0);


glPushMatrix();

glColor3f(1.0, 1.0, 1.0);
glPointSize(3);
for(int i=1;i<100;i++){
int x = rand()%640 ;
int y = rand()%480;
glBegin(GL_POINTS);
glVertex2i (x,y);
glEnd();
}

glPopMatrix();

glLoadIdentity();

glColor3f(1.0, 1.0, 1.0);
glPointSize(3);
for(int i=1;i<100;i++){
int x = rand()%640 ;
int y = rand()%480;
glBegin(GL_POINTS);
glVertex2i (x,y);
glEnd();
}


glFlush(); //FOR RENDERING
glutSwapBuffers();
}

void reshape(int x, int y){
if(y == 0 || x == 0) return;
glMatrixMode(GL_PROJECTION);

gluPerspective(20.0,(GLdouble)x/(GLdouble)y,0.6,40.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y); //Use the whole window for rendering
}


int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowSize(1000,600);
glutCreateWindow("Project_KD");
initLighting();

xRotated = yRotated = zRotated = 0.0;

glutIdleFunc(idleFunc);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

最佳答案

很多不可靠:

  • 不匹配的 glPushMatrix()/glPopMatrix() 调用的几个实例;避免矩阵堆栈溢出/不足;我喜欢使用额外的范围来直观地指示矩阵堆栈嵌套。
  • 您的点画采用正射投影,而您只设置了透视投影。
  • 您在尝试绘制点时启用了照明,导致除左下角以外的所有地方都非常暗。
  • 由于某种原因,您的点绘制循环重复了;如果您想要双星,请调整 for 循环结束值而不是复制粘贴循环。
  • 你应该使用glutPostRedisplay()在你的空闲回调中而不是调用 display()直接。
  • 每次通过 display() 设置您的投影/模型 View 矩阵而不是在调整大小回调中设置它们;有助于减少神秘矩阵错误的来源。默认调整大小回调调用 glViewport()为您提供,因此您不必担心这样做。
  • 您要在 3D 球体之后绘制点(“星星”?);我想我的意图是先画它们,这样它们就在“下面”。
  • 乱七八糟的代码格式;推荐类似 clang-format 的东西保持检查。
  • 如果您在 Windows 上使用 FreeGLUT(您应该这样做;它实际上是唯一保留的 GLUT 实现),则不需要 #include <Windows.h> .
  • 建议使用计时器回调而不是空闲回调来更新您的模拟/动画。如果没有 vsync,空闲回调将难以置信地经常被调用。通过计时器回调,您可以模拟 vsync 系统为您提供的偶数 ~16 毫秒帧。

一起:

screen capture

#include <GL/glut.h>
#include <cmath>

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

void timer( int value )
{
if( zRotated > 360.0 )
{
zRotated -= 360.0 * floor( zRotated / 360.0 ); // Don't allow overflow
}

if( yRotated > 360.0 )
{
yRotated -= 360.0 * floor( yRotated / 360.0 ); // Don't allow overflow
}

zRotated += 5.0;
yRotated += 1.0;

glutTimerFunc( 16, timer, 0 );
glutPostRedisplay();
}

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

glDepthMask( GL_FALSE );
glDisable( GL_DEPTH_TEST );
glDisable( GL_LIGHTING );

// 2D rendering
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 640, 0, 480, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glPushMatrix();
{
glColor3f( 1.0, 1.0, 1.0 );
glPointSize( 3 );
glBegin( GL_POINTS );
for( int i = 1; i < 100; i++ )
{
int x = rand() % 640;
int y = rand() % 480;
glVertex2i( x, y );
}
glEnd();
}
glPopMatrix();


glDepthMask( GL_TRUE );
glEnable( GL_DEPTH_TEST );

// Enable lighting
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
GLfloat qaSpecularLight[] = {1.0, 1.0, 1.0, 1.0};
glLightfv( GL_LIGHT0, GL_SPECULAR, qaSpecularLight );

// 3D rendering
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
gluPerspective( 20.0, w / h, 0.1, 80.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0, 0.0, -40.0 );

glPushMatrix();
{
glutSolidSphere( radius, 25, 25 );
}
glPopMatrix();

glPushMatrix();
{
glRotatef( yRotated, 0.0, 2.0, 0.0 );
glTranslatef( 5.0, 0.0, 0.0 );
GLfloat qaLightPosition[] = {1, 1, 1, 1};
glLightfv( GL_LIGHT0, GL_POSITION, qaLightPosition );
GLfloat emitLight[] = {0.9, 0.9, 0.9, 0.9};
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emitLight ); // Make sphere glow (emissive)
glutSolidSphere( radius / 6, 25, 25 );
GLfloat Noemit[] = {0.0, 0.0, 0.0, 1.0};
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, Noemit );
}
glPopMatrix();

glutSwapBuffers();
}

int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowSize( 1000, 600 );
glutCreateWindow( "Project_KD" );

xRotated = yRotated = zRotated = 0.0;

glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0 );
glutMainLoop();
return 0;
}

关于c++ - 使用 OpenGL 绘制随机点/星星?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852500/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com