アドプロ 2018.07.16

モデリングの自動化(2)

複雑な形状を効率的に生成する方法について, 今回はたくさんの練習問題に取り組もう.


球スイープ(sphere_sweep)

移動する球体が描く軌跡の形状である. これを使うと,チューブ(tube)的な物体を表現できる.

詳しくは, マニュアル 物体の形状→球スイープ を参照.

基本的な使用方法

まずは,正三角形をマクロとして作ってみよう: sweep.pov

...
// チューブの正三角形
// R:三角形の半径
// T:チューブの半径
#macro TubeTriangle(R, T)
object {
	sphere_sweep {
		linear_spline
		4				// 球(頂点)の個数
		<R*cos(0),      R*sin(0),      0>, T	// 座標 <x, y, z>, 半径
		<R*cos(2*pi/3), R*sin(2*pi/3), 0>, T
		<R*cos(4*pi/3), R*sin(4*pi/3), 0>, T
		<R*cos(0),      R*sin(0),      0>, T
	}
}
#end

object {
	TubeTriangle(1.0, 0.2)
	pigment { color NeonPink }
}
...
三角形なのになぜ頂点数が4なのか? 閉じたチューブを作る場合には, 明示的に,末尾の頂点を先頭の頂点に一致させる必要がある. (この基本形状 sphere_sweep では, 閉じていないものも作れるようになっている.)

なお,頂点座標の計算のために, 三角関数 sin()cos() を利用した. また,変数 pi は円周率(π=3.1415...)である.

他にどんな関数があるか? マニュアル 言語の基本→関数 を参照.

自動化

#while を併用して, N 角形のマクロを作ってみよう: sweep.pov に追加...

...
// チューブ細工
// T:チューブの半径
// V:頂点の3D座標の配列
// N:頂点の個数
#macro TubeWork(T, V, N)
object {
	sphere_sweep {
		linear_spline
		N			// 球(頂点)の個数
		#local I = 0;
		#while (I < N)
			V[I], T		// 座標,半径
			#local I = I + 1;
		#end
	}
}
#end

// チューブ細工の配置
#declare V = array[4] {
	<-1, -1, 0>,
	< 1, -1, 0>,
	<-1,  1, 0>,
	< 1,  1, 0>
}
object {
	TubeWork(0.2, V, 4)
	pigment { color Gold }
	translate ...		// 位置は適当に
}

// チューブの多角形
// R:ポリゴンの半径
// T:チューブの半径
// N:頂点の個数
#macro TubePolygon(R, T, N)
object {
	sphere_sweep {
		linear_spline
		N+1				// 球(頂点)の個数
		#local I = 0;
		#while (I <= N)
			#local A = 2*pi*I/N;
			#local X = R*cos(A);
			#local Y = R*sin(A);
			<X, Y, 0>, T		// 座標,半径
			#local I = I + 1;
		#end
	}
}
#end

// チューブ多角形の配置
object {
	TubePolygon(1.0, 0.2, 5)
	pigment { color NeonBlue }
	translate ...
}
...
N 角形なのになぜ頂点数が N+1 なのか? 同上.

ここで,#while の使い方について,奇妙に思われるかもしれない. C言語等の一般的なプログラミング言語の場合, 反復命令は,命令を繰り返すためだけにしか利用できない. 一方,POV-Ray では,データの繰り返しのためにも利用できる.

ところで,sphere_sweep の断面形状は真円であるが, 場合によっては,scale を適用し,楕円にも変更できるだろう. また,チューブの端を球ではなく円柱状にしたければ, cone 等で difference すればよいだろう. さらに,チューブを中空化したければ, ひと回り細いチューブを difference すればよいだろう. このように,他の基本形状と同様に,アレンジ(座標変換,CSG)も可能となっている.

練習問題

  1. TubeWork を利用して, 各自のイニシャル文字のオブジェクトを作成せよ.
  2. 余裕ある者は,sphere_sweep#while を利用して, 螺旋(spiral)やコイル(coil)等のマクロを定義せよ.

角柱(prism)

その名の通り角柱(prism)の他,角錐(cone)も作成できる.

詳しくは, マニュアル 物体の形状→角柱 を参照.

基本的な使用方法

まずは,正三角柱: prism.pov

...
// 正三角柱
// R:三角形の半径
// H:高さの半分
#macro TriPrism(R, H)
object {
	prism {
		linear_sweep
		linear_spline
		-H, +H				// y方向の範囲
		3				// 頂点の個数
		<R*cos(0),      R*sin(0)>	// <x, z>
		<R*cos(2*pi/3), R*sin(2*pi/3)>
		<R*cos(4*pi/3), R*sin(4*pi/3)>
	}
}
#end

object {
	TriPrism(1.0, 0.5)
	pigment { color NeonPink }
}
...
linear_spline の代わりに, cubic_spline 等を利用すれば, 断面の曲線化(側面の曲面化)も可能である. ただし,頂点の他に,曲線調整用の制御点の配置も必要となり, 手間がかかる.

自動化

では,N 角柱も作ろう. prism.pov に追加:

...
// 任意多角柱
// H:高さの半分
// V:2D頂点の配列
// N:頂点の個数
#macro ArbPrism(H, V, N)
object {
	prism {
		linear_sweep
		linear_spline
		-H, +H
		N
		#local I = 0;
		#while (I < N)
			V[I]
			#local I = I + 1;
		#end
	}
}
#end

#declare V = array[4] {
	<-1, -1>,
	< 1, -1>,
	<-1,  1>,
	< 1,  1>
}
object {
	ArbPrism(0.5, V, 4)
	pigment { color Gold }
	translate ...
}

// 正多角柱
// R:多角形の半径
// H:高さの半分
// N:頂点の個数
#macro PolyPrism(R, H, N)
object {
	prism {
		linear_sweep
		linear_spline
		-H, +H
		N
		#local I = 0;
		#while (I < N)
			#local A = 2*pi*I/N;
			#local X = R*cos(A);
			#local Z = R*sin(A);
			<X, Z>
			#local I = I + 1;
		#end
	}
}
#end

object {
	PolyPrism(1.0, 0.5, 5)
	pigment { color NeonBlue }
	translate ...
}
...

練習問題

  1. ArbPrism を利用して, 各自のイニシャル文字のオブジェクトを作成せよ.
  2. 余裕ある者は,prism#while を利用して, 歯車(gear)のマクロを定義せよ.
  3. 現実の歯車の歯の部分の形状は複雑な曲面から構成されている. 折れ線近似により単純化し,山と谷の2頂点について反復すればよいだろう.

回転体(lathe)

旋盤やロクロのように,回転対称な形状を作成できる.

詳しくは, マニュアル 物体の形状→回転体 を参照.

練習問題

  1. lathe を利用して, 格好良いグラス(glass)や瓶(bottle)のオブジェクトを作成せよ.
  2. 余裕ある者は,lathe#while を利用して, 任意断面形状の輪(ring)のマクロを定義せよ.
  3. ring は,断面形状を円(∞角形)とすれば torus に一致する.

本日の課題

本日学んだ技を利用して,ある程度に複雑な形状の物体を #macro または #declare で定義せよ.

なお,sphere_sweepprism, あるいは lathe を1つ以上は利用し, 複数の基本形状を組み合わせること.

また,題材としては,実在する(実在しそうな)物体をモデルとすること. 人工物でも自然物でもよいし,その物体の全体でも一部分でもよい.

例;prism から多数の sphere を difference して エメンタールチーズ(穴あきチーズ)とか, cone から coil を difference して ネジとか,

担当教員へレポートを送信せよ:


(c) 2018, yanagawa@kushiro-ct.ac.jp