wpf之3d基礎


    關於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;

     現在一個完整的入門例子已經完成了,希望對你有所幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM