2014-11-04 7 views
0

glTranslate/glRotate를 사용하여 카메라를 코딩하려고합니다. look-up/look-down 함수를 구현하기 위해 렌더링 공간의 모든 객체가 원점과 다른 점 (즉, "카메라"가있는 점)을 중심으로 회전해야합니다. 여전히 사물은 원점을 중심으로 회전합니다. 다른 점을 지정하는 방법이 있습니까?원점과 다른 점을 중심으로 회전


편집 : 추가 된 코드를 귀하의 빠른 회신

감사합니다. 어떤 일이 있어도 제대로 작동하지 않을 것 같아서 코드를 추가하기로 결정했습니다. 나는 누군가가 그것에 대해 살펴보고 번역/회전/번역하기 위해 어떤 변화가 필요한지 말해 주시면 감사하겠습니다.

#include <iostream> 
#include <cmath> 
#include <GLUT/GLUT.h> 

const double roaming_step = .13; 
double z_offset = .0; 
double y_offset = .0; 
double x_offset = .0; 

const double angle_step = 1.5; 
double angle_xz = .0; 
double angle_yz = .0; 

bool keyStates[256] = { false }; 

void drawFloor() 
{ 
    glColor3f(1.0, 1.0, 1.0); 

    glBegin(GL_QUADS); 
     glVertex3f(-3.0, -1.0, 3.0); 
     glVertex3f(-3.0, -1.0, -3.0); 
     glVertex3f(3.0, -1.0, -3.0); 
     glVertex3f(3.0, -1.0, 3.0); 
    glEnd(); 
} 

void drawBalls() 
{   
    glTranslatef(-3.0, -.5, -3.0); 
    glColor3f(.8, .1, .1); 

    for(int i = 0; i < 3; i++) 
    { 
     glPushMatrix(); 

     glTranslatef(.0, -.5, i * 3); 

     for(int j = 0; j < 3; j++) 
     { 
      glPushMatrix(); 

      glTranslatef(j * 3, .0, .0); 
      glutSolidSphere(.5, 20, 20); 

      glPopMatrix(); 
     } 

     glPopMatrix(); 
    } 
} 

void keyPressed(unsigned char key, int x, int y) 
{ 
    keyStates[key] = true; 
} 

void keyReleased(unsigned char key, int x, int y) 
{ 
    keyStates[key] = false; 
} 

void keyboardOperations() 
{ 
    if(keyStates['w']) 
     z_offset += roaming_step; 

    if(keyStates['s']) 
     z_offset -= roaming_step; 

    if(keyStates['a']) 
     x_offset += roaming_step; 

    if(keyStates['d']) 
     x_offset -= roaming_step; 

    if(keyStates['i']) 
    { 
     angle_xz -= angle_step; 

     if(angle_xz < .0) 
      angle_xz += 360.0; 
    } 

    if(keyStates['o']) 
    { 
     angle_xz += angle_step; 

     if(angle_xz >= 360.0) 
      angle_xz -= 360.0; 
    } 

    if(keyStates['u']) 
    { 
     angle_yz -= angle_step; 

     if(angle_yz < .0) 
      angle_yz += 360.0; 
    } 

    if(keyStates['j']) 
    { 
     angle_yz += angle_step; 

     if(angle_yz >= 360.0) 
      angle_yz -= 360.0; 
    } 

    if(keyStates['q']) 
     exit(0); 
} 

// I guess it has to be done in this function 
// but didn't get how 
void camera() 
{ 
    glLoadIdentity(); 

    // Forward/Backward 
    glTranslated(.0, .0, z_offset); 

    // Left/Right 
    glTranslated(x_offset, .0, .0); 

    // XZ Rotation 
    glRotated(angle_xz, .0, 1.0, .0); 

    // YZ Rotation 
    glRotated(angle_yz, 1.0, .0, .0); 
} 

void display(void) 
{ 
    keyboardOperations(); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    camera(); 

    drawFloor(); 
    drawBalls(); 

    glutSwapBuffers(); 
} 

void reshape(int width, int height) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glViewport(0, 0, width, height); 

    GLdouble aspect = (GLdouble) width/(GLdouble) height; 
    gluPerspective(60, aspect, 1, 100); 

    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 

    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("openGLtest3"); 
    glClearColor(.0, .0, .0, .0); 

    glEnable(GL_DEPTH_TEST); 
    glShadeModel(GL_FLAT); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutIdleFunc(display); 

    glutIgnoreKeyRepeat(true); 
    glutKeyboardFunc(keyPressed); 
    glutKeyboardUpFunc(keyReleased); 

    glutMainLoop(); 

    return 0; 
} 

답변

2

openGL에서 glRotation fuction은 참조 용으로 원점을 취합니다. 점 (이 경우 카메라 좌표)을 중심으로 회전하려면 카메라 위치를 원점 (모든 객체를 그에 따라 번역)으로 변환 한 다음 회전 기능을 적용해야합니다. 그런 다음 카메라를 모든 객체로 다시 번역 할 수 있습니다 당신이 그것을에서 봐 주시기 바랍니다 수, 나는 몇 가지 코드를 추가

foreach object 
{ 
    glPushMatrix(); 
    glTranslate(a,b,c); 
    glRotate(...); 
    glTranslate(-a,-b,-c); 
    //render 
    glPopMatrix(); 
} 
+0

:)

은 카메라 위치가 (같은 A, B는 C) 그래서 코드가해야 뭔가 말할 수? – pr0gma

+0

이것은 잘못된 순서의 변형입니다. 올바른 순서는 다음을 참조하십시오. http://stackoverflow.com/questions/23442499/rotating-an-object-around-a-fixed-point-using-glmultmatrix/23448400#23448400. –

+0

경고를위한 @RetoKoradi thx. 솔루션을 편집했습니다. –

관련 문제