WPF_3D绘图一

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网格上,参考图如下:

          

         

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF中的HelixViewport3D是一个用于绘制和呈现3D图形的控件。HelixViewport3D提供了一个三维坐标系,并允许用户在其中绘制各种3D对象。 要使用HelixViewport3D进行绘制,首先需要在WPF窗口中引入HelixToolkit库。然后,可以在XAML中创建一个HelixViewport3D控件并设置其属性来定义绘图的相关参数,如相机位置、灯光等。 一旦HelixViewport3D控件准备好,就可以在其中进行绘制。可以通过定义MeshGeometry3D来创建各种3D几何体,如立方体、圆柱体、球体等。还可以使用Material来定义几何体的表面质感,如颜色、纹理、反射等。 在绘制3D对象时,可以使用Transform3D来对其进行平移、旋转、缩放等操作,实现各种动画效果。还可以使用HelixViewport3D提供的各种相机控制方法,如缩放、旋转、偏移等,在绘图过程中调整视图。 此外,HelixViewport3D还支持与用户交互,如捕捉鼠标移动、点击等事件。通过监听这些事件,可以实现用户与绘图的交互操作,如选择、拖拽、旋转等。 绘制完成后,可以通过将HelixViewport3D添加到WPF窗口中,将其呈现出来。在窗口中可以显示生成的3D图形,并可以进行调整和交互操作。 总之,WPF的HelixViewport3D提供了一个强大的工具,使开发者能够方便地在WPF应用程序中进行3D绘制。通过合理地使用HelixViewport3D的各种功能和属性,可以轻松实现各种各样的3D效果和交互体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxy644492473

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值