3D坐标入门之——甜甜圈篇
案例效果
WeChat_20220603201218
拆解过程
- 二维基础圆雏形
- 演变为三维坐标,并检验三维坐标效果
- 三维坐标投射到二维平面
- 三维坐标的旋转关系计算
全流程解析笔记
关键代码实现
- 形成基础圆
# 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坐标入门之——甜甜圈篇相关推荐
- 3D MAX入门篇(1)常用快捷命令及两种基础建模方式
3D MAX入门篇(1)常用快捷命令及两种基础建模方式 基于图片的对程型模型----画线式建模 1.在界面画一个平面 2.调整平面大小,确认与要插入的图片尺寸一样 3.通过添加样条线绘制出模型的一半 ...
- Python pyglet 自制3D引擎入门(一) -- 绘制几何体、创建3D场景
Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手.本文讲解应用Python pyglet库绘制3D场景的入门知识. 下篇:Python pyglet 自制3D引擎入门(二) – 绘 ...
- 3D引擎架构设计高级篇
3D引擎架构设计最核心的技术包括:引擎框架设计,引擎内存管理,大场景加载以及卸载,引擎的渲染,模型骨骼插件:其他的模块还有粒子,AI,行为树,UI等等吧. 市场上对于引擎开发的需求也是比较大的,而且薪 ...
- Ctfshow web入门 PHP特性篇 web89-web151 全
web入门 PHP特性篇的wp都一把梭哈在这里啦~ 有点多,师傅们可以收藏下来慢慢看,写的应该挺全面的叭- 有错误敬请斧正! CTFshow PHP web89 看题目,有个flag.php文件.题目 ...
- Python pyglet 自制3D引擎入门(二) -- 绘制立体心形,动画和相机控制
Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手.本文讲解使用Python pyglet库自制简易3D引擎的方法技巧. 上篇:Python pyglet 自制3D引擎入门(一) – ...
- OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现)(转)
OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现) 遇到需要将3D坐标转换到屏幕坐标的问题,在网上很多朋友也在寻找答案,下面是glu中gluProject函数的实现.(实际上就 ...
- 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= ...
- 微信公众号开发入门教程第一篇
微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...
- React入门看这篇就够了
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...
最新文章
- pywebio 之词云图
- 试图将驱动程序添加到存储区_Ubuntu 19.10IOS将捆绑NVIDIA驱动
- zTree实现单独选中根节点中第一个节点
- 解码resources时里面是空的_深度解码超实用的OpenStack Heat
- 使用redis的zset实现排行榜
- keras从入门到放弃(十四)模型的保存
- 关于鸿蒙系统报告,华为鸿蒙操作系统研究报告:全景解构(21页)
- Diango博客--6.Markdown 文章自动生成目录
- 服务器预装操作系统,服务器预装操作系统吧
- em,rem,px的实际应用
- IT技术中的言情小说
- 新增10亿元作支持 重庆将多举措提升科技创新能力
- 21年,周杰伦越发孤独
- php时间格式转换成时间戳,php怎么把时间格式转换为时间戳?
- variable selection
- 用python代码实现一个简单的FSA(有限状态自动机)
- UVC Camera简单介绍
- 说说你对AQS的理解?
- 01-最简单的Hello world程序
- 苹果手机输入汉字显示拼音和汉字问题
热门文章
- waterdrop 中如何导出数据
- ORA-12170:连接超时
- Preprocessor dependency “sass“ not found. Did you install it?
- java美化(格式化)json
- Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery
- 下列可作为python变量名的是1name_Python关键字不可以作为变量名。
- platform框架
- 可见光通信中的光电器件
- python爬虫之获取携程网所有航班机票信息,与携程网共同变化的爬虫博客
- 湖南科技职业学院美景欣赏