最近有个项目,项目需求中有个功能是要用3D旋转轮播图效果,每个面板又要能像2D那样可操作,由于之前没有3D的经验。没办法只能花几天时间学习学习。先来了解WPF 3D最基本的几个知识点:
1、坐标系:坐标方向得搞清楚
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采用三角网格法,在三维空间中,一个面是有正反之分的。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>
了解完以上基础后就可以做一些简单的东西了
简单的东西可以在XAML中画出来,复杂的一般用代码通过一些小几何算法帮我们生成
3D旋转轮播图效果 可操控面板
我主要是通过将圆柱变成圆内切多边形住体,然后在各个面用Viewport2DVisual3D做2D面板
效果图如下:
主体介绍
外视角图
内视角图
完整实例连接
https://download.csdn.net/download/tm12319/75099388