Помогите, opengl

1955

Пишу в Visual C++ 2010. При движении камеры изображения накладываются одно на другое. Помогите пожалуйста, где ошибка? Вот основная часть кода:

class Camera{
private:
Point3 eye;
Vector3 u, v, n;
double viewAngle, aspect, nearDist, farDist;
void setModelViewMatrix;
public:
void set(Point3 eye, Point3 look, Vector3 up);
void roll(float angle);
void pitch(float angle);
void yaw(float angle);
void slide(float delU, float delV, float delN);
void setShape(float vAng, float asp, float nearD, float farD);
void Camera :: setShape(float vAng, float asp, float nearD, float farD){
viewAngle = vAng; aspect = asp; nearDist = nearD; farDist = farD;
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(viewAngle, aspect, nearDist, farDist);
glMatrixMode(GL_MODELVIEW);
}
void Camera :: pitch(float angle)
{ // pitch the camera through angle degrees
float cs = cos( angle / 180 * 3.14159265 );
float sn = sin( angle / 180 * 3.14159265 );
Vector3 t(n); // remember old n
n.set(cs*t.x + sn*v.x, cs*t.y + sn*v.y, cs*t.z + sn*v.z );
v.set(-sn*t.x + cs*v.x, -sn*t.y + cs*v.y, -sn*t.z + cs*v.z );
setModelViewMatrix;
}

void Camera :: yaw(float angle){ // yaw the camera through angle degrees
float cs = cos( angle / 180 * 3.14159265 );
float sn = sin( angle / 180 * 3.14159265 );
Vector3 t = u; // remember old n
u.set(cs*t.x + sn*n.x, cs*t.y + sn*n.y, cs*t.z + sn*n.z );
n.set(-sn*t.x + cs*n.x, -sn*t.y + cs*n.y, -sn*t.z + cs*n.z );
setModelViewMatrix;
}


void Camera::slide(float delU, float delV, float delN){
eye.x += delU*u.x + delV*v.x + delN*n.x;
eye.y += delU*u.y + delV*v.y + delN*n.y;
eye.z += delU*u.z + delV*v.z + delN*n.z;
setModelViewMatrix;
}

void Camera::roll(float angle){
float cs = cos(3.14159265/180*angle);
float sn = sin(3.14159265/180*angle);
Vector3 t = u;
u.set(cs*t.x - sn*v.x, cs*t.y - sn*v.y, cs*t.z - sn*v.z);
v.set(sn*t.x + cs*v.x, sn*t.y + cs*v.y, sn*t.z + cs*v.z);
setModelViewMatrix;
}

void Camera :: setModelViewMatrix(void){
float m[16];
Vector3 eVec(eye.x, eye.y, eye.z);
m[0] = u.x; m[4] = u.y; m[8] = u.z; m[12] =-eVec.dot(u);
m[1] = v.x; m[5] = v.y; m[9] = v.z; m[13] =-eVec.dot(v);
m[2] = n.x; m[6] = n.y; m[10] = n.z; m[14] =-eVec.dot(n);
m[3] = 0; m[7] = 0; m[11] = 0; m[15] = 1.0;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m);
}
void Camera:: set(Point3 Eye, Point3 look, Vector3 up){
eye.set(Eye);
n.set(eye.x - look.x, eye.y - look.y, eye.z - look.z);
u.set(up.cross(n;
n.normalize; u.normalize;
v.set(n.cross(u;
setModelViewMatrix;
}

Camera cam;

void myKeyboard(unsigned char key, int x, int y){
switch(key){
case 'Q': cam.slide(0, 0, 0.1); break;
case 'Q'-64: cam.slide(0, 0, -0.1); break;
case 'W': cam.pitch(-1.0f); break;
case 'W'-64: cam.pitch(1.0f); break;
case 'E': cam.roll(1.0f); break;
case 'E'-64: cam.roll(-1.0f); break;
case 'R': cam.yaw(1.0f); break;
case 'R'-64: cam.yaw(-1.0f); break;
}
glutPostRedisplay;
}

void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT||GL_DEPTH_BUFFER_BIT);
glutWireTeapot(1.0);
glFlush;
glutSwapBuffers;
}

void main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(50, 50);
glutCreateWindow("abc");
glutKeyboardFunc(myKeyboard);
glutDisplayFunc(myDisplay);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glViewport(0, 0, 640, 480);
//cam.set(4, 4, 4, 0, 0, 0, 0, 1, 0);
cam.set(Point3(8.0f, 7.0f, 4.0f Point3(0.0f, 0.0f, 0.0f Vector3(0.0f, 1.0f, 0.0f;
cam.setShape(30.0f, 64.0f/48.0f, 0.5f, 50.0f);
glutMainLoop;
}

Barbie29

p.s. используй линукс, там все это сделано давно уже

zorin29

Думается мне, вот здесь:
glClear(GL_COLOR_BUFFER_BIT||GL_DEPTH_BUFFER_BIT);

1955

Дописал две строки
 glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);

Все заработало, спасибо!
Оставить комментарий
Имя или ник:
Комментарий: