關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於 ...
關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於創建和操作3D圖形1。 HelixToolkit包含許多實用的3D圖形工具,例如3D視圖、3D模型、3D場景、3D渲染、3D動畫等,它們可以幫助開發者快速創建出高質量的3D圖形應用程式1。 HelixToolkit的文檔和教程可以在官方網站上找到,開發者可以根據需要查看和使用 地址:https://github.com/helix-toolkit Nuget安裝
<Grid> <!--ShowViewCube="True" 屬性用於關閉旋轉控制3D互動的圖標--> <!--ViewCubeWidth="200" 設置旋轉圖標的寬度--> <!--ViewCubeHeight="200" 設置旋轉圖標的高度--> <!--ViewCubeHorizontalPosition="Left" 設置旋轉圖標的水平位置--> <!--ViewCubeVerticalPosition="Top" 設置垂直圖標的位置--> <!--ViewCubeFrontText="前" 設置旋轉圖標前文本--> <!--ViewCubeTopText="上" 設置旋轉圖標上文本--> <!--ShowCoordinateSystem="True" 設置顯示坐標軸--> <!--CoordinateSystemLabelForeground="#5000" 設置坐標系統的字體顏色--> <!--CoordinateSystemHorizontalPosition="Center" 設置坐標系的水平位置--> <!--CoordinateSystemVerticalPosition="Center" 設置坐標系的垂直位置--> <h:HelixViewport3D ShowViewCube="True" ViewCubeWidth="100" ViewCubeHeight="100" ViewCubeHorizontalPosition="Right" ViewCubeVerticalPosition="Bottom" ViewCubeFrontText="前" ViewCubeTopText="上" ViewCubeBackText="後" ViewCubeLeftText="左" ViewCubeRightText="右" ViewCubeBottomText="下" ShowCoordinateSystem="True" CoordinateSystemLabelForeground="#5000" CoordinateSystemHorizontalPosition="Left" CoordinateSystemVerticalPosition="Bottom" Margin="-10,0,10,0" > <!--相機--> <h:HelixViewport3D.Camera> <!-- PerspectiveCamera標簽-透視相機(近比例長遠比例小,符合我們正常觀察事物的視覺-常用)--> <!--Position="100,100,100" 設置視角x,y,z--> <!--LookDirection="-2,-2,-2" 設置相機的觀看視角-相機觀察的方向--> <!--FieldOfView="90" 調整相機焦距 設置相機與觀看物體的距離,離得遠觀看物體區域範圍大,離得近觀看物體區域範圍小 --> <!--UpDirection="0,1,0" (x, y,z)設置相機視口的旋轉角度,斜著拍還是正著拍 --> <!--FarPlaneDistance="1000" 設置相機遠處景色的渲染範圍,如果值設置的比較小,遠處景色是模糊的--> <!--NearPlaneDistance="1" 設置相機近處的晶圓渲染範圍,如果值越大,近處景色是模糊的--> <PerspectiveCamera Position="10,10,10" LookDirection="-2,-2,-2" FieldOfView="50" UpDirection="0,1,0" FarPlaneDistance="1000" NearPlaneDistance="1"> <!--設置相機旋轉標簽--> <PerspectiveCamera.Transform> <!--分組標簽,在分組標簽內可以有多個變形標簽--> <Transform3DGroup> <!--CenterX="0" CenterY="0" CenterZ="0" 設置相機旋轉中心點--> <RotateTransform3D CenterX="3" CenterY="0" CenterZ="0"> <!--設置相機旋轉方式標簽--> <RotateTransform3D.Rotation> <!--AxisAngleRotation3D 設置相機按照軸的方式旋轉標簽--> <!--Angle="45" 設置相機按照45度角旋轉--> <!--Axis="0 1 0" 設置以那個軸進行旋轉 (x y z)--> <AxisAngleRotation3D Angle="0" Axis="0 1 0" x:Name="aar"/> </RotateTransform3D.Rotation> </RotateTransform3D> <!--平移標簽--> <!--OffsetX="1" OffsetY="1" OffsetZ="1" 設置 x y z 三個方向的移動距離--> <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" x:Name="tt"/> <!--縮放標簽--> <!--ScaleX="1" ScaleY="1" ScaleZ="1" 設置圖像縮放大小 1是原始大小 小於1是相機尺寸變小,圖像變大 大於1是相機尺寸變大,圖像變小 --> <!--一般很少使用相機平移調整圖像放大縮小,可以使用相機視野調整圖像放大與縮小--> <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/> </Transform3DGroup> </PerspectiveCamera.Transform> </PerspectiveCamera> <!--正交相機(遠近比例都一樣-很少用)--> <!--Width="50" 相當與透視相機的視野範圍屬性--> <!--<OrthographicCamera Position="100,100,100" LookDirection="-2,-2,-2" Width="50" UpDirection="0,1,0" FarPlaneDistance="1000" NearPlaneDistance="1"/>--> </h:HelixViewport3D.Camera> <!--設置旋轉動作靠什麼來操作--> <h:HelixViewport3D.RotateGesture> <!--設置滑鼠操作旋轉動作--> <!--MouseAction="LeftClick" 設置滑鼠左鍵旋轉--> <MouseGesture MouseAction="LeftClick"/> </h:HelixViewport3D.RotateGesture> <!--設置3D圖像移動操作--> <h:HelixViewport3D.PanGesture> <!--設置滑鼠右鍵移動3D圖像--> <MouseGesture MouseAction="RightClick"/> </h:HelixViewport3D.PanGesture> <!--第二步在3D世界設置光源進來,沒有光源全是黑的呀--> <!--光源標簽-設置光源的相關屬性--> <ModelVisual3D> <!--光源內容標簽--> <ModelVisual3D.Content> <!--多個光源可以組合使用-會出現不同的效果--> <Model3DGroup> <!--環境游標簽 --> <!--Color="White"-設置環境光顏色 --> <AmbientLight Color="White"/> <!--平行光-設置某一個方向上照射的光-平行光不發散 --> <!--Direction="-1,-1,-1" (x,y,z)三個方向照射的光 設置平行光的照射方向--> <!--<DirectionalLight Color="White" Direction="-1,-1,-1"/>--> <!--點光源-點光源是向四面八方發散的光源 --> <!--Position="100,100,100" (x,y,z) 設置光源點--> <!--Range="200" 設置光源的照射範圍--> <!--<PointLight Color="White" Position="100,100,100" Range="200"/>--> <!--射燈光源(聚光燈,手電筒筒)-某一個方向去發射光源-相當於手電筒筒有一個中心的光柱(比較亮的)以及兩遍發散的光源(相對較暗) --> <!--InnerConeAngle="100" 設置中心範圍光柱的角度--> <!--OuterConeAngle="40" 設置兩遍光源的範圍角度--> <!--Position="50,50,50" 設置光源的中心位置--> <!--Direction="-1,-1,-1" (x,y,z)三個方向照射的光 設置光源的照射方向--> <!--<SpotLight Color="Orange" InnerConeAngle="100" OuterConeAngle="40" Position="50,50,50" Direction="-1,-1,-1"/>--> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> <!--動態庫提供的光源-比較全-建議使用這個-當然自己寫也可以 --> <!--<h:DefaultLights/>--> <!--3D圖形的第一個面 可以把所有的面放在一起寫--> <!--3DUIElement標簽-固定寫法--> <!--MouseLeftButtonDown 滑鼠左鍵點擊事件--> <ModelUIElement3D MouseLeftButtonDown="ModelUIElement3D_MouseLeftButtonDown"> <ModelUIElement3D.Model> <!--GeometryModel3D網格標簽--> <GeometryModel3D> <!--第三步物體需要呈現出來需要材質--> <!--3D的材質 標簽--> <GeometryModel3D.Material> <MaterialGroup> <!--漫反射的一種材質 材質是與網格屬性標簽組合在一起使用的--> <!--DiffuseMaterial 慢反射材質標簽--> <!--Brush 設置材質顏色或圖片--> <!--<DiffuseMaterial Brush="Orange"/>--> <!--3D面設置背景圖-需要在網格標簽中設置TextureCoordinates="0,1 0,0 1,0 1,1"屬性,背景圖顯示方向,才能顯示出背景圖 --> <DiffuseMaterial> <DiffuseMaterial.Brush> <ImageBrush ImageSource="Arrow.png"/> </DiffuseMaterial.Brush> </DiffuseMaterial> <!--自發光--> <!--<EmissiveMaterial Brush="Red"/>--> <!--<SpecularMaterial Brush="Blue"/>--> </MaterialGroup> </GeometryModel3D.Material> <!--BackMaterial 異面材質標簽--> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="Green"/> </GeometryModel3D.BackMaterial> <!--網格標簽--> <GeometryModel3D.Geometry> <!-- MeshGeometry3D呈現3D圖形的標簽 Positions="0,0,0(x,y,z) 3,0,0 3,2,0 0,2,0" 一個面的4個點--> <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 --> <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序--> <!--TextureCoordinates 設置平面對象與3D對象的映射關係-用來解決平面設置背景圖顯示問題-如果不設置這個屬性平面設置的背景圖不顯示--> <MeshGeometry3D Positions="0,0,0 3,0,0 3,2,0 0,2,0" TriangleIndices="0,2,3 0,1,2" TextureCoordinates="1,1 1,0 0,0 0,1"/> <!--箭頭向下--> <!--TextureCoordinates="1,1 0,1 0,0 1,0"/> 箭頭向左--> <!--TextureCoordinates="0,1 1,1 1,0 0,0"/> 箭頭向右--> <!--TextureCoordinates="0,1 0,0 1,0 1,1"/>--> <!-- 箭頭向上--> </GeometryModel3D.Geometry> </GeometryModel3D> </ModelUIElement3D.Model> </ModelUIElement3D> <!--Viewport2DVisual3D 平面對象載入標簽用於在3D對象中呈現2D控制項--> <Viewport2DVisual3D> <!--網格標簽--> <Viewport2DVisual3D.Geometry> <!-- MeshGeometry3D呈現3D圖形的標簽 Positions="0,0,0(x,y,z) 3,0,0 3,2,0 0,2,0" 一個面的4個點--> <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 --> <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序--> <!--TextureCoordinates 設置平面對象與3D對象的映射關係-用來解決平面設置背景圖顯示問題-如果不設置這個屬性平面設置的背景圖不顯示--> <MeshGeometry3D Positions="0,0,1 3,0,1 3,2,1 0,2,1" TriangleIndices="0,2,3 0,1,2" TextureCoordinates="0,1 1,1 1,0 0,0"/> </Viewport2DVisual3D.Geometry> <!--Material設置3D的材質 標簽--> <Viewport2DVisual3D.Material> <!--IsVisualHostMaterial 屬性是將DiffuseMaterial材質設置成2D平面的盒子 - 用於解決將Button按鈕顯示出來 --> <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/> </Viewport2DVisual3D.Material> <Border> <Button Content="Hello" Click="Button_Click"/> </Border> </Viewport2DVisual3D> <!--3D圖形的第二個面 可以把所有的面放在一起寫 這裡沒有放在一起寫是因為可以給每個面設置不同的顏色--> <!--3DUIElement標簽-固定寫法--> <ModelUIElement3D> <ModelUIElement3D.Model> <!--GeometryModel3D網格標簽--> <GeometryModel3D> <!--第三步物體需要呈現出來需要材質--> <!--3D的材質 標簽--> <GeometryModel3D.Material> <MaterialGroup> <!--漫反射的一種材質 材質是與網格屬性標簽組合在一起使用的--> <!--DiffuseMaterial 慢反射材質標簽--> <!--Brush 設置材質顏色或圖片--> <DiffuseMaterial Brush="Red"/> <!--<DiffuseMaterial> <DiffuseMaterial.Brush> <ImageBrush ImageSource="Arrow.png"/> </DiffuseMaterial.Brush> </DiffuseMaterial>--> <!--自發光 標簽-用於設置在沒有光源的情況下可以看見自發光顏色-在有光源的情況下自發光顏色會影響到材質顏色的顯示 --> <!--<EmissiveMaterial Brush="Green"/>--> <!--全反射標簽 目前只是瞭解一下--> <!--<SpecularMaterial Brush="Blue"/>--> </MaterialGroup> </GeometryModel3D.Material> <!--BackMaterial 異面材質標簽--> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="Blue"/> </GeometryModel3D.BackMaterial> <!--網格標簽--> <GeometryModel3D.Geometry> <!-- 呈現3D圖形的標簽 Positions="0,0,0(x,y,z) 3,0,0 3,2,0 0,2,0" 一個面的4個點--> <!--TriangleIndices ="0,2,3(第一組-這裡的坐標點需要逆時針順序) 0,1,2(第二組)" 設置Positions的3個點組成一個三角行 --> <!--這裡如果呈現的是三角行而不是四邊行的畫,是因為TriangleIndices="0,2,3 0,1,2"的畫點順序需要逆時針順序--> <MeshGeometry3D Positions="3,2,1 3,2,0 3,0,0 3,0,1" TriangleIndices="0,3,1 1,3,2"/> </GeometryModel3D.Geometry> </GeometryModel3D> </ModelUIElement3D.Model> </ModelUIElement3D> </h:HelixViewport3D> </Grid>
代碼實例效果圖:
代碼實例: