案例效果

WeChat_20220603201218

拆解过程

  1. 二维基础圆雏形
  2. 演变为三维坐标,并检验三维坐标效果
  3. 三维坐标投射到二维平面
  4. 三维坐标的旋转关系计算

全流程解析笔记






关键代码实现

  • 形成基础圆
# turtle画图的基础框架
import turtle,math
turtle.tracer(0) # 取消绘画过程,一次性显示全部
pen = turtle.Pen()
pen.hideturtle()
pen.penup()# 甜甜圈参数设置
density = 36 # 基础圆由36个点围城
circle_r = 50 # 基础圆
inside_r = 100 # 内环半径# 生成二维圆坐标
for i in range(density):angle = i*math.pi*2/densitycircle_x = inside_r+circle_r+circle_r*math.cos(angle)circle_y = circle_r*math.sin(angle)# 绘制二维原坐标pen.goto(circle_x,circle_y)pen.dot(5)turtle.update()
turtle.done()

  • 二维基础圆推出三维坐标,并用matplotlib验证三维形状
for i in range(density):angle = i*math.pi*2/densitycircle_x = inside_r+circle_r+circle_r*math.cos(angle)circle_y = circle_r*math.sin(angle)# 获取该点绕y轴的三维坐标for T in range(density_T):angle_T = T * math.pi * 2 / density_TT_x = circle_x * math.cos(angle_T)T_z = circle_x * math.sin(angle_T)T_y = circle_yT_point_pos.append([T_x, T_y, T_z])

  • 三维坐标映射到二维平面(最简单的相机+xy平面,没窗口)
    # 三维转二维——正视图for point in R_point_pos:x1 = camera_pos[2]*point[0]/(camera_pos[2]-point[2])y1 = camera_pos[2]*point[1]/(camera_pos[2]-point[2])z1 = point[2]pen.goto(x1,y1)dot_size = 5pen.dot(dot_size,"white")

  • 三维坐标绕轴旋转,然后再映射为二维
    徒手算角度,且没使用atan2(),直接用条件判断周期和极值
# 三维绕x轴旋转
angle_r = 2
while True:R_point_pos = []angle_r += 5for T in T_point_pos:try:if T[2]>0:beta = math.atan(T[1]/T[2])else:beta = math.atan(T[1]/T[2])+math.piexcept:if T[1]>0:beta = math.pi/2else:beta = -math.pi/2r = math.sqrt(T[1]**2+T[2]**2)x = T[0]y = r*math.sin(beta-math.radians(angle_r))z = r*math.cos(beta-math.radians(angle_r))R_point_pos.append((x,y,z))# 三维转二维——正视图for point in R_point_pos:x1 = camera_pos[2]*point[0]/(camera_pos[2]-point[2])y1 = camera_pos[2]*point[1]/(camera_pos[2]-point[2])z1 = point[2]pen.goto(x1,y1)dot_size = 5pen.dot(dot_size,"white")turtle.update()# time.sleep(0.05)pen.clear()del R_point_posturtle.clear()

完整的代码

import turtle
import math
turtle.tracer(0)
turtle.bgcolor("black")
pen = turtle.Pen()
pen.hideturtle()
pen.penup()camera_pos = [0,0,800]
inside_r = 100
circle_r = 50
density = 15
density_T = 36
rotate_R = 36
T_point_pos = []for i in range(density):angle = i*math.pi*2/densitycircle_x = inside_r+circle_r+circle_r*math.cos(angle)circle_y = circle_r*math.sin(angle)# 获取该点绕y轴的三维坐标for T in range(density_T):angle_T = T * math.pi * 2 / density_TT_x = circle_x * math.cos(angle_T)T_z = circle_x * math.sin(angle_T)T_y = circle_yT_point_pos.append([T_x, T_y, T_z])
# 三维绕x轴旋转
angle_r = 2
while True:R_point_pos = []angle_r += 5for T in T_point_pos:try:if T[2]>0:beta = math.atan(T[1]/T[2])else:beta = math.atan(T[1]/T[2])+math.piexcept:if T[1]>0:beta = math.pi/2else:beta = -math.pi/2r = math.sqrt(T[1]**2+T[2]**2)x = T[0]y = r*math.sin(beta-math.radians(angle_r))z = r*math.cos(beta-math.radians(angle_r))R_point_pos.append((x,y,z))# 三维转二维——正视图for point in R_point_pos:x1 = camera_pos[2]*point[0]/(camera_pos[2]-point[2])y1 = camera_pos[2]*point[1]/(camera_pos[2]-point[2])z1 = point[2]pen.goto(x1,y1)dot_size = 5pen.dot(dot_size,"white")turtle.update()# time.sleep(0.05)pen.clear()del R_point_posturtle.clear()turtle.done()

3D坐标入门之——甜甜圈篇相关推荐

  1. 3D MAX入门篇(1)常用快捷命令及两种基础建模方式

    3D MAX入门篇(1)常用快捷命令及两种基础建模方式 基于图片的对程型模型----画线式建模 1.在界面画一个平面 2.调整平面大小,确认与要插入的图片尺寸一样 3.通过添加样条线绘制出模型的一半 ...

  2. Python pyglet 自制3D引擎入门(一) -- 绘制几何体、创建3D场景

    Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手.本文讲解应用Python pyglet库绘制3D场景的入门知识. 下篇:Python pyglet 自制3D引擎入门(二) – 绘 ...

  3. 3D引擎架构设计高级篇

    3D引擎架构设计最核心的技术包括:引擎框架设计,引擎内存管理,大场景加载以及卸载,引擎的渲染,模型骨骼插件:其他的模块还有粒子,AI,行为树,UI等等吧. 市场上对于引擎开发的需求也是比较大的,而且薪 ...

  4. Ctfshow web入门 PHP特性篇 web89-web151 全

    web入门 PHP特性篇的wp都一把梭哈在这里啦~ 有点多,师傅们可以收藏下来慢慢看,写的应该挺全面的叭- 有错误敬请斧正! CTFshow PHP web89 看题目,有个flag.php文件.题目 ...

  5. Python pyglet 自制3D引擎入门(二) -- 绘制立体心形,动画和相机控制

    Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手.本文讲解使用Python pyglet库自制简易3D引擎的方法技巧. 上篇:Python pyglet 自制3D引擎入门(一) – ...

  6. OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现)(转)

    OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现) 遇到需要将3D坐标转换到屏幕坐标的问题,在网上很多朋友也在寻找答案,下面是glu中gluProject函数的实现.(实际上就 ...

  7. linux usb3.0改2.0,TX1入门教程硬件篇-切换USB2.0与USB3.0

    TX1入门教程硬件篇-切换USB2.0与USB3.0 说明: 介绍如何切换TX1USB口的为2.0或3.0版本 步骤: 编辑extlinux.conf文件,修改usb_port_owner_info= ...

  8. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  9. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

最新文章

  1. pywebio 之词云图
  2. 试图将驱动程序添加到存储区_Ubuntu 19.10IOS将捆绑NVIDIA驱动
  3. zTree实现单独选中根节点中第一个节点
  4. 解码resources时里面是空的_深度解码超实用的OpenStack Heat
  5. 使用redis的zset实现排行榜
  6. keras从入门到放弃(十四)模型的保存
  7. 关于鸿蒙系统报告,华为鸿蒙操作系统研究报告:全景解构(21页)
  8. Diango博客--6.Markdown 文章自动生成目录
  9. 服务器预装操作系统,服务器预装操作系统吧
  10. em,rem,px的实际应用
  11. IT技术中的言情小说
  12. 新增10亿元作支持 重庆将多举措提升科技创新能力
  13. 21年,周杰伦越发孤独
  14. php时间格式转换成时间戳,php怎么把时间格式转换为时间戳?
  15. variable selection
  16. 用python代码实现一个简单的FSA(有限状态自动机)
  17. UVC Camera简单介绍
  18. 说说你对AQS的理解?
  19. 01-最简单的Hello world程序
  20. 苹果手机输入汉字显示拼音和汉字问题

热门文章

  1. waterdrop 中如何导出数据
  2. ORA-12170:连接超时
  3. Preprocessor dependency “sass“ not found. Did you install it?
  4. java美化(格式化)json
  5. Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery
  6. 下列可作为python变量名的是1name_Python关键字不可以作为变量名。
  7. platform框架
  8. 可见光通信中的光电器件
  9. python爬虫之获取携程网所有航班机票信息,与携程网共同变化的爬虫博客
  10. 湖南科技职业学院美景欣赏