Viewport3D中的攝像機(二 攝像機動作)

2022-07-04 18:30:15 字數 1896 閱讀 7849

前文

介紹了viewport3d中的兩種攝像機:orthographiccamera和perspectivecamera。在3d場景裡漫遊,最主要的工作就是針對使用者輸入(例如滑鼠左右移動、鍵盤按下a、w、s、d等鍵)來改變攝像機的位置、方向。本文接下來介紹如何通過改變perspectivecamera的屬性,來達到場景的漫遊效果。

我攝像機的動作可以分成三類、移動、旋轉、拉公升鏡頭。用乙個列舉來描述這些動作:

public enum 

scenecameraaction

在wpf3d裡,可以通過改變計算機的position屬性,來移動perspectivecamera,假設攝像機的移動速度為speed,有以下移動公式:

新座標=原座標+速度×移動方向
下圖為攝像機向前、向左、向上移動的方向,為了方便計算,移動方向都為單位向量。

向前移動的移動方向為lookdirection,向後為-1*lookdirection

向前移動:

camera.position += (speed * camera.lookdirection);
向後移動

camera.position -= (speed * camera.lookdirection);
向左、向右移動,相當於在xz平面上,沿著攝像機的lookdirection投影垂直的直線方向移動。

向左移動:

camera.position += speed * (camera.lookdirection.rotate(0, math.pi / 2, 0).getunit());
向右移動:

camera.position += speed * (camera.lookdirection.rotate(0, -1 * math.pi / 2, 0).getunit());
上面的變換,我用了兩個擴充套件函式:

把向量旋轉拆分成分別繞x軸、y軸、z軸旋**

用以下函式計算乙個向量分別繞x、y、z軸旋轉後得到的新向量:

/// /// 

向量旋轉

///

///

繞x軸旋轉值

///

繞y軸旋轉值

///

繞z軸旋轉值

///

旋轉結果

public static

vector3d rotate(this

vector3d vector3d,double x, double y, double z)

getunit函式是計算乙個響亮的單位向量:

public static 

vector3d getunit(this

vector3d vector3d)

向上、向下移動相當於延y軸改變camera的position屬性:

向上移動:

camera.position += speed * new 

vector3d(0, 1, 0);

向下移動:

camera.position += speed * new 

vector3d(0, -1, 0);

和移動攝像機不同,旋轉攝像機時,保持攝像機的position屬性不變,根據旋轉值修改攝像機的lookdirection屬性。這裡僅僅假設繞y軸旋**

/// /// 

旋轉攝像頭

///

///

旋轉角度

public void turn(scenecameraaction modelcameraaction)

if (modelcameraaction == scenecameraaction.turnright)

}

Viewport3D中的攝像機

在三維場景裡,camera是不可或缺的元素。和人的眼睛一樣,場景中現實的內容,實際上是camera 看到 的。下圖是在google sketchup裡,left視角的camera所 看到 的內容 和常見三維建模軟體類似,在wpf的3d裡,也涉及到camera物件,在wpf裡,有三種camera ma...

Viewport3D中的攝像機(一)

在三維場景裡,camera是不可或缺的元素。和人的眼睛一樣,場景中現實的內容,實際上是camera 看到 的。下圖是在google sketchup裡,left視角的camera所 看到 的內容 和常見三維建模軟體類似,在wpf的3d裡,也涉及到camera物件,在wpf裡,有三種camera ma...

Viewport3D中的攝像機(二 攝像機動作)

前文介紹了viewport3d中的兩種攝像機 orthographiccamera和perspectivecamera。在3d場景裡漫遊,最主要的工作就是針對使用者輸入 例如滑鼠左右移動 鍵盤按下a w s d等鍵 來改變攝像機的位置 方向。本文接下來介紹如何通過改變perspectivecamer...