2014-04-01 44 views
1

我是openGL的初學者。我目前正在開發一個程序,用於輸入棋盤的寬度和長度。鑑於這些輸入,我想動態地定位我的相機,這樣我就可以看到整個主板。假設我的窗口大小爲1024x768。在3D視圖中動態渲染一個2D板

是否有任何數學公式來計算opengl函數glookat的不同參數使其成爲可能?

我想在董事會上的看法應該是這樣的。

board image

它不一樣,如果董事會太大會讓事情看起來很小的事。這裏最重要的是定位相機的方式,使整個板上的視圖成爲可能

到目前爲止,我絕望地隨機更改我的glookat函數的參數,直到我碰到一個體面的X尺寸寬度和Y尺寸高度。

我gluperpective功能: gluPerspective(70 ,1024/768,1,1000)

我glooatfunction爲40 * 40板

gluLookAt(20, 20, 60, 20, -4, -20, 0, 1, 0);

我怎麼畫我的板(平面):

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 

    glLoadIdentity(); 
    gluLookAt(20, 20, 60, 20, -4, -20, 0, 1, 0); 

    glBindTexture(GL_TEXTURE_2D, texture_sol); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); glVertex3i(width, 0, height); 
    glTexCoord2i(10, 0); glVertex3i(0, 0, height) 
    glTexCoord2i(10, 10); glVertex3i(0, 0, 0); 
    glTexCoord2i(0, 10); glVertex3i(width, 0, 0); 
    glEnd(); 

輸出如下如下:

my board output image http://i59.tinypic.com/51y2ic.png

+0

你試過了什麼?嘗試某些東西時遇到的任何具體問題? – legends2k

+0

到目前爲止,我已經能夠繪製一些東西,並把攝像頭放在上面。它看起來很體面。問題是在整個電路板上進行渲染,我絕望地隨機更改glookat參數,直到我碰到一些不錯的東西。讓我用我的一些工作更新我的問題。 – user1040986

+0

[手冊](http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml)顯示了每個參數。爲了確定價值觀,試着想象(例如,在一張紙上)「棋盤」所在的位置以及相機的位置。例如,將棋盤的中間部分傳送到'LookAt'作爲'center *',並將邊緣作爲'eye *' – Valerij

回答

0

雖然這是寫爲XNA教程,基本技術和數學背後應該延續到OpenGL和你的項目:

Positioning the Camera to View All Scene Objects

另見

OpenGL FAQ

8.070如何自動計算顯示我的整個模型的視圖? (我知道邊界球和向上向量。)

編輯迴應評論問題

邊界球簡直是完全封閉模型的球體。它可以被描述爲:

中心點

甲包圍球,小號,一個點的設定PÑ點由 描述,Ç,和半徑,ř

所以,

P =模型(該板在這種情況下)

c =起源模型的

r =從頂點的原點的距離,在頂點P,離原點最遠

因此,您的主板的Bounding Sphere將由o rigin位置(c)以及從一個角落到原點的距離(r),假設棋盤是正方形,所有點都是等距的。

對於更復雜的模型,您可以使用預先創建的解決方案[1]或實現自己的計算[2] [3]

+0

您(或任何人)對我如何計算我所擁有的飛機的邊界球體有任何建議y常數,等於零)? – user1040986

+0

@ user1040986看我的編輯 – ssell

0

gluLookAt需要2分和載體; eye and center positions and the up vector。最後一個參數沒有問題。前兩個與你的問題有關。

我看到您的棋盤在世界空間正在擴展的正X和Y軸與一些任意的寬度和高度值。例如,讓width = height = 1.0。所以電路板從(0,0),(1,0),(1,1),(0,1);由於棋盤位於Y = 0平面並且對於所有頂點具有相同的值,所以這裏忽略Y值;這些只是(X,Z)值。

現在來gluLookAt就是相機在世界空間和中心是你想要使攝像機可以看(在世界空間)點

說你想要的相機看看我認爲的板的中心,所以

eye = (width/2.0f, 0, height/2.0f); 

現在,你必須把相機定位在它的有利位置。說板上方的地方,但對Z軸正方向,因爲有用戶在哪裏(假設你的世界空間是右撇子和Z軸正方向是朝向觀察者),所以

centre = (width/2.0f, 5.0f, 1.0f); 

由於Z上的最遠點0,我只是再添加一個,稍微比父親稍微多一點。 Y是你想從中看到多少,我只是選擇5.0作爲例子。這些只是我可以提出的任意值,您仍然需要試驗這些值。但我希望你得到了gluLookAt的工作原理。