WPF3D关于HelixToolkit-3D呈现的交互处理

  • WPF3D关于HelixToolkit-3D呈现的交互处理已关闭评论
  • 139 次浏览
  • A+
所属分类:.NET技术
摘要

  代码实例效果图:

关于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> 

  代码实例效果图:

WPF3D关于HelixToolkit-3D呈现的交互处理

代码实例: