簡體   English   中英

OpenGL如何實現自由移動相機?

[英]OpenGL how to implement free moving camera?

我正在嘗試在OpenGL中實現基本的自由移動相機。
我想了解操作,所以我不使用gluLookAt。
我已經嘗試了一些方法,但是沒有按預期工作。

這是我的渲染

// Every frame
glViewport(0, 0, windowWidth, windowHeight); 
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, windowWidth, 0, windowHeight, 0, 40); 

glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 

// camera transforms:
glTranslatef(eye_x, eye_y, eye_z);
glRotatef(x_angular, 0, 1, 0); 

// foreach object:
glPushMatrix();
{
    glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)->anchor[2]);
    glutWireSphere((*obj_i)->r, 15, 15);
}
glPopMatrix();

而我的輸入處理

        // VK_UP
        else if ( (*event_it)->key == 129  ) {
            buffer << " Key press: VK_UP \n";
            eye_z += 1;
        }
        // VK_DOWN
        else if ( (*event_it)->key == 131  ) {
            buffer << " Key press: VK_DOWN \n";
            eye_z -= 1;
        }
        // VK_LEFT
        else if ( (*event_it)->key == 128  ) {
            //eye_x += 10;
            buffer << " Key press: VK_LEFT \n";

            x_angular -= 2;
            //glRotatef(x_angular, 0, 0, 1);
        }
        // VK_RIGHT
        else if ( (*event_it)->key == 130  ) {
            //eye_x -= 10;
            buffer << " Key press: VK_RIGHT \n";

            x_angular += 2;

        }
        else if ( (*event_it)->key == 'i' ) {

        }
        else if ( (*event_it)->key == 'j' ) {
            eye_x += 10;
        }
        else if ( (*event_it)->key == 'k' ) {
            eye_x -= 10;
        }

我正在嘗試做的事情:在z = 0處有3個球體,我想進入(通過它們),然后VK_LEFT(向左轉)做一個180,然后我應該能夠看到這些球體。

不太確定出了什么問題,也許我的輸入處理有誤,或者操作已關閉?

使用glOrtho(0,windowWidth,0,windowHeight,0,40)
z_near是0,z_far = 40對嗎?
如果我在z = 0處繪制並且glTranslate(0,0,-10)我將接近z_far? 並傳遞在z = 0處繪制的內容?

我已經閱讀了很多問答文章和教程,但無法將說明與我的代碼聯系起來。

編輯
這看起來更接近我想要的。 將需要運行更多的測試,我認為可能還會出現一兩個故障。

    glTranslatef(windowWidth/2.0, windowHeight/2.0,-1);
    glRotatef(x_angular, 0, 1, 0);
    glTranslatef(-windowWidth/2.0,-windowHeight/2.0,1);

    glTranslatef(eye_x, eye_y, eye_z);

OpenGL中的平移和旋轉是使用矩陣乘法執行的。 在您使用的固定功能管道中,這些操作不是可交換的,即[T] x [R]不等於[R] x [T]。 在您的代碼中,您將首先進行翻譯,這將更改接下來的旋轉原點。

如果您仔細研究gluLookAt()的實現方式。 攝像機平移需要反轉。 記住平移和旋轉將應用於對象。 OpenGL中沒有像照相機這樣的東西。 我們只需通過將攝影機轉換的逆過程應用於場景即可對其進行仿真。

您將了解這一點的唯一方法是通過學習OpenGL背后的數學知識。 我建議找一本書。

試試下面的代碼。 請記住,我們是在模擬相機,因此請使用glTranslate和glRotate進行逆運算。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// camera transforms:
glTranslatef(-eye_x, -eye_y, -eye_z);
glRotatef(-x_angular, 0, 1, 0); 

// foreach object:
glPushMatrix();
{
    glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)-    >anchor[2]);
    glutWireSphere((*obj_i)->r, 15, 15);
}
glPopMatrix();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM