一、三維坐標系系統
WPF采用右手坐標系系統,空間定位遵循:
X 軸 → 右 Y 軸 → 上 Z 軸 → 觀察方向 X軸 \rightarrow 右\quad Y軸 \rightarrow 上\quad Z軸 \rightarrow 觀察方向 X軸→右Y軸→上Z軸→觀察方向
三維坐標值表示為 ( x , y , z ) (x, y, z) (x,y,z),旋轉角度使用歐拉角體系。當進行三維變換時,遵循矩陣組合規律:
M t r a n s f o r m = M t r a n s l a t i o n × M r o t a t i o n × M s c a l e M_{transform} = M_{translation} \times M_{rotation} \times M_{scale} Mtransform?=Mtranslation?×Mrotation?×Mscale?
二、視口與攝像機
如果使用3D內容,就需要有容器來包含3D內容。這個容器是Viewport3D類,該類位
于System.Windows.Controls名稱空間。Viewport3D類繼承自FrameworkElement類,所以它可
以放到能夠放置正常元素的任何地方。例如,可以使用它作為窗口或頁面的內容,也可以將它
放到更復雜的布局中。
Viewport3D類只應用于復雜的3D編程。它常用的兩個屬性——Camera和Children
- Camera屬性 定義了3D場景的觀察者(相機)
- Children屬性包含了希望放在場景中的所有3D對象。
當然,照亮3D場景的光源本身也是視口中的一個對象。
- Viewport3D容器結構代碼
<Viewport3D x:Name="viewport3D"><!--相機--><Viewport3D.Camera><PerspectiveCamera Position="100,100,100" LookDirection="-100,-100,-100" UpDirection="0,0,1" FieldOfView="10"><PerspectiveCamera.Transform><RotateTransform3D CenterX="0" CenterY="0" CenterZ="0"><RotateTransform3D.Rotation><!--視野可以繞物體中心軸旋轉--><AxisAngleRotation3D Axis="0 0 1" Angle="180"/></RotateTransform3D.Rotation></RotateTransform3D></PerspectiveCamera.Transform></PerspectiveCamera></Viewport3D.Camera><!--光源 離散的白色光源--><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><AmbientLight Color="#999" /><!--點光源-光影層次感--><PointLight Color="#DDD" Position="100,0,100"/></Model3DGroup></ModelVisual3D.Content></ModelVisual3D><!--模型--><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><GeometryModel3D><GeometryModel3D.Material><DiffuseMaterial Brush="Orange"/></GeometryModel3D.Material><GeometryModel3D.BackMaterial><DiffuseMaterial Brush="Orange"/></GeometryModel3D.BackMaterial><GeometryModel3D.Geometry><MeshGeometry3D Positions="2.5,0,0.5 -2.5,0,0.5 2.5,2,0.5 -2.5,2,0.52.5,0,0 -2.5,0,0 2.5,2,0 -2.5,2,0"TriangleIndices="0,2,1 1,2,3"/></GeometryModel3D.Geometry></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D></Viewport3D>
運行效果
注意:
在Viewport3D類的繼承屬性中,有一個屬性特別重要:ClipToBounds。如果將該屬性設置
為true(默認值),超出視口邊界的內容將被剪裁掉。如果設置為false,內容會顯示在相鄰元素
的上面。這種行為和Canvas控件的ClipToBounds屬性的行為相同。然而,當使用Viewport3D
類時有如下重要的區別:性能。如果將Viewport3D.ClipToBounds屬性設置為false,當渲染復
雜的、頻繁更新的3D場景時,可顯著提高性能。
- 攝像機類型對比
- PerspectiveCamera(透視投影)
<PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1" UpDirection="0,1,0"FieldOfView="60"/>
- OrthographicCamera(正交投影)
<OrthographicCameraPosition="0,0,5"LookDirection="0,0,-1"Width="10"/>
三、光照體系
光照類型 | 特點 | 適用場景 |
---|---|---|
AmbientLight | 均勻環境光 | 基礎照明 |
DirectionalLight | 平行光源(類似太陽光) | 主體照明 |
PointLight | 點光源(球狀衰減) | 局部照明 |
SpotLight | 聚光燈(錐形照射) | 特殊效果 |
<ModelVisual3D><ModelVisual3D.Content><DirectionalLight Color="White" Direction="-1,-1,-1"/></ModelVisual3D.Content>
</ModelVisual3D>
四、幾何模型構建
- MeshGeometry3D核心屬性
var geometry = new MeshGeometry3D {Positions = new Point3DCollection {new Point3D(-1,1,1), // 頂點坐標集合new Point3D(1,1,1),// ...其他頂點},TriangleIndices = new Int32Collection {0,1,2, // 三角形索引2,3,0,// ...其他面},TextureCoordinates = new PointCollection {new Point(0,0), // 紋理坐標new Point(1,0),// ...其他貼圖坐標}
};
- 材質與著色器
<GeometryModel3D.Material><MaterialGroup><DiffuseMaterial Brush="Blue"/><SpecularMaterial Brush="White" SpecularPower="20"/></MaterialGroup>
</GeometryModel3D.Material>
五、WPF3D中常見的幾個類
類名 | 說明 |
---|---|
Viewport3D | 定義了用于渲染3D對象的表面。它作為容器包含所有3D繪圖的可見元素,是創建3D場景的基礎組件。 |
ModelVisual3D | 包含在Viewport3D 中,負責展示3D模型的所有可見部分。支持對整個模型應用變換操作(如旋轉、縮放和移動),以便調整模型在3D空間中的位置和方向。 |
GeometryModel3D | 是ModelVisual3D 的一個具體實現,用于定義3D模型的具體外觀。它不僅包含幾何形狀(通過MeshGeometry3D 定義),還包含了材質信息,以確定模型的顏色和紋理等視覺屬性。 |
Geometry3D | 抽象基類,提供了定義幾何形狀的基本框架。它的具體實現MeshGeometry3D 允許用戶通過指定三角形的位置來構建復雜的3D模型。 |
Material | 抽象基類,用于定義應用于MeshGeometry3D 上的材質屬性,影響3D模型的外觀。包括EmissiveMaterial (自發光)、DiffuseMaterial (漫反射光)、SpecularMaterial (鏡面反射光)等,以及可以通過MaterialGroup 將多種材質組合使用。 |
Light | 抽象基類,提供基礎照明功能。其子類包括AmbientLight (環境光,無方向性)、DirectionalLight (定向光源,模擬太陽光)、PointLight (點光源,從一個點向四周均勻發光)和SpotLight (聚光燈,發出錐形光線)。這些光源共同作用,為3D場景提供逼真的光照效果。 |
Camera | 抽象基類,用于控制3D場景如何投影到2D顯示表面上。PerspectiveCamera 模擬人眼視角,遠處物體顯得更小;OrthographicCamera 不考慮距離因素,適用于技術制圖;而MatrixCamera 則允許更靈活地設置視圖轉換矩陣。 |
Transform3D | 抽象基類,提供對3D對象進行變換的能力。包括TranslateTransform3D (位移變換)、ScaleTransform3D (縮放變換)、RotateTransform3D (旋轉變換)、MatrixTransform3D (基于矩陣的變換)和Transform3DGroup (組合多個變換)。 |
通過合理運用坐標系系統、攝像機配置、光照方案和材質組合,開發者可以構建出具有專業級表現力的三維交互界面。建議通過實際調試不同參數組合來深入理解各元素的視覺影響。