2015-08-21 23 views
1

我有一個特定的模型,可以在查看器中充當控件。用戶可以點擊它的不同部分來對查看器中的另一個模型執行轉換(如Unity或Blender等應用程序中的控件/控制柄)。呈現相同尺寸的3D模型,無論相機位置如何

無論如何放大/縮小相機,我們都希望控件保持相同的大小。我試圖根據物體和相機之間的距離縮放它的尺寸,但它不太正確。有沒有完成這樣的事情的標準方式?

控件使用固定管道渲染,但我們有其他組件使用可編程管線。

+0

我不太確定這裏的問題是什麼。我假設你知道視角和正射投影之間的區別?聽起來你所需要的只是後者。 –

回答

-1

最簡單的答案是「使用可編程管線」,因爲它並不難寫

if(normalObject) { 
    gl_Position = projection * view * model * vertex; 
} else { 
    gl_Position = specialMVPMatrix * vertex; 
} 

而你會花更多的代碼,試圖讓這個在固定功能,流水線工作並有更多的CPU週期渲染它。

+0

我不明白爲什麼這與固定功能與可編程管線有關。在這兩種情況下,只是使用不同的矩陣進行渲染,使得着色器中的條件毫無意義。而不是改變'normalObject',矩陣可以直接改變。 – derhass

+0

有一百萬種編程方式。我的代碼只是一個例子。重要的部分是,如果他們堅持使用FFP,那麼調整控件的渲染方式會變得更麻煩。 – Xirema

+0

那麼,我不是在反對着色器(我不是那個低估這個的人)。但在這種特殊情況下,我看不到着色器與固定管道有什麼不同。這只是關於用於渲染的矩陣。 – derhass

0

與固定管道,要做到這一點最簡單的方法是,當你呈現的控件根本就沒有應用任何轉換:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 

// draw controls 

glPopMatrix(); 

glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

glPushMatrix()/glPopMatrix()通話將確保之前的矩陣在恢復此代碼片段的結尾。

根本沒有變換,映射到窗口的座標範圍在兩個座標方向都是[-1.0 .. 1.0]。如果您需要其他任何東西,則可以在開始繪製控件之前應用必要的轉換。

相關問題