WPF 3D 轮播可操控面板

最近有个项目,项目需求中有个功能是要用3D旋转轮播图效果,每个面板又要能像2D那样可操作,由于之前没有3D的经验。没办法只能花几天时间学习学习。先来了解WPF 3D最基本的几个知识点:

1、坐标系:坐标方向得搞清楚

WPF 3D 轮播可操控面板

2、Viewport3D

WPF中使用Viewport3D作为3D物体的显示容器,我们所有的东西都要放在Viewport3D中

包括:

1、相机:

一般用PerspectiveCamera

<PerspectiveCamera Position="0.5,0.5,0.5" LookDirection="0,0,-0.5" UpDirection="0,1,0" FieldOfView="90"/>

Position:相机位置,离物体远看到的东西小,离得近看到的东西大

LookDirection:相机对准的方向,就像我们眼睛看的方向

UpDirection:相机的后面,就像我们的头的(我不怎么关注它)

FieldOfView:视角范围,就像我们眼睛看到的扇形范围

2、ModelVisual3D 3d可视化模型

        1、灯光:是Viewport3D的Children

有好几种,我用AmbientLight

<AmbientLight Color="White"/>

        2、可视化元素(点,线,面,体:都要通过坐标生成,WPF不提供具体的3D模型)

<GeometryModel3D>     <!--几何图型-->
   <GeometryModel3D.Geometry>
        <!--什么几何图型? 网格几何图型-->
      <MeshGeometry3D Positions=" 0,0,0 0,1,0 1,1,0 1,0,0" TriangleIndices="0,3,1  1,3,2"/>
   </GeometryModel3D.Geometry>
   <GeometryModel3D.Material>
       <DiffuseMaterial Brush="Blue"/>
   </GeometryModel3D.Material>
</GeometryModel3D>

既然要在3维坐标中体现,把3维坐标看成立体的网格

点、线、面、体  都是几何图所以有GeometryModel3D:3d几何模型

在3维坐标(网格)画几何图:MeshGeometry3D:网格几何

        Positions:图型顶点在三维坐标的位置

        TriangleIndices:三角坐标索引

WPF 3D 轮播可操控面板

 

WPF采用三角网格法,在三维空间中,一个面是有正反之分的。WPF只会渲染“正面”,“反面”是看不见的,

此时

        正面TriangleIndices="0,3,1  1,3,2"

        反面TriangleIndices="0,1,3  1,2,3"    把相机位置移到后面,相机方向反过来才能看到

        GeometryModel3D.Material:几何图的材质,对应2D的背景

旋转 

例如

 <ModelVisual3D.Transform>
      <Transform3DGroup>    
           <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                 <RotateTransform3D.Rotation>
                     <AxisAngleRotation3D Axis="0,1,0" Angle="90"/>
                 </RotateTransform3D.Rotation>
            </RotateTransform3D>
       </Transform3DGroup>
 </ModelVisual3D.Transform>

改变<AxisAngleRotation3D Axis="0,1,0" Angle="20"/>    Angle值,以Y轴(Axis="0,1,0")为中心旋转

完整示例

<Viewport3D Grid.Column="0"  Height="50" Width="5">
            <!--相机-->
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0.5,0.5,0.5" LookDirection="0,0,-0.5" UpDirection="0,1,0" FieldOfView="90"/>
            </Viewport3D.Camera>
            <!--灯光-->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <AmbientLight Color="White"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>

            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <!--3D模型组-->
                    <Model3DGroup>

                        <GeometryModel3D>
                            <!--几何图型-->
                            <GeometryModel3D.Geometry>
                                <!--什么几何图型? 网格几何图型-->
                                <MeshGeometry3D Positions=" 0,0,0 0,1,0 1,1,0 1,0,0" TriangleIndices="0,3,1  1,3,2"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Blue"/>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </Model3DGroup>
                </ModelVisual3D.Content>
                <ModelVisual3D.Transform>
                    <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D Axis="0,1,0" Angle="20"/>
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                </ModelVisual3D.Transform>
            </ModelVisual3D>
        </Viewport3D>

WPF 3D 轮播可操控面板

了解完以上基础后就可以做一些简单的东西了

简单的东西可以在XAML中画出来,复杂的一般用代码通过一些小几何算法帮我们生成

3D旋转轮播图效果 可操控面板

我主要是通过将圆柱变成圆内切多边形住体,然后在各个面用Viewport2DVisual3D做2D面板

效果图如下:

WPF 3D 轮播可操控面板

                                                                         主体介绍        

WPF 3D 轮播可操控面板

                                                                         外视角图

WPF 3D 轮播可操控面板

                                                                         内视角图

完整实例连接

https://download.csdn.net/download/tm12319/75099388

上一篇:mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with


下一篇:php – 使用DISTINCT和UNION在SQL查询中获取字段名称