2009-05-06 70 views
3

我正在構建一個簡單的實體建模應用程序。用戶需要能夠在正交和透視視圖中操作對象。例如,當屏幕上有一個框並且用戶點擊它來選擇它時,它需要在角落和中心獲得'手柄',以便用戶可以將鼠標移動到這樣的手柄上並將其拖動到放大或移動框。在3d視圖中實現操縱手柄的方法

有什麼策略可以做到這一點,哪一個是最好的?我可以想到兩個明顯的:

1)將手柄視爲3d對象。即對於一個盒子,在主盒子的角落處添加小盒子。問題:這不能在透視圖中工作,我需要確定相對於當前縮放級別的框的大小(無論用戶放大/縮小的距離,手柄都需要具有相同的大小)

2)場景渲染後添加手柄。渲染到屏幕外的緩衝區,以某種方式確定角的2d位置,並使用常規2D繪圖技術繪製手柄。問題:我將如何進行測試?我也需要做一個兩階段測試的方法,如何在2D渲染圖像中繪製?回到GDI?

這兩種方法可能存在更多問題。有沒有解決這個問題的行業標準方法?

我正在使用OpenGL,如果這有所作爲。

回答

2

我會把手柄當作3D對象。這提供了許多優點 - 它更一致,它們表現良好,打擊測試很容易,等等。

如果您希望手柄的大小恆定,您仍然可以將它們視爲3D對象,但您必須縮放它們的大小根據距相機的距離而定。這有點麻煩,但由於通常只有少數幾個手柄,而且這些手柄通常都是小物件,所以它應該具有很好的性能。

但是,我真的說讓手柄與場景一起縮放。只要你爲手柄選擇一種渲染風格,使它們脫穎而出(即:明亮的橙色框等),透視效果(背景中的較小手柄)實際上使得在許多方面對最終用戶來說更容易處理它們。從3D場景中獲得深度感很難 - 對手柄的透視效果有助於提供更多視覺線索,以瞭解手柄如何「深入」屏幕。

+0

我看到你的觀點,增加視覺線索的角度。儘管這對用戶來說很自然,但我還不確定。例如那些被其他物體夾住的手柄呢?我將研究一些其他3d建模者,看看他們是如何做到的,並在我的測試應用程序中嘗試這兩種方法。感謝您花時間回答。 – Roel 2009-05-07 10:08:45

+0

一種選擇是允許透視留下,但在深度測試關閉的情況下呈現這些。它們將始終可見(即使在其他對象之上)。我不會將其設爲默認方式,但這是一個不錯的選擇,所以您可以切換開/關是否始終顯示手柄,即使是「通過」對象。 – 2009-05-07 15:45:11

+0

我仍然需要找出如何與深度緩衝區一模一樣,但我認爲這是可行的。我有很多試用和錯誤之前:)謝謝。 – Roel 2009-05-07 17:38:01

1

首先,項目手柄/頂點座標到相機的平面(有效把它們轉換成二維座標在屏幕上;規範這對屏幕尺寸)

下面是一些簡單的代碼,以使正交/ 2D-覆蓋附圖中:

void enable2D() 
{ 

    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    int wind[4]; 
    glGetIntegerv(GL_VIEWPORT,wind); 
    glOrtho(0,wind[2],0,wind[3],-1,1); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 
} 


void disable2D() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
} 

enable2D()緩存的當前模型視圖/投影矩陣和一個歸一化至屏幕替換投影矩陣(即,屏幕的寬度/高度),並恢復爲模型視圖單位矩陣。

完成此調用後,您可以使用屏幕/像素座標進行glVertex2f()調用,從而允許您繪製2D! (這也可以讓你進行點擊測試,因爲你可以輕鬆獲得鼠標當前的像素座標。)

當你完成後,調用disable2D恢復舊模型視圖/投影矩陣:)

最難的部分是計算在hitboxes落在2D平面和處理覆蓋(如果兩個項目的同一個地方,這在選擇上點擊?)

希望這有助於:)

1

我編寫了手柄的3D編輯包裝機械手,跑進了很多這些相同的問題。

首先,有一個開源的機械手。我在最近的搜索中找不到它,可能是因爲這些東西有很多名字--3D部件,小玩意,操縱器,萬向節等等。

無論如何,我這樣做的方式是添加一個操縱器反對在繪製時繪製所有句柄的場景。它對邊界框計算和選擇做同樣的事情。

裏德關於保持它們相同大小的想法對於存在於對象上的句柄很有意思,並且可能在那裏工作。對於一個操縱器,我發現它更像是一個3d UI元素,如果它不改變大小,它就更加可用。我有一個bug,其大小隻是基於活動視口確定的,這導致了其他視口中可怕的巨大/微小的操縱器,非常無用。如果您要將它們添加到場景中,您可能希望將它們添加到每個視口,或者使它們實際上具有固定大小。