3D旋轉概念以及計算方法

2022-03-20 12:12:15 字數 4342 閱讀 6954

丹尼爾lehenbauer 

一般人想要做的顯示三維模型後,他們的第一件事是一下就可以用滑鼠旋轉。

通過滑鼠旋轉三維物件最常見的技術被稱為「虛擬軌跡球」。

本文將描述乙個軌跡球做什麼和步行通過實施機制。

在結束示例**的鏈結,用滑鼠在你自己的wpf應用程式,您可以使用旋轉相機。

圖1a

老虎在其原始配置模型

圖1b

虎小鼠模型後一直拖到左略有下降。

軌跡球轉換成三維旋轉的2d滑鼠的移動。

這是通過投影滑鼠的位置上,如圖2所示的假想球落後的viewport3d。

隨著滑鼠移動相機(或場景)旋轉,以保持對滑鼠指標下方領域的相同點。

圖2a

viewport3d的立方體,從使用者的角度來看,落款軌跡球

圖2b

側檢視說明對映到滑鼠的位置,球體上的點

水平移動滑鼠時,必須保持乙個關於y軸的旋轉相同的點下滑鼠指標。

圖3

垂直移動滑鼠旋轉的y軸的場景

同樣,垂直變化中的x軸旋轉的滑鼠位置的結果。

圖4

垂直移動滑鼠繞x軸旋轉場景

此介面提供了乙個比較直觀的方法,其中乙個模型可以操縱通過了關於x和y軸的旋轉組合成任何方向。

在每個滑鼠移動事件中,我們需要計算出乙個旋轉,以保持相同的點下滑鼠指標。

這樣做有兩個步驟。

首先是搞清楚什麼球體上的點下滑鼠指標。

二是計算需要改造舊了點的新的起點上旋轉。

為了找到球體上的點下滑鼠指標,我們需要

刻在viewport3d的球體

投射在二維點

的uielement的

座標系。

圖5顯示了兩個座標系統。

圖5a

滑鼠報告

uielement的,

其中有(0,0)在左上角

的座標空間中的位置

圖5b

我們預計在這個二維點刻在viewport3d的球體。

請注意,這個結果在乙個三維座標。

由於我們只計算的旋轉,我們可以選擇兩者協調的領域,對我們來說是最方便的系統感興趣。

這是最簡單的使用了球形

半徑= 1原點(0,0,0)為中心。

這使得發現的x和y分量在兩個如圖6所示的二維座標系統之間的轉換的工作。

圖6a

座標系統

的uielement

圖6b

協調系統,我們的軌跡球

要做到這一點,我們構建了乙個規模將對映viewport3d的界限範圍[0,0] - [2,2]。

然後,我們應用翻譯從左上角移動到中心的起源。

這使得我們的觀點,在範圍[1,1] - [1,-1]。

最後,我們佔為y軸朝下,而不是在二維座標系統。

/ / [0,0]規模界限 - [2,2]

雙x = 

px/(寬/ 2);

雙y = 

py/(身高/ 2);

/ /翻譯0,0中心

x = x - 1;

/ /翻轉+ y是,而不是向下

y = 1 - y;

現在,我們已經發現我們的x和y位置上球體,我們可以發現ž。

由於我們的球

半徑= 1,我們知道

。以解決

ž我們得到:

雙z2 = 1 - x * x - y * y;

雙?z = z2> 0 

數學​​sqrt (z2):0;

的vector3d

p.normalize

();現在,我們有(x 

,y ,z 球體上的點)下方的滑鼠指標的座標。

在每個滑鼠移動,我們要構建乙個旋轉,將保持對滑鼠指標下方領域的相同點。

為此,我們從上次滑鼠移動事件記憶球體上的點和建設,將改變目前點下滑鼠指標旋轉。

計算旋轉,我們需要兩件事情:

旋轉軸旋轉角度

θ圖7

我們需要找到軸和旋轉角度θ,將改變v 

1到v 2。

在以原點為中心,因為我們的球,我們可以解釋我們的觀點,作為載體。

它這樣做是微不足道的軸和旋轉角度分別使用交叉的產品和網點產品:

的vector3d 

軸的vector3d

(v1,v2);

雙θ= 

的vector3d,

。anglebetween(v1,v2);

一旦我們擁有了這一切仍然是當前方向申請新的旋轉軸和角度:

/ /我們否定的角度,因為我們正在旋轉的攝像頭。

/ /不要做,如果你正在旋轉的場景代替。

四元三角= 

新 四元數

(軸角);

/ /獲取當前

orientantion

的rotatetransform3d

rotatetransform3d 

rt=(

rotatetransform3d

)camera.transform

;axisanglerotation3d 

r =(

axisanglerotation3d

)rt.rotation的的

;           

四元數q = 

新 四元

(r.axis

, r.angle

)/ /構圖方向與以往的三角洲

q * =三角洲;

/ /寫入新的方向返回到rotation3d

r.axis

= q.axis

;r.angle

= q.angle

;也有一些細節,我們在第2掩飾。

首先是投射到球體的滑鼠指標,計算假設viewport3d的是方形的。

viewport3d的如果是橢圓形刻軌跡球實際上是乙個橢球:

圖8

如果viewport3d的是橢圓形的題寫的軌跡球,實際上是乙個橢球

這種效果是通常不引人注目,但如果長寬比是極端的,這將導致旋轉速度沿較短的軸移動時速度明顯加快。

為了糾正這個問題,你可以申請乙個統一的尺度時二維點對映到球體,而不是(

寬度, 

高度)。

例如,分(寬度,

高度)會的工作。

無論你選擇,記得翻譯的起源時,此帳戶。

另乙個問題是如何處理的情況下,當滑鼠指標不對映到軌跡球定位:

圖9

陰影區域不對映到乙個點上的軌跡球

乙個可行的辦法是打擊

z在這種情況下為零,然後年底的2.1節所示:

雙?z = z2> 0 

數學​​sqrt (z2):0;

從技術上講,我們也應該正常化x和

y 找到軌跡球最近在點

z= 0平面的,否則我們返回的是不球體上的:

然而,在2.2節中,我們使用

的vector3d 

。anglebetween(v1,v2)

佔 ​​非規範化的載體。

這是正常化的產量x和

y 相同的結果

如上圖所示。

我們還沒有討論的模型和攝像機的初始位置。

此實現假定該模型為中心的起源和相機正在研究的起源和定位在距離該模型是可見的。

最後,本文不討論如何實現變焦,雖然示例**包含乙個合理的實施。

示例**包含三個可重用件:

trackball.cs

觀察乙個

frameworkelement的

滑鼠事件,

由此產生的旋轉和尺度,以更新的transform3d 

實用程式類

。trackport.proj

乙個usercontrol的

載入和顯示

xaml

從鬆散。model3d 

允許的觀點,通過滑鼠(例如使用的操縱

trackball.cs

)modelviewer.proj

模型檢視器應用程式圖,在圖1(使用例如

trackport.proj的

)。這些都包含在「3d工具的windows presentation foundation」在此url的工作區:

在這裡)

你不必參加工作區

3D旋轉的時鐘

var hour new date gethours if hour 11 varmins new date getminutes var sec newdate getseconds 秒針,每週走60個單位 varunitsec 2 math.pi 60 分鐘,每週走60 60個單位 varuni...

iOS實現3D旋轉

最近看到了乙個3d旋轉的動畫,就想著自己去實現以下。那麼,接下來就通過這邊文章記錄以下學習過程,慢慢深入了解以下3d旋轉。一 如何旋轉 每個view都在系統的座標系中,就手機螢幕來說,左上角為 0 0 向右橫向的為x軸正方向,向下縱向的為y軸正方向,垂直於手機螢幕的方向既z軸方向。所以z軸的旋轉屬於...

CSS3動畫 3D旋轉

學了c3之後,簡單做了乙個3d旋轉的小demo.個人親猜測相容chrome firefox opera safari,沒有考慮ie。如果下面 有問題,可以在我的github檢視源 可以檢視網頁效果demo位址。如下 ccs3animation 3drotatetitle charset utf 8 ...