[英]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.