2014-11-04 88 views
0

我試圖用glTranslate/glRotate編碼相機。爲了實現查找/查看功能,我需要渲染空間中的所有對象圍繞一個點(也就是「攝像頭」所在的位置)旋轉,這個點通常與原點不同。儘管如此,事情仍圍繞原點旋轉。有沒有辦法指定不同的點?圍繞與原點不同的點旋轉


編輯:添加代碼

感謝您的快速回復。看起來,無論如何我都無法正常工作,所以我決定添加我的代碼;如果有人能夠看一下它並告訴我爲了翻譯/旋轉/翻譯回來需要進行哪些更改,我非常感謝。

#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功能以原點爲參考。爲了圍繞一個點旋轉(在這種情況下你的相機座標),你應該把你的相機位置翻譯成原點(相應地翻譯你的所有物體),然後應用旋轉功能。然後你可以將你的相機翻轉回來(用你的所有物體)

可以說,你的相機位置(A,b,C)所以你的代碼應該是這樣的:

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

我添加了一些代碼,你可以請看看嗎? – pr0gma 2014-11-04 20:24:44

+0

這是轉換的錯誤順序。看到這個正確的順序:http://stackoverflow.com/questions/23442499/rotating-an-object-around-a-fixed-point-using-glmultmatrix/23448400#23448400。 – 2014-11-05 04:22:22

+0

@ReetoKoradi thx for warning.I編輯解決方案 – 2014-11-08 12:20:10