1.WPF使用DirectX渲染3D元素,它的坐标系如下所示
原点位于呈现区域的中心,x 轴上的正值朝右,但是 y 轴上的正值朝上,z 轴上的正值从原点向外朝向观察者。
2. 3D绘图的四要素
2.1 Viewport3D:视口。
2.2 Camera:相机,提供了三个摄像机类,如下:
1.PerspectiveCamera:透视相机,近大远小。
2.OrthographicCamera:正交相机,3D对象保持相同的尺寸。
3.MatrixCamera:矩阵相机,3D场景变换到2D视图的矩阵。
2.3 Lights:光源,提供了四个灯光类,如下:
1.AmbientLight:自然光(环境光),它所提供的环境光会照亮所有的对象,而不考虑对象的位置或方向。
2.DirectionalLight:方向光(平行光),像远处的光源那样照亮(如太阳光)。
3.PointLight:点光源,像近处的光源那样照亮。
4.SpotLight:聚光源,它既具有位置又具有方向,在 InnerConeAngle 和 OuterConeAngle 属性所设置的锥形区域(以度为单位指定)中投射光。
2.4 GeometryModel3D:3D模型
3. 创建一个3D立方体,相关代码如下:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<Viewport3D>
<!--摄像机-->
<Viewport3D.Camera>
<PerspectiveCamera
FarPlaneDistance="100"
Position="-20,15,15"
LookDirection="2,-1,-1"
UpDirection="0,1,0"
NearPlaneDistance="1"
FieldOfView="60"/>
</Viewport3D.Camera>
<!--光源-->
<ModelVisual3D>
<ModelVisual3D.Content>
<!--自然光-->
<AmbientLight Color="#888888"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<!--光源-->
<ModelVisual3D>
<ModelVisual3D.Content>
<!--方向光-->
<DirectionalLight Color="White" Direction="2,3,1"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<!--立方体-->
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D x:Name="cubeGeometry">
<GeometryModel3D.Geometry>
<!--Positions:立方体六个面的四个点(x,y,z)-->
<MeshGeometry3D Positions="0,0,0 10,0,0 0,10,0 10,10,0
0,0,0 0,0,10 0,10,0 0,10,10
0,0,0 10,0,0 0,0,10 10,0,10
10,0,0 10,10,10 10,0,10 10,10,0
0,0,10 10,0,10 0,10,10 10,10,10
0,10,0 0,10,10 10,10,0 10,10,10"
TriangleIndices="0,2,1 1,2,3
4,5,6 6,5,7
8,9,10 9,11,10
12,13,14 12,15,13
16,17,18 19,18,17
20,21,22 22,21,23"
TextureCoordinates="0,0 0,1 1,0 1,1
1,1 0,1 1,0 0,0
0,0 1,0 0,1 1,1
0,0 1,0 0,1 1,1
1,1 0,1 1,0 0,0
1,1 0,1 1,0 0,0">
</MeshGeometry3D>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="WdF_fw1200.png"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
<!--立方体绕轴旋转-->
<ModelVisual3D.Transform>
<Transform3DGroup>
<RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="1,0,0" Angle="{Binding ElementName=sliX,Path=Value}"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="{Binding ElementName=sliY,Path=Value}"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,0,1" Angle="{Binding ElementName=sliZ,Path=Value}"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</ModelVisual3D.Transform>
</ModelVisual3D>
</Viewport3D>
<StackPanel Grid.Column="1">
<Slider Name="sliX" Maximum="360" Minimum="-360" Value="0" SmallChange="1" SnapsToDevicePixels="True"/>
<Slider Name="sliY" Maximum="360" Minimum="-360" Value="0" SmallChange="1" SnapsToDevicePixels="True"/>
<Slider Name="sliZ" Maximum="360" Minimum="-360" Value="0" SmallChange="1" SnapsToDevicePixels="True"/>
</StackPanel>
</Grid>
效果图如下:分别绕x,y,z轴旋转
4.案例中使用到的属性说明
4.1 MeshGeometry3D类,常用的属性如下:
1.Positions:在计算机的3D世界里,所有的图形都是有三角形组成的,一个正方形由两个三角形组成,一个立方体由12个三角形组成,Positions就是来表示组成3D图形的所有三角形的顶点的,以正方形为例,组成一个正方形需要两个三角形,那就是六个顶点,但是因为这两个三角形共享了一条边,所以只需要四个顶点就可以表示了,当然,你也可以选择把六个点都表示出来,这会为你更好渲染你的3D图形留下方便,不过更多的时候,我们还是选择不重复表示那些共享点。
2.TriangleIndices:将Positions的顶点集合按一定顺序组合起来,组成所需要的三角形。
3.TextureCoordinates:将一副2D纹理映射到所建立的3D网格上,参考图如下:
文章来源:https://www.toymoban.com/news/detail-771552.html
文章来源地址https://www.toymoban.com/news/detail-771552.html
到了这里,关于WPF_3D绘图一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!