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物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...
随机推荐
- 等待资源(wait_resource)解码
在调查阻塞或死锁时,你可能会遇到等待资源(wait_resource),通常等待的资源是Page或Key: waitresource=“PAGE: 6:3:70133 “waitresource=“K ...
- Spire.Cloud.Word 添加Word水印(文本水印、图片水印)
概述 Spire.Cloud.Word提供了watermarksApi接口可用于添加水印,包括添加文本水印(SetTextWatermark).图片水印(SetImageWatermark),本文将对 ...
- 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!
本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...
- python20个骚操作
Python小白需要知道的 20 个骚操作! Python 是一个解释型语言,可读性与易用性让它越来越热门.正如 Python 之禅中所述: 优美胜于丑陋,明了胜于晦涩. 在你的日常编码中,以下技巧可 ...
- 安装nvm管理多版本nodejs
1.简介(什么是nvm) Node Version Manager(node版本管理器),用它在机器上安装并维护管理多个Node的版本 2.nvm临时切换(临时切换版本,只在当前终端内有效,新开终端无 ...
- python_thread
多任务编程:可以有效的利用计算机资源,同时执行多个任务进程:进程就是程序在计算机中一次执行的过程进程 和 程序的区别: 1.程序是一个静态文件的描述,不占计算机的系统资源 2.进程是一个动 ...
- MySQL必知必会(数据分组,Group by和Having子句, Select子句的顺序)
SELECT vend_id, COUNT(*) AS num_prods FROM products #GROUP BY子句可以包含任意数目的列,多行NULL值将分为一组 GROUP BY vend ...
- 学习之Redis(一)
一.redis简介 一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高.https://redis.io/topics/in ...
- iOS开发动画(Animation)总结
UIView的,翻转.旋转,偏移,翻页,缩放,取反的动画效果 翻转的动画 //开始动画 [UIView beginAnimations:@"doflip" context:ni ...
- mac端口占用
lsof -i tcp:port 可以查看该端口被什么程序占用,并显示PID port 替换成端口号, eg: lsof -i tcp:8081 kill pid 杀死PID