日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wpf 3D学习

發布時間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wpf 3D学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在看一些關于wpf 3d的效果,研究了一些代碼特效,現在和廣大博友共享一下.

首先用到的是MeshGeometry3D,msdn上介紹:用于生成三維形狀的三角形基元。
主要有4個依賴屬性:NormalsProperty,PositionsProperty,TextureCoordinatesProperty,
TriangleIndicesProperty。4中屬性具體含義大家可以直接參考msdn上。

具體代碼如下:

MeshGeometry3D meshGeometry3D = new MeshGeometry3D();Point3DCollection positions = new Point3DCollection();positions.Add(new Point3D(0, 0, 1));positions.Add(new Point3D(0, 0, 0));positions.Add(new Point3D(1, 0, 0));positions.Add(new Point3D(1, 0, 1));positions.Add(new Point3D(0, 1, 1));positions.Add(new Point3D(0, 1, 0));positions.Add(new Point3D(1, 1, 0));positions.Add(new Point3D(1, 1, 1));positions.Freeze();Int32Collection triangleIndices = new Int32Collection();triangleIndices.Add(0);triangleIndices.Add(1);triangleIndices.Add(2);triangleIndices.Add(2);triangleIndices.Add(3);triangleIndices.Add(0);triangleIndices.Add(4);triangleIndices.Add(7);triangleIndices.Add(6);triangleIndices.Add(6);triangleIndices.Add(5);triangleIndices.Add(4);triangleIndices.Add(0);triangleIndices.Add(3);triangleIndices.Add(7);triangleIndices.Add(7);triangleIndices.Add(4);triangleIndices.Add(0);triangleIndices.Add(1);triangleIndices.Add(5);triangleIndices.Add(6);triangleIndices.Add(6);triangleIndices.Add(2);triangleIndices.Add(1);triangleIndices.Add(3);triangleIndices.Add(2);triangleIndices.Add(6);triangleIndices.Add(6);triangleIndices.Add(7);triangleIndices.Add(3);triangleIndices.Add(0);triangleIndices.Add(4);triangleIndices.Add(5);triangleIndices.Add(5);triangleIndices.Add(7);triangleIndices.Add(0);triangleIndices.Freeze();// finally set the datameshGeometry3D.TriangleIndices = triangleIndices;meshGeometry3D.Positions = positions;

然后定義GeometryModel3D,代碼:

// create the geometry modelGeometryModel3D geom3D = new GeometryModel3D();geom3D.Geometry = meshGeometry3D;Color color = WpfUtil.HsbToRgb(index / (float)count, .9f, 1f);SolidColorBrush solidColorBrush = new SolidColorBrush(color);solidColorBrush.Freeze();geom3D.Material = new DiffuseMaterial(solidColorBrush);

然后將GeometryModel3D歸入Model3DGroup中,代碼:

Model3DGroup group = new Model3DGroup();group.Children.Add(geom3D);ModelVisual3D model = new ModelVisual3D();model.Content = group;DirectionalLight dl = new DirectionalLight();dl.Color = Colors.White; dl.Direction = new Vector3D(-1, -1, -3);group.Children.Add(dl);AmbientLight al = new AmbientLight();al.Color = (Color)ColorConverter.ConvertFromString("#555555");group.Children.Add(al);

xaml如下:

<ModelVisual3D><ModelVisual3D.Content><Model3DGroup><DirectionalLight Direction="1 0 -2"Color="White"/><GeometryModel3D><GeometryModel3D.Geometry><!--Positions獲取或設置 meshgeometry3d 的頂點位置的集合TextureCoordinates獲取或設置 meshgeometry3d 的紋理坐標的集合TriangleIndices獲取或設置 meshgeometry3d 的三角形索引的集合--><MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Green"/></GeometryModel3D.Material></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D>

上面已經設置了燈光,接下來要設置攝像機,代碼如下:

var camera=new PerspectiveCamera( new Point3D(0,3,3),new Vector3D(0,-3,-3),new Vector3D(0,0,1),45););

xmal:

<Viewport3D.Camera><!--<PerspectiveCamera Position="0,0,10"/>--><PerspectiveCamera LookDirection = " 0, -3, -3"UpDirection = " 0, 0, 1"Position = "0, 3, 3"FieldOfView = "45" /></Viewport3D.Camera>

最后可以把它們一起歸入Viewport3D

Viewport3D view3D=new Viewport3D(); view3D.Camera = camera; view3D.Children.Add(group);

當然我們也可以在指定燈光時,只定義DirectionalLight (方向光)

<ModelVisual3D><ModelVisual3D.Content><Model3DGroup><!--<AmbientLight Color="White"/>--><DirectionalLight Color="#FFFFFF" Direction="0,0,-10" /><DirectionalLight Color="#FFFFFF" Direction="1,0,0" /></Model3DGroup></ModelVisual3D.Content></ModelVisual3D>

然后自定義3D模型

<local:TreeMap3D x:Name="_treeMap3D" WeightBindingPath="CustomerCount"><local:TreeMap3D.Transform><Transform3DGroup><ScaleTransform3D ScaleX="1.2" ScaleY="1.2" ScaleZ="1.2" /><RotateTransform3D><RotateTransform3D.Rotation><AxisAngleRotation3D Angle="30" Axis="0, 0, 1" /></RotateTransform3D.Rotation></RotateTransform3D><TranslateTransform3D OffsetZ="0.6" OffsetX="-0.3"/></Transform3DGroup></local:TreeMap3D.Transform></local:TreeMap3D>

添加TreeMap3D類

public class TreeMap3D : UIElement3D { private string m_weightBindingPath;private IList m_itemsSource;private TreeMap3DElement m_selectedElement;private int[] m_weightMap;private TreeMap3DElement m_lastClickedElement;private readonly List<TreeMap3DElement> m_elements = new List<TreeMap3DElement>(); } }

定義ItemSource

public IList ItemsSource{get{VerifyAccess();return m_itemsSource;}set{if (m_itemsSource != value){VerifyAccess();refresh(value);m_itemsSource = value;}}

定義其子元素:

private class TreeMap3DElement : UIElement3D { public TreeMap3DElement(int index, int count){this.Visual3DModel = GenerateTreeMap3DModel(index, count);m_translate = new TranslateTransform3D();m_scale = new ScaleTransform3D();Transform3DGroup t3DGroup = new Transform3DGroup();t3DGroup.Children.Add(m_scale);t3DGroup.Children.Add(m_translate);base.Transform = t3DGroup;} private object m_data;private string m_weightBindingPath;private bool m_isSelected;private double m_scaleZ;private readonly ScaleTransform3D m_scale;private readonly TranslateTransform3D m_translate; }

加入動畫設計:

public bool IsSelected{get { return m_isSelected; }set{if (value != m_isSelected){DoubleAnimation animation = new DoubleAnimation();if (value){animation.From = m_scale.ScaleZ;animation.To = m_scaleZ;}else{animation.From = m_scale.ScaleZ;animation.To = 0;}m_isSelected = value;animation.Duration = new Duration(TimeSpan.FromSeconds(0.2));m_scale.BeginAnimation(ScaleTransform3D.ScaleZProperty, animation);}}}

最后運行如下:

代碼下載:http://files.cnblogs.com/gavinhuang/3DViewTest.rar

轉載于:https://www.cnblogs.com/gavinhuang/archive/2013/03/20/2971187.html

總結

以上是生活随笔為你收集整理的wpf 3D学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。