シェーディングネットワーク 2 (爆発アニメーション)

爆発のアニメーション

ディスプレイスメント マッピングされた球をアニメーションさせることによって、 爆発のエフェクトを作成してみましょう。
フラクタル と ランプ シェーダ を使用して色を決め、 ディスプレイスメント マッピングによって凹凸をつけます。
アニメーションにはエクスプレッションとキーフレームを併用します。

爆発のアニメーションの作り方

ここでは、240 フレームでアニメーションを作成します。

  1. NURBS の球体を作成します。
    NURBS 球
  2. NURBS の球にキーフレームを設定します。
    最初の 20 〜 30 フレームくらいでスケールが 1.0 になるくらいのスピードで大きくします。
    フレーム スケール X, Y, Z
    1 0.0
    4 0.5
    25 0.9
    240 1.3
  3. サーフェス シェーダを作成します。
  4. ランプ シェーダ を作成し、サーフェス シェーダ にコネクトします。
    ランプ シェーダ の outColor を サーフェス シェーダ の outColor にコネクトします。
    サーフェス シェーダ
    ランプ シェーダ の outColor を サーフェス シェーダ の outGlowColor にコネクトすれば、 グローの効果も与えることができますが、 全体が明るくなりすぎるかもしれません。
  5. フラクタル を作成し、ランプ シェーダ にコネクトします。
    フラクタル の outColorR を ランプ シェーダ の vCoord にコネクトします。
    Hypershade
  6. フラクタル のアトリビュートを適当に設定します。
    フラクタル の Attribute Editor
    フラクタル の Attribute Editor
    Color Gain は RGB を (5.0, 5.0, 5.0) にします。
  7. フラクタル の time アトリビュートにエクスプレッションを定義します。
    fractal1.time = 0.1 * sind(frame/2.6);
  8. フラクタル にコネクトされている place2dTexture のアトリビュートを適当に設定します。
    フラクタル の Attribute Editor
  9. フラクタル にコネクトされている place2dTexture の offsetU アトリビュートにエクスプレッションを定義します。
    offsetU = 0.02 * time;
  10. ランプ シェーダ の colorGainR にキーフレームを打ちます。
    フレーム colorGainR
    1 0.0
    2 3
    5 0.5
    7 2.0
    10 1.2
    240 1.0

    colorGainR の Graph Editor
  11. colorGainR にコネクトされた animCurveTU の output を ランプ シェーダ の colorGainG と colorGainB にコネクトします。
    先に作成されていた colorGainG と colorGainB の animCurveTU は消しておきます。
    フラクタル の Attribute Editor
  12. ランプ シェーダ の alphaGain にキーフレームを打ちます。
    この alphaGain と、以下にでてくる alphaOffset は ディスプレイスメント マッピングの凹凸を逆向きにするために使用します。
    フレーム alphaGain
    1 0.0
    6 -0.2
    240 -0.425

    colorGainR の Graph Editor
  13. 乗算除算 を作成します。
  14. ランプ シェーダ の alphaGain にコネクトされた animCurveTU の output を 乗算除算 の input1X にコネクトします。
    Hypershade
  15. 乗算除算 の 操作 を 乗算 にし、input2 の X を -1 にします。
    Multipe Divide の Attribute Editor
  16. 乗算除算 の outputX を ランプ シェーダ の alphaOffset にコネクトします。
    Hypershade
  17. ランプ シェーダ の色を適当に決定し、各位置で 選択した位置 にキーを打ちます。
    これが、1 フレーム目の色になります。
    ランプ シェーダ の Attribute Editor(1 フレーム目)
  18. カレントフレームを 240 に移動して、ランプ シェーダ の色の位置を変更し、各位置で 選択した位置 にキーを打ちます。
    アニメーションの最後に全体の色を暗くするためです。
    ランプ シェーダ の Attribute Editor(240 フレーム目)
  19. ディスプレースメントマップをかけます。
    ディスプレイスメント を作成し、ランプ シェーダ の outAlpha を ディスプレイスメント の displacement にコネクトし、 ディスプレイスメント の displacement を surfaceShader1SG の displacementShader にコネクトします。
    ディスプレイスメント
  20. アニメーションをレンダリングします。

使用するプロシージャの例

global proc string [] makeSurfaceShader(string $obj)
{
	string $sname[];

	$sname[0] = `shadingNode -asShader surfaceShader`;
	$sname[1] = `sets -renderable true -noSurfaceShader true -empty`;
	connectAttr -f ($sname[0] + ".outColor") ($sname[1] + ".surfaceShader");
	select $obj;
	sets -e -forceElement $sname[1];
	return $sname;
}

global proc makeDisplacementShader(string $dest, string $src)
{
	string $dsname = `shadingNode -asShader displacementShader`;
	string $dname = `sets -renderable true -noSurfaceShader true -empty`;
	connectAttr -f ($dsname + ".displacement") ($dname + ".displacementShader");
	connectAttr -f ($dest + ".outAlpha") ($dsname + ".displacement");
	connectAttr -f ($dsname + ".displacement") ($src + ".displacementShader");
}

global proc string [] make2dTexture(string $name)
{
	string $sname[];

	$sname[0] = `shadingNode -asTexture $name`;
	$sname[1] = `shadingNode -asUtility place2dTexture`;
	connectAttr ($sname[1] + ".outUV") ($sname[0] + ".uv");
	connectAttr ($sname[1] + ".outUvFilterSize") ($sname[0] + ".uvFilterSize");
	return $sname; 
}

global proc makeKeyframe(int $keys[], float $vals[], string $obj, string $attr)
{
	int $i = 0;
	for($k in $keys)
	{
		currentTime $k;
		setAttr ($obj + "." + $attr) $vals[$i];
		setKeyframe -at $attr $obj;
		$i++;
	}
}

global proc makeKeyframe3(int $keys[], float $vals[], string $obj, string $attr)
{
	int $i = 0;
	for($k in $keys)
	{
		currentTime $k;
		setAttr ($obj + "." + $attr) -type double3 $vals[$i] $vals[$i] $vals[$i];
		setKeyframe -at $attr $obj;
		$i++;
	}
}

global proc setAllAttr(string $name, string $attrs[], float $vals[])
{
	int $i = 0;

	for($attr in $attrs)
	{
		setAttr ($name + "." + $attr) $vals[$i];
		$i++;
	}
}

global proc setAllAttr3(string $name, string $attrs[], float $vals1[], float $vals2[], float $vals3[])
{
	int $i = 0;

	for($attr in $attrs)
	{
		setAttr ($name + "." + $attr) -type double3 $vals1[$i] $vals2[$i] $vals3[$i];
		$i++;
	}
}

global proc makeMultiplyDivide(string $ramp)
{
	string $mname = `shadingNode -asUtility multiplyDivide`;
	string $obj[] = `listConnections ($ramp + ".alphaGain")`;
	connectAttr -f ($obj[0] + ".output") ($mname + ".input1X");
	setAttr ($mname + ".input2X") -1;
	connectAttr -f ($mname + ".outputX") ($ramp + ".alphaOffset");
}

課題

参考


Next
Index | Home
Mail