第015封“情书”泥什么意思?houdini Mandelbrot曼德布罗特集合

    • 自定义的mandle三维函数
  • A1)二维公式-函数定义部分:
    • 1)mandel分型二维化公式
    • 2)如何定义mandel函数
    • 3)这个函数要实现的作用
    • 4)如何判断无穷大时条件
    • 5)判断没超过最大值时的返回
  • A2)二维公式-执行函数部分:
    • 6)如何用条件语句执行自定义函数
    • 7)另一种可调参数变量控制迭代值
    • B)自定义三维mandel函数-部分
      • 01)定义函数
      • 02)执行函数
      • C)渲染sdf体积-部分
      • 03)如何不转成polygon而渲染sdf体积
      • 04)如何提sdf体积解算速度
    • ▉公式:曼德布罗特集合
    • 1)grid
    • 2)pointwrangle
  • B)“洛德布罗特集合”函数的三维化

每天翻译一篇教程,这就是我写给houdini的情书-<Entagma系列>Houdini 2016教程

泥可积德慢:尔等只是一滩泥,只有在我的手里,你们才能有人的模样
即使深陷污泥,即使被别人踩在脚底,也要努力活下去,因为泥路上有你啊,肉妮,你这个泥菩萨。

面对泥泞,可以低头看地,盯着脚下困难的泥沼,也可以抬头看天,那漫天的星辰,你有你的自由选择。但这世上若没有泥泞,种籽怎会发芽?树木又怎会生根?若没有污泥,莲花何以为生,又谈何出污泥而不染?
人生一世,草木一秋,瞑目皆归泥。我们早晚都会化成泥的。
这一节我们看一下:
殉泥派如何把比丘泥锁在一个自定义的mandel函数里。。

自定义的mandle三维函数

这一节要实现的效果…

▉今天是41岁第353天周日

这是写给houdini的 第015封“情书”
先上obj流程图
本节需要注意的知识点:A)自定义二维mandel函数-部分:

A1)二维公式-函数定义部分:

1)mandel分型二维化公式

xnew = x*x –y*y+x0;ynew = 2*x*y+y0;

2)如何定义mandel函数

function+数据类型+函数名(3个浮点+1个整数)

3)这个函数要实现的作用

通过给定的“坐标系” ,在一组公式趋于无穷大时,所需迭代的次数。

4)如何判断无穷大时条件

    if(xnew*xnew+ynew*ynew> 8 ){//如果成立,返回一个给定的值i,在本例应该返回整数;return(i); //返回i}

5)判断没超过最大值时的返回

x= xnew;y= ynew;}return(imax);   //这个循环返回imax

A2)二维公式-执行函数部分:

6)如何用条件语句执行自定义函数

  1. 用if条件语句,(<最大迭代数值)满足条件的点,用set函数设置为:白色,不满足条件的点,设置黑色
//---- Main----
Mandel (@P.x,@P.y,@P.z,6) ;
// 条件判断,以此为依据上色
if( Mandel (@P.x, @P.y, @P.z, 6)<6) { //使用if语句如果<6,因为这是最大的“迭代数”这个函数不需要无限延伸v@Cd = set(1,1,1);//白色;
}
else{v@Cd = set(0,0,0)//黑色

7)另一种可调参数变量控制迭代值

//---- Main---
int maxiter =chi(“Maxiter”);           //变量改成引用参数
if( Mandel (@P.x, @P.y, @P.z, maxiter)<maxiter) {v@Cd = set(1,1,1);
}
else{v@Cd = set(0,0,0);
}

B)自定义三维mandel函数-部分

01)定义函数
//增加了z轴;4变量(n,r,theta,phi)
//---- functions ----
function int Mandel (float x0, y0, z0; int imax) float x, y, z, xnew, ynew, znew, n=ch("n"),r,theta,phi;int i;      x=x0;y=y0;z=z0;for(i=0; i < imax; i++ ){  .
//-------------三维公式部分---------------
//特别注意:公式的x,y,z要看清楚,稍微写错效果就不对r=sqrt(x*x + y*y +z*z);theta = atan2(sqrt(x*z+y*y),z);  // 注意是x*zphi = atan2(y,x);xnew = pow(r,n)*sin(theta*n)*cos(phi*n)+x0;ynew = pow(r,n)*sin(theta*n)*sin(phi*n)+y0;znew = pow(r,n) *cos(phi*n)+z0;
02)执行函数
//-------------三维公式执行---------------if(xnew*xnew+ynew*ynew+znew*znew> 8 ){return(i);  }x= xnew;y= ynew;z= znew;}return(imax);
}
C)渲染sdf体积-部分
03)如何不转成polygon而渲染sdf体积

// 给渲染的物体面板增加两个参数接口:volume Isosurface和Volume Density

04)如何提sdf体积解算速度

//就是实时框住volume,只计算范围内的volume,从而提高解算速度。

  1. 用新的volume:减少单位内的体素数量=40.

  2. 执行mandel函数。

  3. 用vomumebound节点限制激活范围内的volume,节省计算量。

  4. 用peak节点扩展一下volume体积。

  5. 连接上之前的高单位体素=400的volume,把它的尺寸size降为0.

接下来理论部分

▉公式:曼德布罗特集合

曼德布罗特集合

函数的两个功能

a)对grid上每个点进行循环。

b)如果计算值∞(无穷大)=黑色;反之=白色。

这是作者推荐的专门讲解如何编程实现“曼德布罗特集合”和背后数学原理的一个youtube主:https://www.youtube.com/watch?v=pLtViSqkPvQ

接下来

开始正式制作

使用软件houdini16.5

1) grid

X y轴;33;200200

A1)函数定义部分:自定义“曼德布罗特函数”返回一个整数

2) pointwrangle1

问题1:如何自定义函数

a)我们定义了函数://---- functions ----
function int Mandel (float x0, y0, z0; int imax) {
// "Function"意思是“定义一个函数”;
// “int Mandel”意思是“数据类型+函数名”返回整数
// "float x0, y0, z0,int imax"意思是“设置参数对象"
float x, y, z, xnew, ynew, znew;int i;        //定义一些变量类型,x=x0;      //坐标变量初始化,y=y0;z=z0;

问题2

mandel函数的二维公式

b )循环函数计算mandel公式:

//imax这是定义函数时,可以调用的一个值;for(i=0; i < imax; i++ ){//首先执行“曼德布洛特几何函数”xnew = x*x –y*y+x0;  ynew = 2*x*y+y0;
c)条件判断:如果无穷大( 使用一种偷懒的方法,直接使用一个值比如8 ) 返回当前 i 数值if(xnew*xnew+ynew*ynew > 8 ){ return(i);  //返回i}
c-1)否则 返回最大迭代数imaxx= xnew;y= ynew;}return(imax);     //这个循环返回imax
}

A2)主程序部分,执行自定义函数

//---- Main----
Mandel (@P.x,@P.y,@P.z,6) ;
a)任务:调用函数:
if( Mandel (@P.x, @P.y, @P.z, 6)<6) {
//使用if语句如果<6,因为这是最大的“迭代数” 这个函数不需要无限延伸v@Cd = set(1,1,1);   // <6的点给它白色;
}
else{v@Cd = set(0,0,0);   // >6的点给它黑色;
}


提高grid网格数

1)grid

Xy轴;55;400400 ///增加grid分辨率

设置maxiter为可调参数

2)pointwrangle

int maxiter =chi(“Maxiter”);           //变量改成引用参数
if( Mandel (@P.x, @P.y, @P.z, maxiter)<maxiter) {v@Cd = set(1,1,1);
}
else{v@Cd = set(0,0,0);
}


设置引用参数:Maxiter=8

B)“洛德布罗特集合”函数的三维化

问题3:如何使用mandel函数的三维公式

3) pointwrangle2

//---- functions ----
function int Mandel (float x0, y0, z0; int imax) float x, y, z, xnew, ynew, znew, n=ch("n"),r,theta,phi;int i;      x=x0;y=y0;z=z0;for(i=0; i < imax; i++ ){  .
//-------------三维公式部分---------------r=sqrt(x*x + y*y +z*z);theta = atan2(sqrt(x*z+y*y),z);  // 注意是x*zphi = atan2(y,x);xnew = pow(r,n)*sin(theta*n)*cos(phi*n)+x0;ynew = pow(r,n)*sin(theta*n)*sin(phi*n)+y0;znew = pow(r,n) *cos(phi*n)+z0;
//-------------三维公式执行---------------if(xnew*xnew+ynew*ynew+znew*znew> 8 ){return(i);  }x= xnew;y= ynew;z= znew;}return(imax);
}

问题4:如何使mandel函数三维化显示

4) volume1

  1. Name=density

  2. Size:333

3)Uniform Sampling Divs = 200

3) pointwrangle2


)勾选√Bind Each Volume to  Density //每个体像素绑给density
int maxiter =chi(“Maxiter”);
if( Mandel (@P.x, @P.y, @P.z, maxiter)<maxiter) {f@density= 0.0;
// 唯一改变的地方,改成density,另外外面区域密度=0
}
else{f@density= 1.1;
}


N=4;Maxiter=8


N=4;Maxiter=1~8

N=1~8;Maxiter=8

5) convertvdb1[1]

提高volume精度

4) volume1

  1. Uniform Sampling Divs = 400

因为直接渲染SDF速度会比转换成多边形快很多,所以我们要用sdf渲染,但是默认渲染器没有sdf渲染接口。

问题5:如何渲染sdf体积

给渲染geo物体增加两个参数接口

6)mantra1:

a) 点击

b) 弹出窗口:在左下角Filter里输入vol筛选出上方Render Properties面板下的与volume有关的选项

c) 选择volume Isosurface和Volume Density拖动到右边sampling下面。

d) 现在sampling面板下就增加了这两个参数

e) 勾选volume Isosurface就可以渲染SDF。

问题6)如何提sdf体积解算速度

操作:复制volume1,volumewrangle1

7)volume2

  1. Size:555 //增加体积尺寸

  2. Uniform Sampling Divs=40 //减小体素单位数量

8)volumewrangle2

  1. N=2.2

9)vomumebound1

  1. Bounding Value=0.001 //这是仅仅激活box范围内的volume。

10)peak1

  1. Distance=0.02 //扩展一点点。

操作:复制刚才的volume,volumewrangle,convervdb,连接volme3

11)volume3

  1. Size全部为0//它继承peak传过来的volume

Size = 400

volume3框住bound后的大小比自定义的范围小多了,这就节省了计算量
12) volumewrangle3

  1. N=5。

  2. 关联复制到volumewrangle2的N上。

13) convertvdb2 //转SDF

14) convertvdb3 // 转Polygons

制作完毕
下一节:速建Quick Tip. Loops & Subdivision迭代循环细分

教程翻译自entagma的网络教程,本文图片全部原创,版权归原作者所有。

扫一扫关注该公众号

第015封“情书”泥什么意思?houdini Mandelbrot曼德布罗特集合)相关推荐

  1. 第075封“情书”:百撕不得其解Tearing Cloth<Entagma>Houdini 2018

    ▉通往自由的路上充满了撕扯狡诈,与阴谋,难道"卑鄙是卑鄙者者的通行证"是真的?- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdin ...

  2. 第077封“情书”:弯弯绕<Entagma>Houdini 2018

    ▉ 我命硬学不会弯腰- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdini的情书"] █命运,就算你想尽一切办法,也休想压弯我追求理想的执着 ...

  3. 第060封“情书”:相对论 Signed Distance Outlines Houdini

    第060封"情书":相对论 20180507 Quicktip- Signed Distance Outlines<Entagma>Houdini 2018  ▉ 中国 ...

  4. 第079封“情书”:“I服了You”Cloth Solver From Scratch<Entagma>Houdini 2018

    ▉ 我从来不会对任何人任何事投降,直到遇见你.- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdini的情书"] █城头变幻大王旗:曾经面对刁 ...

  5. 第096封“情书”:十六亩地PDG For Design Work Pt. 3 - Setting Up Distributed PDG<Entagma>Houdini 2019

    ▉ 几分耕耘就有几分收获 .- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdini的情书"] 大地 █ "我梦中的家园:cg农场& ...

  6. 第023封“情书”: 草书 Point Advection点的平流染色线

    ▉又一波韭菜长好了,该收割了,各位庄辛苦了! 像一棵 海草 海草随波飘摇,海草海草海草,随风飘摇!海草 海草浪花里舞蹈,海草 海草管它骇浪惊涛我有我乐逍遥,人海啊 茫茫啊随波逐流浮浮沉沉. 庄:韭菜的 ...

  7. 第068封“情书”:耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据

    第068封"情书":耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据 每一天都是神的恩赐,请不要辜负. ▉ 热情在慢慢消退,逐渐冷却,惰性的冰川大兵 ...

  8. 蝙蝠侠一键改udid软件_对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书...

    蝙蝠侠一键改udid软件 by Kunal 由Kunal 对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书 (For your first HTML code, let's help Batma ...

  9. 《致盛夏的七封情书》 ------------ 第一篇《晨曦》

    写了一个短篇小说,<致盛夏的七封情书>,一共七篇,采用拼凑式的记述和多位不间断的场景转换,讲一个小小的爱情故事,不精美,也不感人,纯粹给目前毫无道理的无望生活找一点存在感. 第一篇< ...

最新文章

  1. spark重要端口号
  2. easymock快速入门
  3. C# 委托:把方法组合到一个数组中使用
  4. python pandas csv 追加 空行,python – Pandas:read_csv在空行后忽略行
  5. android 如何正确使用 泛型 和 多参数 “偷懒”
  6. 2继电器控制单相电机正反转
  7. php 批量导入表格,织梦dedecms批量导入excel表文章内容插件
  8. Xmind激活版双击文件无法打开的解决方案
  9. windows截图指令命令/cmd中截图指令
  10. 网易云音乐工程师,亲自揭晓评论实现技术!| 技术头条
  11. 搜索引擎免费登录入口大全(转)
  12. u-boot (1) —— 编译分析
  13. 安卓进不去系统如何备份数据
  14. 互联网思维方式(一)
  15. 如何修改mysql占用的端口号_修改mysql端口号(mysql的端口号)
  16. 成语学习微信小程序源码
  17. Neurosynth package安装及使用
  18. 一些有意思的文章和资源
  19. 离线安装K3S Server(v1.19.8+k3s1)
  20. 时针分针一天到底重合多少次?

热门文章

  1. 本年度钢铁行业发展趋势
  2. 用python输出_python 输出输出用法
  3. go 访问url下载文件
  4. easyexcel在一个excel中建立多个sheet
  5. SAS描述性统计分析
  6. csapp attack lab实验总结
  7. 网络入门模拟器:Cisco Packet Tracer
  8. UCML异常提示:无效URI
  9. 华为OD机试 - 投篮大赛Python) | 机试题+算法思路+考点+代码解析 【2023】
  10. 【Spring】注解(AOP)不生效原因分析以及解决方案