RenderManのお勉強(CSG)


CSGとは??

CSGはconstructive solid geometryの略です。数学で出てくる集合演算(和集合、共通集合、差集合を作り出す演算)を物体形状に適用する方法です。プリミティブ(primitive)と呼ばれる基本物体に集合演算を順々に適用していき、複雑な形状を作っていくものです。
集合は、それに属するものと属さないものの区別がきちんと出来るものです。それと同じように、CSGで利用される形状(primitive)も、物体の内部と外部がきちんと区別出来るものであることが必要となります。

union和集合与えられた形状を全て合体させた形状を作り出す。
intersection共通集合与えられた形状が重なっている部分から出来ている形状を作り出す。
difference差集合1番目の形状から2番目以降の形状を削り取ってできる形状を作り出す。

RenderManでCSG

RenderManでCSGを利用するためには、SolidBeginとSolidEnd命令を利用します。これは、WorldBeginとWorldEndのようにペアにして利用します。SolidEndは引数をとりません。
SolidBeginの呼び出し方
SolidBegin operation
operationには、"primitive","union","intersection","difference"のうちのどれかを指定します。

RenderManで用意されてい形状は、Cylinderなどのように閉じていないものが多くあります。そこで、"primitive"を利用してプリミティブを作り出します。このときに、SolidBeginとSolidEndの間には様々な形状の定義を並べることが出来ますが、出来上がる形状は完全に閉じているものになっていることが必要です。SolidBegin〜SolidEndは入れ子構造にすることが出来ます。しかし、"primitive"の場合には、間にSolidBegin〜SolidEndを入れることは出来ません。

以下のサンプルでは、球と円柱を利用しています。Cylinderで作り出しただけでは、穴の空いた筒になっているので、閉じるためにDiskを利用して蓋をしています。「Disk -2 0.5 -360」は、法線ベクトルをz軸の負の方向にするために、-360としています。
Pixieは集合演算をサポートしていないようなので、Aqsisを利用してレンダリングを行っています。

union

球と円柱を合体させた形が出来上がります。普通に球と円柱を書いたのと変わらない画像となっています。

unionのサンプル

# union01.rib : 
Display "uinon01.tiff" "file" "rgba"
Projection "perspective"
Translate 0 0 2
WorldBegin
	Rotate -90 1 0 0
	SolidBegin "union"
		SolidBegin "primitive"
			Color [1 0 0]
			Sphere 1 -1 1 360
		SolidEnd
		SolidBegin "primitive"
			Color [0 1 0]
			Disk 2 0.5 360
			Cylinder 0.5 -2 2 360
			Disk -2 0.5 -360    # 法線ベクトルをz軸の負の方向にするため
		SolidEnd
	SolidEnd
WorldEnd

unionの実行例



intersection

球と円柱の共通部分となっている形状が出来上がります。

intersectionのサンプル

# intersection01.rib : 
Display "intersection01.tiff" "file" "rgba"
Projection "perspective"
Translate 0 0 2
WorldBegin
	Rotate -90 1 0 0
	SolidBegin "intersection"
		SolidBegin "primitive"
			Color [1 0 0]
			Sphere 1 -1 1 360
		SolidEnd
		SolidBegin "primitive"
			Color [0 1 0]
			Disk 2 0.5 360
			Cylinder 0.5 -2 2 360
			Disk -2 0.5 -360    # 法線ベクトルをz軸の負の方向にするため
		SolidEnd
	SolidEnd
WorldEnd

intersectionの実行例



difference

球から円柱を取り除いた形が出来上がります。穴が空いていることを確認するために、回転角度を上のサンプルとは変えています。

differenceのサンプル

# difference01.rib : 
Display "difference01.tiff" "file" "rgba"
Projection "perspective"
Translate 0 0 2
WorldBegin
	Rotate -20 1 0 0
	SolidBegin "difference"
		SolidBegin "primitive"
			Color [1 0 0]
			Sphere 1 -1 1 360
		SolidEnd
		SolidBegin "primitive"
			Color [0 1 0]
			Disk 2 0.5 360
			Cylinder 0.5 -2 2 360
			Disk -2 0.5 -360    # 法線ベクトルをz軸の負の方向にするため
		SolidEnd
	SolidEnd
WorldEnd

differenceの実行例



ちょっとした例題(灰皿もどき)

CSGの例題として、灰皿もどきを作ってみました。同じような形状を繰り返し使うときに便利な、ObjectBegin〜ObjectEndとObjectInstanceを使ってみました。

例題のribファイル

# csg01.rib : CSG sample rib file
Display "csg01.tiff" "file" "rgba"
Projection "perspective" "fov" [60]
Translate 0 0 7
WorldBegin
	Rotate -120 1 0 0
	LightSource "pointlight" 1
	            "intensity" [6]
	            "from" [0 0 2]
	LightSource "ambientlight" 2
	            "intensity" [0.4]

	Surface "plastic"
	ObjectBegin 1      # 小さな円柱の定義
		SolidBegin "primitive"
			Disk 1 0.3 360
			Cylinder 0.3 -1 1 360
			Disk -1 0.3 -360
		SolidEnd
	ObjectEnd
	SolidBegin "difference"
		SolidBegin "difference"
			SolidBegin "primitive"
				Color [0 1 0]
				Disk 1 4 360
				Cylinder 4 0 1 360
				Disk 0 4 -360
			SolidEnd
			SolidBegin "primitive"
				Color [1 0 0]
				Disk 1.01 3.8 360
				Cylinder 3.8 0.1 1.01 360 
				Disk 0.1 3.8 -360
			SolidEnd
		SolidEnd

		TransformBegin
			Translate 0 -4 1
			Rotate 90 1 0 0
			Color [0 1 1]
			ObjectInstance 1 # 小さな円柱を作り出す
		TransformEnd
		TransformBegin
			Rotate 120 0 0 1
			Translate 0 -4 1
			Rotate 90 1 0 0
			Color [1 0 1]
			ObjectInstance 1 # 小さな円柱を作り出す
		TransformEnd
		TransformBegin
			Rotate 240 0 0 1
			Translate 0 -4 1
			Rotate 90 1 0 0
			Color [1 1 0]
			ObjectInstance 1 # 小さな円柱を作り出す
		TransformEnd
	SolidEnd
WorldEnd

実行例



説明

ObjectBeginの呼び出し方
ObjectBegin sequencenumber
ObjectEndの呼び出し方
ObjectEnd
ObjectInstanceの呼び出し方
ObjectInstance sequencenumber

  1. 灰皿の例題は、緑色の大きな円柱から赤色の円柱を利用してくり抜き、小さいな円柱の位置を120度ずつ移動させながら縁の部分を切り取ることで実現しています。
  2. OjbectBegin〜ObjectEndの間で定義した形状をObjectInstance命令で呼び出すことが出来ます。この例題では、小さな閉じた円柱をsequencenumberを1としたもので定義しています。
  3. 「ObjectBegin sequencenumber」のsequencenumberには0から5535までの数字を指定できます。
  4. それぞれのパーツの配置状況は下の図のようになっています。


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

添付ファイル一覧(全5件)
288a9e67.jpg (9.42KB)
Uploaded by m_riho 2008年01月06日(日) 01:19:19
97c24b44.jpg (8.84KB)
Uploaded by m_riho 2008年01月06日(日) 01:16:02
ecfc480b.jpg (5.60KB)
Uploaded by m_riho 2008年01月05日(土) 23:22:46
0f1daf4f.jpg (4.03KB)
Uploaded by m_riho 2008年01月05日(土) 22:50:32
02c7d547.jpg (5.36KB)
Uploaded by m_riho 2008年01月05日(土) 22:44:12



スマートフォン版で見る