關於3D方面的東西,本人只是淺嘗輒止,從未曾在項目中使用過,相信有不少人也是基於一份興趣去學習。這里將展示幾個基本的WPF 3D編程,希望對初學者有一定幫助。
為幫助理解,這里全部使用C#代碼構造,而不是寫在XAML中,有興趣的可以在這里下載源代碼。下面來先看下幾個效果圖。
下面就第一幅效果圖做個基本的講解。
3D有三個重要元素,模型、燈光、視野。那我們現實來對比,我們要看到一個物體,首先這個物體要存在(即要構造一個模型),其次需要有燈光照在這個物體上(即要構造一個燈光,還要將燈光照在這個模型上,不然就看不見模型),然后我們要有視野,要用眼睛去看(就是說我們還要構造一個視野,而且模型要在這個視野中才能看的到)。
而模型則有兩部分組成,網格和紋理(附在材質上)。網格即為骨架,紋理為皮膚,二者缺一不可。網格由許許多多的三角形構成,下面的代碼向你展示如何構造一個WPF 3D模型。
由12個三角形構成一個立方體網格。
MeshGeometry3D meshg = new MeshGeometry3D(); Point3DCollection pc = new Point3DCollection(); pc.Add(new Point3D(-10,10,0));pc.Add(new Point3D(10,10,0));pc.Add(new Point3D(10,-10,0));pc.Add(new Point3D(-10,-10,0)); pc.Add(new Point3D(-10,10,-10));pc.Add(new Point3D(10,10,-10));pc.Add(new Point3D(10,-10,-10));pc.Add(new Point3D(-10,-10,-10)); meshg.Positions = pc; Int32Collection ic = new Int32Collection(); ic.Add(0);ic.Add(2);ic.Add(1);ic.Add(0);ic.Add(3);ic.Add(2); ic.Add(4);ic.Add(6);ic.Add(5);ic.Add(4);ic.Add(7);ic.Add(6); ic.Add(4);ic.Add(3);ic.Add(0);ic.Add(4);ic.Add(7);ic.Add(3); ic.Add(5);ic.Add(2);ic.Add(1);ic.Add(5);ic.Add(6);ic.Add(2); ic.Add(4);ic.Add(1);ic.Add(5);ic.Add(4);ic.Add(0);ic.Add(1); ic.Add(7);ic.Add(2);ic.Add(6);ic.Add(7);ic.Add(3);ic.Add(2); meshg.TriangleIndices = ic;
接下來,我們構造一個材質對象,這里就用一個簡單的畫刷作為材質的紋理。然后用這個材質和上面構造的網格構造一個3D模型。
DiffuseMaterial dm = new DiffuseMaterial(); dm.Brush = Brushes.Cyan; GeometryModel3D gm = new GeometryModel3D(); gm.Geometry = meshg; gm.Material = dm;
現在3D的模型已經建好了,我們給它加上燈光。
DirectionalLight dl = new DirectionalLight ( ); dl.Color = Colors.Blue; dl.Direction = new Vector3D ( 0, 0, -1 );
接下來,將這個模型和燈光都放到一個3D集合中。本人的理解是模型和燈光都是實物,這個實物需要有個地方放,於是需要將這個3D集合放到一個空間中,這里是ModelVisual3D。
Model3DGroup mg = new Model3DGroup(); mg.Children.Add ( dl ); mg.Children.Add(gm); ModelVisual3D mv = new ModelVisual3D(); mv.Content = mg;
至此,所有美好的東西都已經弄好了,剩下的就是一雙發現美麗的眼睛了。現在,就將這個眼睛加上吧。這樣一個完整的視野就構造出來了。
Viewport3D myViewPort = new Viewport3D ( ); myViewPort.Children.Add(mv); PerspectiveCamera camera = new PerspectiveCamera ( ); camera.Position = new Point3D ( 0, 0, 80 ); camera.UpDirection = new Vector3D ( 0, 1, 0 ); camera.LookDirection = new Vector3D ( 0, 0, -20 ); myViewPort.Camera = camera;
好了,現在將這個視野放到我們的窗體中,myGrid.Children.Add ( myViewPort ),你就可以看到這個立方體了。下面是窗體代碼。
<Window x:Class="_3dTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="350" Width="525"> <Grid Name="myGrid"> </Grid> </Window>
納尼,你只看到一個正方形?這就對了,我們現在的視野是在正方體的正前面,看到的自然只有正面了。現在我們將這個正方體轉一下,你就可以多看幾個面了。
RotateTransform3D myTransform = new RotateTransform3D(); myTransform.Rotation = new AxisAngleRotation3D(new Vector3D(0, 1, 0), 45); mv.Transform = myTransform;
現在一個完整的入門例子已經完成了,希望對你有所幫助。