WPF3D关于HelixToolkit-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>
代码实例效果图:

代码实例:

浙公网安备 33010602011771号