WPF 3D足球导览
根据博文:https://www.cnblogs.com/duel/p/regular3dpoints.html获取足球的3D坐标后,在每一个坐标位置创建一个ModelVisual3D元素,既能实现炫酷的3D界面。在此基础上我基于这些点构建了3D足球。
动态效果图:


每一个足球的块上,我贴上了不同的图,点击图获取对应的信息在右侧显示。
实现原理:
首先对所有顶点根据Y值进行分层,第一层的顶点见下图:

所有与第一层相互连接的点为第二层:

以此类推,总共可获得八层顶点。
然后,拿到第一层(第一组)的顶点(5个),第一组五个顶点组成了正五边型,正五边形每一条边对应两个顶点,根据距离计算,可以从第二层中找到与第一层顶点距离最近的点,如下图第一层的正五边形的其中一条边AB,在第二层中可以通过计算拿到与A、B两个点距离最近的C、D两个点。然后以C、D作为基点从第三层中又可以得到同时距离C、D 两个点距离最近的两个点E、F。

从上面两个图你可以直观的看见,在第二层中分别与A、B距离最近的点只能是C、D。 在第三层中同时距离C点和D点最近的点只能是E、F。 ABCDEF六个点即构成了足球的一个面。
按照这种以层级和距离的方式即可计算得到足球的每一面所包含的3D坐标。
循环计算实现逻辑代码:
// Get Bucky Ball all Blocks
private void GetBuckyBallBlocks()
{
// BuckyBallPoints -> List<List<Point3D>>
int nLevelCount = BuckyBallPoints.Count; // 总层数 - 8
for (int i = ; i < nLevelCount; i++) //
{
int nCurLevel = i; //当前层
// 下一层
int nSecondLevelBaseCur = nCurLevel + ;
// 第三层
int nThirdLevelBaseCur = nCurLevel + ; // three levels as a group, and every group defined five blocks
//(1,2,3)(2,3,4)(3,4,5)(4,5,6)(5,6,7)(6,7,8)
if (nThirdLevelBaseCur < nLevelCount)
{
// 计算距离,根据距离判断是否属于同一个面
this.CalculateBuckyBallBlocks(BuckyBallPoints[nCurLevel],
BuckyBallPoints[nSecondLevelBaseCur],
BuckyBallPoints[nThirdLevelBaseCur]);
}
}
// 第一层(现成的正五边形)
this.BuckyBallBlocks.Add(BuckyBallPoints[]);
// bottom block points 第八层(现成的正五边形)
this.BuckyBallBlocks.Add(BuckyBallPoints[BuckyBallPoints.Count - ]);
}
通过以上方式获得每一个面对应的顶点坐标后,即可通过坐标构建平面。
关键代码:
// 根据顶面创建3D平面
private MeshGeometry3D CreateBlockMeshGeometry3D(List<Point3D> ltPoints)
{
Point3D[] Point3Ds = new Point3D[ltPoints.Count];
for (int i = ; i < ltPoints.Count; i++)
Point3Ds[i] = ltPoints[i]; MeshGeometry3D oGeometry = new MeshGeometry3D()
{
Positions = new Point3DCollection(Point3Ds)
}; if (ltPoints.Count == )
oGeometry.TriangleIndices = new Int32Collection(new int[] { , , , , , , , , , , , });
else if (ltPoints.Count == )
oGeometry.TriangleIndices = new Int32Collection(new int[] { , , , , , , , , });
else
ShowErrorAndExit(); PointCollection texCoords = new PointCollection();
for (int i = ltPoints.Count -; i >= ; i--)
texCoords.Add(new Point(ltPoints[i].X, ltPoints[i].Y));
oGeometry.TextureCoordinates = texCoords; return oGeometry;
}
最后给每一个构建的平面的Visual属性附上加载的图片和点击事件既能实现我Demo中的效果。
最后附上Demo整体效果图:

工具:Visual Studio 2017
工程:WPF C#
源代码下载:

WPF 3D足球导览的更多相关文章
- WPF 3D 球面导览
基于WPF的3D Sphere实现模式,升级实现了该3D导览Demo.先pose一张demo效果图 所有顶点的坐标来源于足球的顶点.足球整个球面完全由正五边形和正六边形拼成,每条拼缝的长度一致,故知道 ...
- WPF特效-实现3D足球效果
原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下: 每个面加载不同贴图. <UserControl x:Class="MediaBalll.Model3Ds ...
- WPF 3D 知识点大全以及实例
引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...
- 优化WPF 3D性能
Maximize WPF 3D Performance .NET Framework 4.5 As you use the Windows Presentation Foundation (WPF ...
- WindowsPhone开发—— 使用手绘图片做景区导览地图
前些日子在做景区App遇到需求,使用手绘图片做一个简易的地图,支持放大缩小平移以及显示景点Mark,安卓上可以使用一个叫做“mAppWidget”的开源库来完成,WP上有人建议用ArcGIS,但是考虑 ...
- js矩阵菜单或3D立体预览图片效果
js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...
- WPF 3D 小小小小引擎 - ·WPF 3D变换应用
原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...
- WPF 3D 常用类(1)
原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...
- WPF 3D:使用GeometryModel3D的BackMaterial
原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...
随机推荐
- 【前端】 在前端利用数学函数知识+box-shadow解波浪图形
序 今天正在刷数学函数相关题目,刷到了下面这篇文章,哇哦-有意思. 利用cos和sin实现复杂的曲线.传送门在下面. CSS 技巧一则 -- 在 CSS 中使用三角函数绘制曲线图形及展示动画 正巧在复 ...
- STM32F103C8T6 在VSCode下使用Platform IO开发,基于库函数V3.5版本
首先安装Platform IO插件,怎么安装的教程有很多,可以自行百度,就不在重复了. 本篇文章将会以正点原子的跑马灯例程作为移植对象,基于ST固件库3.5版本 将实现在VSCode上的程序编写与烧录 ...
- Java的 FileWriter类 和 FileReader类
一.FileReader类1,构造方法:FileReader fr = new FileReader(String fileName);//使用带有指定文件的String参数的构造方法.创建该输入流对 ...
- React躬行记(15)——React Hooks
Hook(钩子)是React v16.8新引入的特性,能以钩子的形式为函数组件附加类组件的状态.生命周期等特性.React的类组件有难以拆分.测试,状态逻辑分散,难以复用等问题,虽然可以通过渲染属性( ...
- CentOS 7 ETCD集群配置大全
目录 前言 环境准备 安装 静态集群 配置 node01 配置文件 node02 配置文件 node03 配置文件 启动测试 查看集群状态 生成TLS证书 etcd证书创建 安装cfssl工具集 生成 ...
- CCNA 之 六 路由协议 二 EIGRP
EIGRP(Enhanced IGRP) 增强型内部网关路由协议 注意:这是cisco私有协议:也就是说,该协议只能运行在思科的设备上,如果有其他的厂家的设备,则不能保证能运行此协议: EIGRP的特 ...
- OOXML中回车等特殊字符处理方法
问题点:NPOI处理xlsx文档时,将\r写成了换行符. 实例:以下字符abc\rcde 如果直接复制到Excel 2016,显示结果如下(单元格设置为折行显示): 如果用NPOI写入Xlsx文档,显 ...
- 全栈项目|小书架|微信小程序-实现搜索功能
效果图 上图是小程序端实现的搜索功能效果图. 从图中可以看出点击首页搜索按钮即可进入搜索页面. 布局样式是:搜索框 + 热搜内容 + 搜索列表. 搜索框使用 lin-ui 中的 Searchbar组件 ...
- Selenium 4 Java的最佳测试框架
几十年来,Java一直是开发应用程序服务器端的首选编程语言.尽管JUnit一直在与开发人员一起帮助他们进行自动化的单元测试,但随着时间的推移和测试行业的发展,特别是伴随着自动化测试的兴起,已经开发了许 ...
- 浅议Grpc传输机制和WCF中的回调机制的代码迁移
浅议Grpc传输机制和WCF中的回调机制的代码迁移 一.引子 如您所知,gRPC是目前比较常见的rpc框架,可以方便的作为服务与服务之间的通信基础设施,为构建微服务体系提供非常强有力的支持. 而基于. ...