当前位置: > 游戏模型百科 >

如何制作Mandelbulb
栏目分类:游戏模型百科   发布日期:2019年06月19日 12:10:24   浏览次数:


Mandelbulb是一种三维分形,在3D艺术和视觉特效中越来越受欢迎。在本文中,我将介绍如何使用SDF(签名距离场体积)在Houdini中快速制作Mandelbulb 。

在每个体素中,SDF将距离存储到曲面上最近的点。Houdini可以解释这些距离,并将衍生曲面可视化为3D几何。这是非常方便的,因为大多数分形公式采用“距离估计函数”的形式 - 给定空间中的点,函数返回到分形隐式曲面上最近点的距离。这意味着您可以将分形函数的结果直接放在每个体素中,它就可以正常工作!

 

01.创建一个空卷

 

单击右上角的图标可放大图像

首先,创建一个空体积(体积SOP)来填充距离值 - 给它命名为“表面”。一个很好的分形测试是Mandelbulb,默认情况下它大约2.5个单位宽,所以将音量大小设置为2.5,2.5,2.5。您可以更改音量的分辨率,以便在速度和质量之间进行权衡; 一个好的起点可能是将统一采样设置为按大小,分区大小为0.01。在Houdini中可视化体积的默认模式是雾体积,但您可以通过将“显示模式”更改为“等值面”(在“属性”选项卡中)将其更改为显示为硬限制曲面。


02.添加一些代码

 

单击右上角的图标可放大图像

然后是用距离值填充体素的问题。在Volume Wrangle SOP中使用此VEX代码来运行Mandelbulb公式per-voxel:

vector p = v@P;
float dr = 1;
float r = 0.0;
float power = chf(“power”);
for (int i = 0; i < chi(“iterations”) ; i++) {
    r = length(p);
    if (r>1.5) break;

    // convert to polar coordinates
    float theta = acos(p.z/r);
    float phi = atan(p.y, p.x);
    dr = pow( r, power-1.0)*power*dr + 1.0;

    // scale and rotate the point
    float zr = pow(r, power);
    theta *= power;
    phi *= power;

    // convert back to cartesian coordinates
    p = zr*set(sin(theta)*cos(phi), sin(phi)*sin(theta), cos(theta));
    p += v@P;
    }
f@surface = 0.5*log(r)*r/dr;


03.介绍参数参考

 

单击右上角的图标可放大图像

Houdini允许您将自己的自定义备用参数添加到单个节点的用户界面。我们的VEX代码包含参数引用(chf()函数),让我们使用UI中的参数控制公式的各个方面。默认情况下,这些参数不存在,但您可以通过按代码窗口右侧的“创建备用参数”按钮来创建它们。 

在这种情况下,Iterations参数将控制Mandelbulb的细节级别 - 从5或6开始.Power将控制Mandelbulb的形状 - 典型的形状出现在Power 8.0附近。


04.转换为多边形

 

单击右上角的图标可放大图像

要将曲面转换为多边形,请使用转换卷SOP跟随卷卷轴。使用反转模式,因为它被解释为带符号的距离场,您将获得以多边形形式网格化的详细分形。实际上,反转模式反转了曲面的法线和多边形的卷绕方向。


05.渲染你的曼德尔布尔

 
单击右上角的图标可放大图像

然后你可以像渲染任何其他网格一样渲染它,但因为它非常详细,你将无法轻易地拆开它 - 考虑使用程序技术来表现它,例如,根据其曲率进行着色。


相关热词: Houdini

     
游戏模型设计 3dmax模型制作 次世代模型 游戏模型百科 游戏模型贴图