根据博文: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足球导览的更多相关文章

  1. WPF 3D 球面导览

    基于WPF的3D Sphere实现模式,升级实现了该3D导览Demo.先pose一张demo效果图 所有顶点的坐标来源于足球的顶点.足球整个球面完全由正五边形和正六边形拼成,每条拼缝的长度一致,故知道 ...

  2. WPF特效-实现3D足球效果

    原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图. <UserControl x:Class="MediaBalll.Model3Ds ...

  3. WPF 3D 知识点大全以及实例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  4. 优化WPF 3D性能

    Maximize WPF 3D Performance .NET Framework 4.5   As you use the Windows Presentation Foundation (WPF ...

  5. WindowsPhone开发—— 使用手绘图片做景区导览地图

    前些日子在做景区App遇到需求,使用手绘图片做一个简易的地图,支持放大缩小平移以及显示景点Mark,安卓上可以使用一个叫做“mAppWidget”的开源库来完成,WP上有人建议用ArcGIS,但是考虑 ...

  6. js矩阵菜单或3D立体预览图片效果

    js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...

  7. WPF 3D 小小小小引擎 - ·WPF 3D变换应用

    原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...

  8. WPF 3D 常用类(1)

    原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...

  9. WPF 3D:使用GeometryModel3D的BackMaterial

    原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...

随机推荐

  1. 小程序取消IOS虚拟支付解决方案

    前因 本来我们的小程序用的好好的,结果突然有一天,微信就把小程序的ios端的虚拟支付给关了...坑爹啊!搞的安卓端的可以支付,ios的支付不了.于是就在网上找解决办法. 一说通过app跳转支付,总不能 ...

  2. SSM框架整合 详细步骤(备注) 附源码

    整合思路 将工程的三层结构中的JavaBean分别使用Spring容器(通过XML方式)进行管理. 整合持久层mapper,包括数据源.会话工程及mapper代理对象的整合: 整合业务层Service ...

  3. 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关

    Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...

  4. 并发编程--greenlet与gevent

    什么是greenlet? 虽然CPython(标准Python)能够通过生成器来实现协程,但使用起来还并不是很方便. 与此同时,Python的一个衍生版 Stackless Python实现了原生的协 ...

  5. Nginx防盗链、访问控制、解析PHP相关配置及Nginx代理

    6月11日任务 12.13 Nginx防盗链12.14 Nginx访问控制12.15 Nginx解析php相关配置12.16 Nginx代理 扩展502问题汇总 http://ask.apelearn ...

  6. python check excel 文件

    Use pip install openpyxl first Every simple example import openpyxl # 打开excel文件,获取工作簿对象 wb = openpyx ...

  7. VMware安装虚拟机及网络配置

    首先VMware版本15.1,linux:CentOS7 64位(ISO镜像),准备好这两个就可以开始安装我们的虚拟机了. VMware的安装就不赘述了,这里主要说下怎么在VMware上面安装linu ...

  8. DateTime格式转换部分介绍

    DateTime与字符串转换: DateTime()与转换为字符串主要依靠DateTime().ToString(string format) 函数,以我的理解,参数format大体分为单个字母和多个 ...

  9. 一文搞懂V8引擎的垃圾回收

    引言 作为目前最流行的JavaScript引擎,V8引擎从出现的那一刻起便广泛受到人们的关注,我们知道,JavaScript可以高效地运行在浏览器和Nodejs这两大宿主环境中,也是因为背后有强大的V ...

  10. P2910 [USACO08OPEN]寻宝之路Clear And Present Danger |Floyd

    题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了Ai,A2 ...