アドプロ 2016.07.14

モデリングの自動化(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なのか? 閉じたチューブを作る場合には, 明示的に,末尾の頂点を先頭の頂点に一致させる必要がある.

ちなみに,POV-Ray では,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 なのか? (ry

練習問題

  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 }
}
...

自動化

では,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)を作成せよ.

回転体(lathe)

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

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

練習問題

  1. lathe を利用して, 格好良いグラス(glass)や瓶(bottle)を作成せよ.
  2. lathe#while を利用して, 輪(ring)を作成せよ.
  3. ring は,torus と似ているが, 断面形状を自由にデザインできるのが特徴.

本日の課題

本日学んだ技を利用して,複雑な形状の物体を定義せよ.

題材は自由であるが,必ず,実在する物体をモデルとすること. (人工物でも自然物でもよいし,全体でも部分でもよい.)

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


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