前文介紹了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軸旋轉後得到的新向量:
/// /// 向量旋轉getunit函式是計算乙個響亮的單位向量:///
/// 繞x軸旋轉值
/// 繞y軸旋轉值
/// 繞z軸旋轉值
/// 旋轉結果
public static vector3d rotate(this vector3d vector3d,double x, double y, double z)
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等鍵 來改變攝像機的位置 方向。本文接下來介紹如何通過改變perspectivecame...