RenderManのお勉強(変換)


複雑な形状を作ったり、動きを決めるためには、変換の考え方が重要となります。
RenderManでの複数の変換の合成は、最後に実行されたものが最初に図形に適用されるという形で行われます。

連続した移動

複数回の移動を行った場合について見てみます。

連続した移動のサンプル

# moving01.rib
Display "moving01.tiff" "file" "rgba"
Projection "perspective" 
WorldBegin
	Translate 0 0 2
	Translate -1 0 0
	Color [1 0 0]
	Sphere 1 -1 1 360   # 赤色の球
	Translate 1 0 0
	Color [0 1 0]
	Sphere 1 -1 1 360 # 緑色の球
WorldEnd

実行例



説明

  1. 直感的には、このサンプルは次のようになるように思うかもしれませんが、全ての変換がつながっているので、実行例のようになります。
  2. Translateなどの変換は、最後に実行されたものが最初に図形に適用されます。従って、緑色の球を描くためには、「Traslate 1 0 0」→「Translate -1 0 0」→「Translate 0 0 2」の順になり、赤色の球を描くためには、「Translate -1 0 0」→「Translate 0 0 2」の順で変換が適用されていきます。そのため、緑色の球の中心は(0,0,2)=(1+(-1)+0,0+0+0,0+0+2)、赤色の球の中心は(-1,0,2)=(1+0,0+0,0+2)となります。
  3. 「最後に実行されたものが最初に図形に適用」されるということは、直感的には理解しづらいかもしれませんが、きちんと理解するようにしてください。Translateだけを扱っている際には、問題はおきませんが。RenderManではこのような適用方法となっていますが、「最後に実行されたものが、最後に適用される」というシステムもあります。

演習

  1. 上の実行例のようにするためには、どのようにすればよいでしょうか?

変換のグループ化


変換のグループ化のサンプル

# moving02.rib
Display "moving02.tiff" "file" "rgba"
Projection "perspective" 
WorldBegin
# 全体を2だけ後ろを移動させる
	Translate 0 0 2
	TransformBegin # 現在の状況(座標系の)を保存
		Translate -1 0 0
		Color [1 0 0]
		Sphere 1 -1 1 360
	TransformEnd  #保存した状況(座標系の)に戻す
	TransformBegin # 現在の状況(座標系の)を保存
		Translate 1 0 0
		Color [0 1 0]
		Sphere 1 -1 1 360
	TransformEnd # 保存した状況(座標系の)に戻す
WorldEnd

実行例



説明

  1. 「連続した移動」の2つ目の画像を得るためには、赤色の球を描くためには移動させられた座標系を考慮に入れて、緑色の球を動かす必要があります。上のサンプルでは、赤色の球を描くための変換が複雑なものではなかったので、割と簡単に緑色の球のための変換を求めることが出来ました。一般には面倒なことがあるので、現在の座標系の状況を一時的に保管しておいて利用するための方法()が用意されています。これが、TransformBeginとTransformEndです。
  2. TransformBeginは現在の座標系の状況を保存します。スタック(stack)にプッシュ(push)すると言った方が正確です。
  3. TransformEndは保存されている座標系の状況を取り出し、現在の座標系の状況とします。スタック(stack)からポップ(pop)すると言った方が正確です。
  4. TransformBeginとTransformEndはペアで利用します。スタックのプッシュとポップの回数が一致しないと面倒なことになりますから。

回転移動

今まで出てきた変換は平行移動(Translate)だけでしたが、これ以外にいくつかのものが用意されています。そのうちの一つが回転移動(Rotate)です。

回転移動のサンプル

# moving03.rib : rotate sample rib file
Display "moving03.tiff" "file" "rgba"
Projection "perspective" 
WorldBegin
	Translate 0 0 2
	Rotate -90 1 0 0
	Cylinder 1 -1 1 360
WorldEnd

実行例



説明

Rotateの呼び出し方
Rotate angle, dx,dy,dz

  1. 回転移動にためにRotateコマンドが用意されています。angleで回転角度を指定し、(dx,dy,dz)で回転軸を指定します。 
  2. "Rotate -90 1 0 0"は、x軸(1,0,0)を中心に-90度回転を意味しています。そのため、z軸方向が高さ方向となっている円柱が起き上がって、表示されています。

回転移動と円錐

Rotateの回転角度の正負は通常のように定められています。ただし、円柱では確認しづらいので、円錐で確認してみることにします。

円錐のサンプルその1(負の回転角度)

# cone01.rib 
Display "cone01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
	Translate 0 0 2
	Rotate -90 1 0 0

	Cone 2 1 360
WorldEnd

円錐のサンプルその1の実行例



円錐のサンプルその2(正の回転角度)

# cone01.rib 
Display "cone01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
	Translate 0 0 2
	Rotate 90 1 0 0

	Cone 2 1 360
WorldEnd

円錐のサンプルその2の実行例



説明

Coneの呼び出し方
Cone height radius thetamax


  1. "Cone height radius thetamax"によって底面の半径radius、高さheightの円錐を作り出すことができます。底面はxy平面上にあり、原点が中心となっています。高さはz軸方向に作られます。thetamaxによって円錐の作られる範囲が決定されます。なお、円柱と同じように底面は空いています。
  2. サンプルその1では、回転角度が負になっていますので、円錐が立ち上がったような画像が生成されます。
  3. サンプルその2では、回転角度が正になっていますので、底面が上にくるような円錐の画像が生成されます。

演習

  1. 回転角度を色々と変えて、レンダリングをしてみてください

拡大・縮小変換

物体形状の拡大・縮小変換を扱います。

拡大・縮小のサンプル

# scale01.rib
Display "scale01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
	Translate 0 0 2.5
	Scale 1.5 2 0.5
	Sphere 1 -1 1 360
WorldEnd

実行例



説明

Scaleの呼び出し方
Scale sx sy sz
  1. "Scale sx sy sz"によって、物体形状にx軸方向にsx倍、y軸方向にsy倍、z軸方向にsz倍する変換を施すことができます。
  2. このサンプルでは、球をx軸方向に1.5倍、y軸方向に2倍、z軸方向に0.5倍したものが描かれています。実行例では、z軸方向の変化は確認しづらいと思います。
  3. "Translate 0 0 2"では、細長い球形状の上と下の分が少し切れてしまうので、今回は"Translate 0 0 2.5"としています。

演習

  1. Scaleの引数を色々と変えて、レンダリングをしてみてください。
  2. "Translate 0 0 2"では、細長い球形状の上と下の分が少し切れてしまう理由を考えてみてください。視野角は変更していないので90度となっているので、普通に考えると、ぎりぎり上と下が描かれるように思えるのですが。。。

せん断変換

物体形状を斜めにするようなせん断変換を扱います。

せん断変換のサンプル

# skew01.rib
Display "skew01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
	Translate 0 0 2               # (4)
	Rotate -90 1 0 0            # (3)
	Skew 30 0 0 1 1 0 0       # (2)
	Cone 1.5 1s 360             # (1)
WorldEnd

実行例



説明

Skewの呼び出し方
Skew angle dx1 dy1 dz1 dx2 dy2 dz2
  1. "Skew angle dx1 dy1 dz1 dx2 dy2 dz2"によって、物体表面上の点がベクトル(dx2,dy2,dz2)方向に移動します。この時、ベクトル(dx1,dy1,dz1)がベクトル(x,y,z)に移動したとすると、ベクトル(dx1,dy1,dz1)とベクトル(x,y,z)のなす角がangleとなるように全体の変換が決められています。簡単に言うと、ベクトル(dx2,dy2,dz2)方向に、ベクトル(dx1,dy1,dz1)をangle度だけ傾けるような変換です。
  2. このサンプルでは、円錐に対してSkewを適用しています。"Skew 30 0 0 1 1 0 0"となっているので、z軸(0,0.1)をx軸方向(1,0,0)に30度傾けたような変換になっています。この変換を適用しただけでは、変化の状況が確認できなので、"Rotate -90 1 0 0"で、傾いた円錐をカメラから見えるようにしています。
  3. 今回のサンプルは少し複雑に変換が組み合わさっているので、一つ一つの動きを描いてみました。原点の位置にカメラがあると思ってください。赤色の軸がx軸、緑色の軸がy軸、青色の軸がz軸となっています。まず、第1段階:円錐を作りだし、第2段階:それにSkew変換を適用し、第3段階:それをx軸を中心に回転(Rotate)させることで立ち上げます、第4段階:その後Translateによって2だけ後ろに移動させて完成です。
第1段階(1)

第2段階(2)

第3段階(3)

第4段階(4)(これで完成)


変換は順序が大切

一般的には、変換は適用する順番を変えると別な変換になってしまいます。これは、CGで用いられる変換は行列で表されており、変換を連続して行うことは、行列のかけ算に対応しています。一般的に行列のかけ算はかける順番を変えると結果が変わってしまうので、変換も順番が変わるとその結果が変わってしまいます。

サンプルその1とサンプルその2では、円柱を回転させる時に、円柱の位置が異なっているので、実行結果が変わっています。

変換は順序が大切のサンプルその1

# moving04.rib
Display "moving04.tiff" "file" "rgba"
Projection "perspective" 
WorldBegin
	Translate 0 0 4     #(4)
	Translate 0 1 0                #(3)
	Rotate -90 1 0 0              #(2)
	Color [1 1 1]
	Cylinder 1 -1 1 360         #(1)
WorldEnd

「変換は順序が大切のサンプルその1」の実行例



「変換は順序が大切のサンプルその1」の説明

  1. 一つ一つの動きを描いてみました。原点の位置にカメラがあると思ってください。赤色の軸がx軸、緑色の軸がy軸、青色の軸がz軸となっています。まず、第1段階:円柱(Cylinder)を作りだし、第2段階:それをx軸を中心に回転(Rotate)させることで立ち上げます、第3段階:それをTranslateによってy軸方向に1だけ持ち上げます、第4段階:その後Translateによって2だけ後ろに移動させて完成です。
第1段階(1)

第2段階(2)

第3段階(3)

第4段階(4)(これで完成)


変換は順序が大切のサンプルその2

# moving05.rib
Display "moving05.tiff" "file" "rgba"
Projection "perspective" 
WorldBegin
	Translate 0 0 4     # (4)
	Rotate -90 1 0 0              # (3)
	Translate 0 1 0                #(2)
	Cylinder 1 -1 1 360        #(1)
WorldEnd

変換は順序が大切のサンプルその2の実行例



「変換は順序が大切のサンプルその2」の説明

  1. 一つ一つの動きを描いてみました。原点の位置にカメラがあると思ってください。赤色の軸がx軸、緑色の軸がy軸、青色の軸がz軸となっています。まず、第1段階:円柱(Cylinder)を作りだし、第2段階:それをTranslateによってy軸方向に1だけ持ち上げます、第3段階:それをx軸を中心に回転(Rotate)させることで立ち上げます、第4段階:その後Translateによって2だけ後ろに移動させて完成です。
第1段階(1)

第2段階(2)

第3段階(3)

第4段階(4)(これで完成)


おまけ

  1. CGで利用される変換は行列で表されています。そこで、RenderManではこの行列を直接していするための命令Transformが用意されています。さらに、自分で決めた行列に基づく変換を適用するための命令ConcatTransformも用意されています。

Topページに戻る
2008年02月02日(土) 17:12:55 Modified by m_riho

添付ファイル一覧(全23件)
caa19d4ab113cb62.jpg (9.71KB)
Uploaded by m_riho 2008年01月03日(木) 00:16:30
06c3ec7117926723.jpg (2.89KB)
Uploaded by m_riho 2008年01月03日(木) 00:16:29
4e778195daacae7e.jpg (11.42KB)
Uploaded by m_riho 2008年01月01日(火) 21:47:21
535ffa07b0397e33.jpg (10.40KB)
Uploaded by m_riho 2008年01月01日(火) 21:47:21
0ade520d95522977.jpg (10.33KB)
Uploaded by m_riho 2008年01月01日(火) 21:47:21
6e6ee727.jpg (11.61KB)
Uploaded by m_riho 2008年01月01日(火) 21:46:06
5acffadd.jpg (10.37KB)
Uploaded by m_riho 2008年01月01日(火) 21:45:34
693133cd.jpg (10.35KB)
Uploaded by m_riho 2008年01月01日(火) 21:44:10
26b02c1e.jpg (10.03KB)
Uploaded by m_riho 2008年01月01日(火) 21:43:24
9dd2ccd0.jpg (4.22KB)
Uploaded by m_riho 2008年01月01日(火) 21:36:27
34f00a89.jpg (3.23KB)
Uploaded by m_riho 2008年01月01日(火) 21:34:25
7d7ae48f.jpg (11.13KB)
Uploaded by m_riho 2008年01月01日(火) 20:54:32
b266cbc6.jpg (11.14KB)
Uploaded by m_riho 2008年01月01日(火) 20:53:27
aada834a.jpg (10.12KB)
Uploaded by m_riho 2008年01月01日(火) 20:52:50
d0819297.jpg (11.15KB)
Uploaded by m_riho 2008年01月01日(火) 20:52:15
9402f403.jpg (11.14KB)
Uploaded by m_riho 2008年01月01日(火) 20:49:53
bf747a0f.jpg (4.34KB)
Uploaded by m_riho 2008年01月01日(火) 20:30:58
92d1e843.jpg (38.36KB)
Uploaded by m_riho 2008年01月01日(火) 19:50:34
6e0cd5f5.jpg (46.58KB)
Uploaded by m_riho 2008年01月01日(火) 19:26:18
6e44919c.jpg (35.34KB)
Uploaded by m_riho 2008年01月01日(火) 19:15:08
4bbb7916.jpg (35.32KB)
Uploaded by m_riho 2008年01月01日(火) 19:00:39
7362e834.jpg (37.82KB)
Uploaded by m_riho 2008年01月01日(火) 14:04:21
46346176.jpg (45.26KB)
Uploaded by m_riho 2008年01月01日(火) 13:37:04



スマートフォン版で見る