今天看大企鹅发的连接显示Duncan穿越到今天发了一个使用Maya的表达式和自己写的流体纹理来制作分形的一篇Blog,这老头果然还是像神一般存在着。突然想起前几日在微博上看了一个蛋疼的老外教师推的一个Batman Equation,用表达式实现之。
观察方程发现,
- 方程为因式相乘=0的形式,只要任何一个因式=0整个大串=0
- 根号其实是相应因式的条件,也就是起作用的区间
看明白后实现了一下,感觉挺爽撒,还真的是这么个标志呢
上面的图就是实现的效果,下面是节点和表达式代码:
Expressions:
float $s3s33 = sqrt(33)*3;
float $s6s10 = sqrt(10)*6;
proc float f1(float $x,float $y){
return $x*$x/49 +$y*$y/9-1;
}
proc float f2(float $x,float $y){
float $abs_x = abs($x);
float $f = abs($abs_x-2)-1;
return $abs_x/2 - ($s3s33-7)/112*$x*$x -3 + sqrt(1-$f*$f) - $y;
}
proc float f3(float $x,float $y){
return 9-8*abs($x)-$y;
}
proc float f4(float $x,float $y){
float $abs_x = abs($x);
return $abs_x*3+.75-$y;
}
proc float f5(float $x,float $y){
return 2.25-$y;
}
proc float f6(float $x,float $y){
float $abs_x = abs($x);
float $f = $abs_x - 1;
return $s6s10/7 + (1.5-.5*$abs_x) - $s6s10/14 * sqrt(4-$f*$f) - $y;
}
proc float batmanEquation(float $x,float $y){
float $abs_x = abs($x);
float $abs_y = abs($y);
if ($x>-.5 && $x<.5)
return f5($x,$y)>0 && f2($x,$y)<0;
else if ($abs_x>.5 && $abs_x<=.75)
return f4($x,$y)>0 && f2($x,$y)<0;
else if ($abs_x>.75 && $abs_x<=1)
return f3($x,$y)>0 && f2($x,$y)<0;
else if ($abs_x>1 && $abs_x<=3)
return f6($x,$y)>0 && f2($x,$y)<0;
else if ($abs_x>3 && $abs_x<=4)
return f1($x,$y)<0 && f2($x,$y)<0;
else
return f1($x,$y)<0;
}
float $scale = 0.07;
float $u = (samplerInfo1.uCoord-.5)/$scale;
float $v = (samplerInfo1.vCoord-.5)/$scale;
float $BE = batmanEquation($u,$v);
if ($BE == 4)
ramp1.vCoord=0;
else if ($BE>0)
ramp1.vCoord= .5;
else
ramp1.vCoord=1;
清晰版: