Python画3D足球2

这篇具有很好参考价值的文章主要介绍了Python画3D足球2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前情提要

足球是正五边形和正六边形拼接而成,由此形成的骨架结构,可通过切割正二十面体获得,所以画足球的第一步是画正二十面体:Python绘制正二十面体

在学会绘制正二十面体之后,就可以通过切割顶点从而得到足球的骨架:用Python画一个足球

Python画3D足球2

补点

尽管通过对正二十面体削角得到了足球,但这个足球有个非常明显的问题,就是踢不动。接下来,就要想办法将这个足球"吹"圆。

好在最初创建正二十面体的时候,便以原点为中心,所以一个显而易见的方案就是,将足球上的点向外膨胀到球的半径长度。

然而这个时候问题又来了,这个足球总共有60个顶点,每个顶点到圆心的距离都是恒定的,换言之,就算将其膨胀一下,也无非是等比例地将这个足球放大而已,所以问题的第一步,就是对足球补点。

在补点之前,先把正六边形和正五边形的点提取出来。

# 此为五边形面的顶点
penPts = getPtEdges(pts, edges)
# 此为六边形面的顶点
hexPts = [getHexEdges(f) for f in faces]

然后进行补点操作,其方法非常简单,以六边形为例,任选六边形的两个顶点,二者连线后,对线段进行五等分,然后将五等分处的四个点提取出来,就算是点被提取了。

from itertools import combinations
# N表示等分点数
def getMorePts(pts, N=5):
    morePts = []
    for p1, p2 in combinations(pts, 2):
        morePts += [(i*p1+(N-i)*p2)/N for i in range(N)]
    return np.unique(morePts,axis=0)

penMorePts = [getMorePts(pt) for pt in penPts]
hexMorePts = [getMorePts(pt) for pt in hexPts]

接下来绘制一下,

ax = plt.subplot(projection='3d')
for pt in hexMorePts:
    pt = Rx(1)@Ry(1)@pt.T
    ax.plot_trisurf(*pt, color="white")

for pt in penMorePts:
    pt = Rx(1)@Ry(1)@pt.T
    ax.plot_trisurf(*pt, color="black")

ax.axis('off')
plt.show()

效果为

Python画3D足球2

球形膨胀

补点操作当然不足以让图形变圆,接下来才是见证奇迹的时刻。

其实方法也非常简单,无非对足球上的点进行归一化而已,将所有点到圆心的距离变为某个定值,简单起见,这里暂且设为1。

ptNorm = lambda pts : np.array([p/np.linalg.norm(p) for p in pts])
hexBallPts = [ptNorm(pts) for pts in hexMorePts]
penBallPts = [ptNorm(pts) for pts in penMorePts]

接下来,就是激动人心的画图环节,但这里又涉及到plot_trisurf绘图逻辑引入的Bug,即对于 z > 0 z>0 z>0 z < 0 z<0 z<0的两个区域,plot_trisurf优先连接 x , y x,y x,y相近的位置。

def splitPtByZ(pts):
    zs = pts[:,2]
    if min(zs) > 0 or max(zs) < 0:
        return [pts]
    indPlus = np.where(zs>-0.1)[0]
    indMinus = np.where(zs<0.1)[0]
    indMid = np.where((zs>-0.1) & (zs<0.1))[0]
    return [pts[indPlus], pts[indMid], pts[indMinus]]
    

ax = plt.subplot(projection='3d')
for pt in hexBallPts:
    ptDraw = splitPtByZ(pt)
    for p in ptDraw:
        ax.plot_trisurf(*p.T, color="white")

for pt in penBallPts:
    ptDraw = splitPtByZ(pt)
    for p in ptDraw:
        ax.plot_trisurf(*p.T, color="black")

ax.axis('off')
plt.show()

效果如图所示

Python画3D足球2文章来源地址https://www.toymoban.com/news/detail-413515.html

到了这里,关于Python画3D足球2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python零基础快速制作足球游戏

    Python零基础快速制作足球游戏 前言 卡塔尔世界杯正是进行得火热,十六强队伍已经诞生,后面就是越来越紧张的争夺八强的淘汰赛。目前爆冷的赛果让球迷一度情绪失落,比如:日本2-1战胜西班牙,韩国2-1战胜葡萄牙。 这正是足球的魅力所在,结果只会给更努力的一方,过

    2024年02月08日
    浏览(52)
  • unity3d,平面和四边形的区别是什么

    在Unity中,平面和四边形都是基础的几何形状,用于创建游戏场景中的地形、墙壁、天花板等。虽然它们都是由多个点和线构成的,但是它们之间有着一些重要的区别。 平面是由三个或更多个点组成的,这些点通常位于同一平面上。在Unity中,可以使用Mesh类来创建平面,并指

    2024年02月03日
    浏览(38)
  • python项目分享 热血足球游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 热血足球游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: https://gitee.com/sinonfin/system-

    2024年01月19日
    浏览(49)
  • python毕设分享 热血足球游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 热血足球游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: https://gitee.com/sinonfin/system-

    2024年02月04日
    浏览(39)
  • 竞赛 深度学习YOLO图像视频足球和人体检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/dan

    2024年02月07日
    浏览(45)
  • CAD Voronoi 3D三维泰森多边形维诺图插件三维狄利克雷镶嵌(Dirichlet tessellation)

    Voronoi又名泰森多边形或Dirichlet图、维诺图等,三维Voronoi是由连接两邻点直线的垂直平分面组成的连续三维多面体结构。Voronoi在各个学科中应用广泛,如进行区域规划、晶体塑性有限元研究、路径优化、地形简化、多孔结构力学等方面的分析。 CAD Voronoi 3D参数化建模插件可用

    2024年02月08日
    浏览(44)
  • 软件杯 深度学习YOLO图像视频足球和人体检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/dan

    2024年04月11日
    浏览(40)
  • 竞赛选题 深度学习YOLO图像视频足球和人体检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/dan

    2024年02月07日
    浏览(46)
  • 计算机设计大赛 深度学习YOLO图像视频足球和人体检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/dan

    2024年02月20日
    浏览(105)
  • 合肥工业大学机器人足球仿真robcup作业三(python实现)附代码有注释

    题目: 已知2个点的信息,定位自己的绝对坐标。   设图中C(0,0),P1(-52.5,-32), P2(-52.5, 32), P3(52.5,32), P4(52.5,-32), P5(0,-32), P6(0,32), P7(-30,-7), P8(-30, 7), P9(30,7), P10(30, -7),G1(-52.5,0),G2(52.5,0) 随机得到附近2点距离自己的信息(r,theta), r表示目标点距离自己的距离,theta表示以自己中心的极角.(

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包