gpt4 book ai didi

c++ - 创建一个 3d 立方体和弹跳球

转载 作者:太空狗 更新时间:2023-10-29 23:06:34 24 4
gpt4 key购买 nike

我正在用 OpenGL 编写一个程序,我正在绘制一个简单的 3D 立方体,我想添加弹跳球,以便它们在立方体的壁内弹跳,我尝试添加一个球类和以下代码:

 GLfloat WHITE[] = {1, 1, 1};
GLfloat RED[] = {1, 0, 0};
GLfloat GREEN[] = {0, 1, 0};
GLfloat MAGENTA[] = {0, 0, 1};


class Ball {
double radius;
GLfloat* color;
double maximumHeight;
double x;
double y;
double z;
int direction;
public:
Ball(double r, GLfloat* c, double h, double x, double z):
radius(r), color(c), maximumHeight(h), direction(-1),
y(h), x(x), z(z) {
}
void update() {
y += direction * 0.05;
if (y > maximumHeight) {
y = maximumHeight; direction = -1;
} else if (y < radius) {
y = radius; direction = 1;
}
glPushMatrix();
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
glTranslated(x, y, z);
glutSolidSphere(radius, 30, 30);
glPopMatrix();
}
};

Ball balls[] = {
Ball(0.5, GREEN, 7, 6, 1),
Ball(0.5, MAGENTA, 6, 3, 4),
Ball(0.5, WHITE, 5, 1, 7)
};

在显示函数中我添加了这个:

 for (int i = 0; i < sizeof balls / sizeof(Ball); i++) {
balls[i].update();
}

这是我的立方体代码:

void display();
void specialKeys();
double rotate_y=0;
double rotate_x=0;
void display(){

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glRotatef( rotate_x, 1.0, 0.0, 0.0 );
glRotatef( rotate_y, 0.0, 1.0, 0.0 );

glBegin(GL_POLYGON);

glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.5, -0.5, -0.5 ); // P1 is red
glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 0.5, 0.5, -0.5 ); // P2 is green
glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -0.5, 0.5, -0.5 ); // P3 is blue
glColor3f( 1.0, 0.0, 1.0 ); glVertex3f( -0.5, -0.5, -0.5 ); // P4 is purple

glEnd();
glBegin(GL_POLYGON);
glColor3f( 1.0, 1.0, 1.0 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glEnd();

glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glEnd();

glBegin(GL_POLYGON);
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();

glBegin(GL_POLYGON);
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glEnd();*/

glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();

glFlush();
glutSwapBuffers();

}

void specialKeys( int key, int x, int y ) {

if (key == GLUT_KEY_RIGHT)
rotate_y += 5;
else if (key == GLUT_KEY_LEFT)
rotate_y -= 5;

else if (key == GLUT_KEY_UP)
rotate_x += 5;

else if (key == GLUT_KEY_DOWN)
rotate_x -= 5;
glutPostRedisplay();

}
int main(int argc, char* argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Awesome Cube");
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(display);
glutSpecialFunc(specialKeys);
glutMainLoop();
return 0;

}

最佳答案

GLfloat WHITE[] = {1, 1, 1};
...
Ball(0.5, WHITE, 5, 1, 7)
...
color(c)
....
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);

glMaterialfv() :

GL_AMBIENT: params contains four integer or floating-point values

...

GL_DIFFUSE: params contains four integer or floating-point values

...

GL_AMBIENT_AND_DIFFUSE: Equivalent to calling glMaterial twice with the same parameter values, once with GL_AMBIENT and once with GL_DIFFUSE.

编辑:

#include <GL/glut.h>

// http://eigen.tuxfamily.org
#include <Eigen/Core>
using namespace Eigen;

struct PointMass
{
PointMass() : pos(0,0,0), vel(0,0,0) {}
PointMass( const Vector3f& pos )
: pos( pos )
, vel( 0, 0, 0 )
{}

void Integrate( float dt )
{
// "gravity" force vector
Vector3f g( 0, 0, -2 );

// semi-implicit euler
vel = vel + g * dt;
pos = pos + vel * dt;

// collision detection/response
if( pos.z() < 0 )
{
pos.z() = -pos.z();
vel.z() = -vel.z();
}
}

Vector3f pos;
Vector3f vel;
};

GLfloat WHITE[] = {1, 1, 1, 1};
GLfloat RED[] = {1, 0, 0, 1};
GLfloat GREEN[] = {0, 1, 0, 1};
GLfloat MAGENTA[] = {0, 0, 1, 1};

class Ball
{
double radius;
GLfloat* color;
PointMass pm;
public:
Ball(double r, GLfloat* c, const Vector3f& pos )
: radius(r)
, color(c)
, pm( pos )
{ }

void Integrate( float dt )
{
pm.Integrate( dt );
}

void Draw()
{
glPushMatrix();
glColor4fv( color );
glTranslatef( pm.pos.x(), pm.pos.y(), pm.pos.z() );
glutSolidSphere(radius, 30, 30);
glPopMatrix();
}
};

Ball balls[] =
{
Ball( 0.1, GREEN, Vector3f( 1, 1, 2 ) ),
Ball( 0.1, MAGENTA, Vector3f( -1, 1, 1 ) ),
Ball( 0.1, WHITE, Vector3f( 0, -1, 1.5 ) ),
};

double rotate_x = 55;
double rotate_z = 25;
void display()
{
static int last = glutGet(GLUT_ELAPSED_TIME);
int cur = glutGet(GLUT_ELAPSED_TIME);
float dt = ( cur - last ) / 1000.0f;
last = cur;

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, w / h, 0.1, 100 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0, 0, -5 );
glRotatef( -rotate_x, 1.0, 0.0, 0.0 );
glRotatef( -rotate_z, 0.0, 0.0, 1.0 );

// ground
glBegin(GL_QUADS);
glColor3f( 1.0, 0.0, 0.0 );
glVertex2f( -2, -2 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex2f( 2, -2 );
glColor3f( 0.0, 0.0, 1.0 );
glVertex2f( 2, 2 );
glColor3f( 1.0, 0.0, 1.0 );
glVertex2f( -2, 2 );
glEnd();

for (int i = 0; i < sizeof balls / sizeof(Ball); i++)
{
balls[i].Integrate( dt );
balls[i].Draw();
}

glutSwapBuffers();
}

void specialKeys( int key, int x, int y )
{
if (key == GLUT_KEY_RIGHT)
rotate_z += 5;
if (key == GLUT_KEY_LEFT)
rotate_z -= 5;
if (key == GLUT_KEY_UP)
rotate_x += 5;
if (key == GLUT_KEY_DOWN)
rotate_x -= 5;
}

void timer( int extra )
{
// run display() every 16ms or so
glutTimerFunc( 16, timer, 0 );
glutPostRedisplay();
}

int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Awesome Cube");
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(display);
glutSpecialFunc(specialKeys);
glutTimerFunc( 0, timer, 0 );
glutMainLoop();
return 0;
}

关于c++ - 创建一个 3d 立方体和弹跳球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333367/

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