2011-11-30 25 views
1

我正在WPF中創建應用程序。我使用了很多3DTools。我有一個四面體,裏面有一個立方體。我想在3D方向上移動立方體。我的四面體以(0,0,0)爲中心,使用軌跡球旋轉(以編程方式,我的視口上有一個透明邊框來捕捉事件)。WPF3D如何在平行於攝像機的平面上操作對象

應用程序的用戶認爲移動立方體的更自然的方法是將其始終移動到2D平面(平行於屏幕)。所以,如果我想在屏幕上更深地移動它,例如,我旋轉四面體並將其移動到Y軸上。我認爲這可能是一個很好的解決方案。

我有問題,我希望能幫助解決這個問題:首先,當我移動我的四面體時(軌跡球內),軌跡球看起來像移動所有系統座標。我說這是因爲我爲調試目的繪製軸,而那些軸也在旋轉。但事實並非如此 - 它們正在移動,只是因爲軌跡球內的物體(對吧?)。其實,我認爲軌跡球內部的座標系真的在變化。當我在Y-X軸上移動立方體時,我表現良好。但是,如果我稍微轉動一下,並嘗試在Z軸上移動,則會看到它變大(靠近相機)和變小(遠離相機)。 =(

所以我的問題是如何界定,這將不會被軌跡球?被旋轉平面對於我來說,答案看起來像「OK,只是把它定義軌跡球之外」,但正如我說(和3DTools文檔說)我有一個邊界在我的視口...所以我不知道如何處理這個。

我的tetraedron在一組ScreenSpaceLines3D。我將不得不保持立方體在裏面。我的第二個問題是如何追蹤旋轉的四面體頂點的位置?當Position屬性給我原來的位置而沒有別的東西時,我真的很失望,我應該保持矩陣變換並應用當我需要時,我的觀點?

對不起長文本,但我真的堅持在這個沒有那麼多編程問題。我在WPF中知道,我仍然有一些概念缺乏。

由於提前,

佩德羅

+0

出於好奇,爲什麼這3DTools而不是OpenGL? –

+0

WPF,而不是OpenGL,被用於(據說)更簡單和更輕。他們已經有了.NET Forms應用程序,只需要一個組件。該團隊在WinForms中有經驗,但沒有3D編程。他們發現如果更接近他們所知道的,那麼他們很容易維護後者。是不是我的決定:) 3DTools只是WPF的圖書館 –

+0

@PedroDusso我已經更新了我的答案,以提供更多的細節。請看看並隨意發表評論:-) –

回答

1

我做不軌跡球類似的東西。我只是使用MouseMove事件來移動和定位攝像機,但移動對象也同樣適用。如果你想要的話,我仍然有代碼。

4

我會做的是嘗試製作自己的操縱器(創建新的類來代替3DTools中的TrackBall操縱器)來完成這些操作。例如,在過去,我通過簡單的矩陣/矢量操作來完成縮放/平移,圍繞目標旋轉,自由旋轉,自由移動,旋轉對象,翻譯對象等等。

對於您的示例,您需要做的是計算與Camera-> Target和世界向上矢量之間的平面正交的法線。這將爲您提供一個與攝像機「平行」的矢量,如果您正在查看屏幕,就像本地X軸一樣。使用這個矢量可以限制立方體在這個方向上的運動。

爲此,計算從相機到目標的矢量V.這是通過從攝像機位置減去物體位置來實現的。然後,計算一個矢量向側面平移,如下所示:

鑑於相機的載體來靶向,V = XI,YJ,ZK
規範化矢量,V」 = XI,YJ,ZK/SQRT (ⅹⅰ^ 2 + YJ^2 + ZK^2)
設U =全球世界矢量U = 0,0,1

然後,我們可以計算R =水平向量平行於相機的視圖方向

R = v'^U, where^is the cross product, given by 
a^b = (a2b3 - a3b2)i + (a3b1 - a1b3)j + (a1b2 - a2b1)k 

這會給你一個看起來像這樣的向量。

Cross Product to find vector parallel to camera direction

現在你知道這個向量R,當你左/右移動,你可以使用這個翻譯的對象鼠標。例如,在僞代碼:

// Pseudocode 
onMouseMove() 
{ 
    // Using calculation for R vector above 
    Vector r = calulateVector(); 

    // Assuming passed in the number of points to translate 
    // (or some derivative of mousemove) 
    let int pts = mousePointsMovedLeftOrRight; 

    // Perform a translate in direction of R 
    Vector targetPosition = TargetObject.PositionVector; 
    targetPosition.X += r.X * pts; 
    targetPosition.Y += r.Y * pts; 
    targetPosition.Z += r.Z * pts; 
} 

我在家裏能做到這一點得到了我的筆記本電腦代碼(它的OpenGL,但同樣的原則 - 提供對象和相機在三維空間中的各種操作)。如果您想了解更多信息,請隨時聯繫我/評論。

此致敬禮,

相關問題