1. 开始之前

1.1 学习资源链接

Taichi_THREE 原作者的教程视频:
https://www.bilibili.com/video/av628129594

github 链接:
https://github.com/taichi-dev/taichi_three#how-to-play

  • 运行程序之前记得将资源文件夹 assets 分别复制进 docsexample 文件目录下。

1.2 安装

  • 运行是基于 Taichi 环境:
python3 -m pip install taichi
  • 安装 Taichi THREE
python3 -m pip install taichi-tina

具体安装流程见官方文档:

  • 《taichi 中文文档》
  • 《Taichi THREE》

2. 你好,三角形

2.1 坐标系

Tina 使用的右手坐标系:

2.2 创建窗口

import taichi as ti
import tina# 创建场景对象 scene
scene = tina.Scene()# 创建一个 SimpleMesh 类的网格对象 mesh ,绑定和设置到 scene
mesh = tina.SimpleMesh()
scene.add_object(mesh)# 初始化 taichi 的一个 gui 对象
gui = ti.GUI('simple triangle')# 渲染循环
while gui.running:# 渲染 scenescene.render()# 将获得的像素信息传递给 gui 渲染出来gui.set_image(scene.img)gui.show()

得到一个空白窗口:

2.3 设置顶点数据

# 维护顶点数据
# 注意是三角形数组,该处只有一个三角形
verts = np.array([[[-1, -1,  0],  # vertex 1[ 1, -1,  0],  # vertex 2[ 0,  1,  0],  # vertex 3]])......# 渲染循环
while gui.running:# 绑定和设置 VAOmesh.set_face_verts(verts)# 渲染 scenescene.render()# 将获得的像素信息传递给 gui 渲染出来gui.set_image(scene.img)gui.show()

设置相机,轮询 gui 的鼠标事件:

  • 依靠鼠标中键拖动相机视角:
  • 滚轮拉近和远离;
  • Tab 键切换“透视模式”和“正交模式”
while gui.running:scene.input(gui)......

2.4 示例代码

import taichi as ti
import numpy as np
import tinaverts = np.array([[[-1, -1,  0],  # vertex 1[ 1, -1,  0],  # vertex 2[ 0,  1,  0],  # vertex 3]])scene = tina.Scene()mesh = tina.MeshNoCulling(tina.MeshGrid(32))
scene.add_object(mesh)gui = ti.GUI('Triangle')while gui.running:scene.input(gui)scene.render()mesh.set_face_verts(verts)gui.set_image(scene.img)gui.show()

3. 网格

3.1 简单网格

mesh = tina.MeshNoCulling(tina.MeshGrid(32))

生成一个 32×32 的网格:

调整一下 [16, 16] 顶点的坐标:

mesh.pos[16, 16].z += 0.3

网格发生变化:

可以对网格内的顶点进行遍历:

@ti.kernel
def deform():for i, j in mesh.pos:mesh.pos[i, j].z = 0.2 * ti.exp(-0.1 * ((i-16)**2 + (j-16)**2))

4. 粒子

4.1 创建粒子模型

model = tina.SimpleParticles(maxpars=n_particles)

4.2 设置粒子参数

4.2.1 位置参数

位置参数是一个 maxpars x 3 的矩阵:

pos = np.empty((n_particles, 3), dtype=np.float32) # 需要初始化
pos = np.zeros((n_particles, 3), dtype=np.float32)
pos = np.ones((n_particles, 3), dtype=np.float32)# taichi 中的变量需要进行转换
pos = (ti.Vector.field(3, float, n_particles)).to_numpy()

使用示例

......
# 传递粒子数组的位置
pos = (ti.Vector.field(3, float, n_particles)).to_numpy()
......# 渲染循环
while gui.running:......model.set_particles(pos)......

4.2.2 半径参数

位置参数是一个 maxpars x 1 的矩阵:

......
# 传递粒子半径的数组
radii = np.ones(n_particles,dtype=np.float32) * 0.02
......# 渲染循环
while gui.running:......model.set_particle_radii(radii)......

4.2.3 颜色参数

颜色参数是一个 maxpars x 3 的矩阵:

......
# 参数是一个 n_particles x 3 的矩阵
colors = np.ones((n_particles, 3), dtype=np.float32)# 将颜色的 G 通道置为 0
# (255, 255, 255) => (255, 0, 255)
for icolor in colors:icolor[1] = 0
......# 渲染循环
while gui.running:......model.set_particle_colors(colors)......

4.3 给粒子添加 Mesh

4.3.1 参考文档

源码使用的 Marching Cube 算法实现:

  • Marching Cubes算法理解
  • 游戏《孢子》的思考 —— Marching Cube算法

《水泡动画模拟(Marching Cubes)》

  • https://www.cnblogs.com/shushen/p/5542131.html

4.3.2 使用示例

# 开启平滑着色和 SSAO
scene = tina.Scene(smoothing=True,ssao=True)# 设置分辨率(例中将分辨率提高到了 1.25)
mciso = tina.MCISO((n_grid * 1.25, n_grid * 1.25, n_grid * 1.25))
scene.add_object(mciso)......while gui.running:......mciso.march(x, w0=2, rad=0, sig=0)scene.render()gui.set_image(scene.img)gui.show()

4.3.3 应用变换

使用网格模型的变换

# 1. 初始化
scene = tina.Scene(smoothing=True,ssao=True)
mciso = tina.MCISO((n_grid * 1.25, n_grid * 1.25, n_grid * 1.25))
mciso = tina.MeshTransform(mciso)# 2. 绑定
scene.add_object(mciso)# 3. 设置变换
transformMatrix = tina.translate([-0.5, -0.5, -0.5])
transformMatrix = tina.scale([2., 2., 2.]) @ transformMatrix
mciso.set_transform(transformMatrix)

5. 立方体

5.1 创建立方体模型

volume = tina.SimpleVolume(32)

5.2 加载 .npy 二进制数据

dens = np.load('assets/smoke.npy')
# density:密度
scene = tina.Scene(N=dens.shape[0], taa=True, density=16)
volume = tina.SimpleVolume(N=dens.shape[0])
scene.add_object(volume)

6. 其他基础元件

6.1 球体

6.1.1 创建

scene = tina.Scene()ball = tina.PrimitiveMesh.sphere()scene.add_object(ball)

6.1.2 设置

while gui.running:.......ball_tran_matrix = tina.scale(ball_radius)ball_tran_matrix = tina.translate(ball_vel[None].value) @ ball_tran_matrixball.set_transform(ball_tran_matrix)......

6.2 圆柱体

6.2.1 创建

scene = tina.Scene()bucket = tina.PrimitiveMesh.cylinder()scene.add_object(bucket)

6.2.2 设置

while gui.running:.......bucket_tran_matrix = tina.scale(bucket_radius)bucket_tran_matrix = tina.translate(bucket_vel[None].value) @ bucket_tran_matrixbucket.set_transform(bucket_tran_matrix)......

7. 模型

7.1 加载模型

model = tina.MeshModel('assets/monkey.obj')
scene.add_object(model)

可以增加模型载入的数量:

scene = tina.Scene(maxfaces=2**18)

7.2 材质

7.2.1 初始化材质对象

roughness = tina.Param(float, initial=0)#.15)
metallic = tina.Param(float, initial=0)#.25)
material = tina.PBR(metallic=metallic, roughness=roughness)

或者使用

material = tina.CookTorrance(roughness=0.1, fresnel=0.9)
参 数 含 义
roughness 粗糙度
fresnel 菲尼尔反射效应:在掠射角的角度,光照结果会更亮一些

7.2.2 示例代码

model = tina.MeshModel('assets/monkey.obj')
material = tina.CookTorrance(roughness=0.1, fresnel=0.9)scene.add_object(model, material)

7.3 光源

scene.lighting.clear_lights()# 添加点光源(同时可以设置光的颜色)
scene.lighting.add_light(pos=[0, 1, 0], color=[1, 0, 0])# 添加平行光源
scene.lighting.add_light(dir=[1, 1, 0])# 设置环境光源
scene.lighting.set_ambient_light(color=[0.2, 0.1, 0.1])

8. 变换

8.1 激活变换

网格模型

model = tina.MeshTransform(model)

粒子模型

model = tina.ParsTransform(model)

8.2 构造变换矩阵

《欧拉角,四元数,旋转矩阵相互转化》

  • https://zhuanlan.zhihu.com/p/259999988
# 设置一个位移变换
transformMatrix = tina.translate([-0.5, -0.5, -0.5])# 再进行一个缩放:调整的是整个粒子模型的大小
# 注意向量是列向量表示,矩阵需要左乘添加变换
transformMatrix = tina.scale([2., 2., 2.]) @ transformMatrix# 欧拉角
transformMatrix = tina.eularXYZ([0., 2., 0.]) @ transformMatrix# 四元数
transformMatrix = tina.quaternion([1., 0., 0., 0.]) @ transformMatrix......

8.3 设置变换

网格模型

# 设置网格变换
model.set_transform(transformMatrix)

粒子模型

# 设置粒子变换(第二个参数是 scale :调整的是单个粒子的大小)
model.set_transform(transformMatrix, 1)

9. 其他基础功能

9.1 面剔除

Tina 是默认是开启面剔除功能的,所以需要三角形两面都显示的情况时,可以在“创建场景对象”的时候声明:

scene = tina.Scene(culling=False)

但是这种方式获得的三角形反面法线是相反的,这时推荐渲染正反两个三角形面:

verts = np.array([[[-1, -1,  0],  # vertex 1[ 1, -1,  0],  # vertex 2[ 0,  1,  0],  # vertex 3],[[ 1, -1,  0],  # vertex 1[-1, -1,  0],  # vertex 2[ 0,  1,  0],  # vertex 3]])

同时,可以在“创建网格对象”的阶段声明以下语句,来取消剔除功能:

mesh = tina.MeshNoCulling(tina.SimpleMesh())

9.2 抗锯齿

可以在“创建场景对象”阶段开启 TAA 选项(静止时按帧周期性变动采样点):

scene = tina.Scene(taa=True)

9.3 平滑着色

可以在“创建场景对象”阶段开启光滑着色,尤其适合在网格中使用:

scene = tina.Scene(smoothing=True)

同时也可以在“创建网格对象”的阶段取消平滑着色,锐化法线信息:

mesh = tina.MeshFlatNormal(tina.MeshNoCulling(tina.MeshGrid(32)))

9.4 屏幕空间环境光遮罩

环境遮罩之SSAO原理

scene = tina.Scene(ssao=True)

9.5 天空盒

9.5.1 激活天空盒

scene = tina.Scene(smoothing=True, taa=True, ibl=True)

9.5.2 设置天空盒

目前暂时需要在源码 raster.py(Line:30,31) 中更改:

skybox = tina.Skybox(skybox.resolution).cook_from(skybox)
# skybox = tina.Skybox('assets/skybox.jpg', cubic=True)

通过注释进行切换,选择使用缺省值或者使用路径中的天空盒素材

10. 资源导出

10.1 导出图片

flame = 0while gui.running:scene.input(gui)......scene.render()gui.set_image(scene.img)......filename = 'OutPng\\output_png_{:04d}.png'.format(flame)ti.imwrite(scene.img, filename)flame += 1......gui.show()

Note

  • 使用 gui.show(filename) 无法正常导出。

【GAMES201学习笔记】00 - Taichi三维可视化 - Taichi_THREE相关推荐

  1. MATLAB学习笔记——二维和三维绘图

    MATLAB学习笔记--二维和三维绘图 近期练习matlab的二维和三维绘图,整理一下,以防忘记. 文章目录 MATLAB学习笔记--二维和三维绘图 一.二维绘图 1.plot命令 2.fplot 命 ...

  2. 斯坦福大学数据可视化课程学习笔记:第一节 可视化的发展与目标

    <斯坦福大学数据可视化课程学习笔记>课程资源来自于斯坦福大学数据可视化课程,是我所在团队实习生提升计划的一部分.本系列是 "秉姝" 同学在学习过程中记录和整理的学习笔记 ...

  3. 【GAMES201学习笔记】00 - Taichi 编程

    参考文档 <Taichi编程语言 - 中文文档> 1. 初始化 Taichi ti.init(arch = ti.cuda) 推荐使用: ti.init(arch = ti.gpu) 会自 ...

  4. QGIS数据可视化学习笔记00——为什么用QGIS以及QGIS设置中文界面

    一.为什么用QGIS? 1.qgis的概念 qgis原称Quantum GIS,是开源的桌面地理信息系统软件. qgis是一款桌面版gis软件,他是基于qt平台使用c++开发出来gis软件. 2.qg ...

  5. Python数据科学学习笔记之——Matplotlib数据可视化

    Matplotlib 数据可视化 1.Matplotlib 常用技巧 1.1.导入 Matplotlib import matplotlib as mpl import matplotlib.pypl ...

  6. Games201学习笔记5:线性弹性有限元

    学习教程来自:GAMES201:高级物理引擎实战指南2020 以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删 笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请 ...

  7. Games201学习笔记3:欧拉视角

    学习教程来自:GAMES201:高级物理引擎实战指南2020 以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删 笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请 ...

  8. Games201学习笔记2:拉格朗日视角2

    学习教程来自:GAMES201:高级物理引擎实战指南2020 以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删 笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请 ...

  9. 每日一学 | 2021-05-18 | Power BI 学习笔记00、01、02

    学习网址:孙兴华讲PowerBI火力全开版[本季完]PowerBI教程 Power BI教程 DAX语言 Access教程 Access数据库 Access_哔哩哔哩 (゜-゜)つロ 干杯~-bili ...

最新文章

  1. AI智能体学会动物进化法则:李飞飞等提出深度进化RL
  2. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
  3. CMake命令之execute_process
  4. 开启AngularJs之旅
  5. MD5 - Java加密与安全
  6. 浙江省职业技能考试大纲计算机,浙江省高校计算机等级考试大纲
  7. python中pprint是干什么的_Python中的pprint折腾记
  8. 网页缩放与窗口缩放_缩放—对您的隐私有多严重?
  9. 视频相似度检测算法软件,视频相似度检测算法图
  10. 5S管理跟精益生产的关系是什么?如何使5S管理有效落地?
  11. [2018大数据年终总决赛一等奖]金融市场板块划分与轮动规律挖掘与可视化问题
  12. 什么是word文件只读模式?
  13. 初等变换:矩阵与行列式
  14. Effie 致创作路上的独行者:动静相宜
  15. 小米9se开发版系统回刷MIUI稳定版系统
  16. 国外ERP产品点评 (转载)
  17. 【Maven】什么是Maven?Maven有什么用?
  18. C#毕业设计——基于C#+asp.net+sqlserver的校园新闻发布系统设计与实现(毕业论文+程序源码)——新闻发布系统
  19. SEO知识(总结土著游民)(1)
  20. html 怎么显示co2字体,检测空气中二氧化碳含量的三种方法

热门文章

  1. 布林通道参数用20还是26_布林线参数13好还是20好
  2. matlab调用python函数未定义函数类,从MATLAB调用Python函数
  3. qBitorrent 导出所有种子脚本
  4. 微店营销的推广方法及常见手段
  5. Mastering Embedded Linux Programming 学习 (五)在百问网157开发板上,解决网络配置问题
  6. 浏览器搜索功能的使用
  7. 开讲啦-记录-创业(1)
  8. 纯CSS3实现动画—奔跑的北极熊
  9. app小程序手机端Python爬虫实战04-u2自动化工具基本操作-操作设备
  10. Vulnhub靶场——Hacker_Kid-v1.0.1