3dto3dでワイヤーフレームのオブジェクトを作る。


3dto3dは、 Thomas Baierさんが作った3dファイルのコンバータです。 POV用のワイヤーフレームオブジェクトを作れます。 (円柱と球でできてます。) 3dto3dでワイヤーフレームのオブジェクトにコンバートする時の 注意点を書きます。(あまりないですが。)

まず、モデラーでオブジェクトを3dto3dに読み込める形式で保存します。 (dxf,raw,objなど)
次に、コマンドラインから
3dto3d hogehoge.dxf  /if4 /of8 /or0.01 /oe0.0
などとします。 始めの/ifはinputファイルの形式です。4はdxfの意味です。 /ofはoutputファイルの形式です。ワイヤーフレームの場合は8にします。 /orはワイヤーフレームで使う円柱、球の半径です。 /oeは、良く分からないのですがこれを入れておかないとワイヤーフレームが 所々抜けてしまいます。ワイヤーフレームの場合は必ずこれを指定します。 そうすると、hogehoge.incというファイルができるので、 ふつうにPOVでレンダリングすればいいです。
…と思ったのですが、うまくいきませんでした。 円柱の指定は、
cylinder{座標,座標,半径}
となるはずですが、(始めの二つの座標で底面二つの中心を指定する。 半径は、円柱の半径。) なぜか、二つの座標が同じになっている円柱が沢山出てしまいます。 (これは元のファイルによる?それともバグ?) ともかく、このままPOVに読み込むとエラーが出ます。 これをどうにかして取り除かなければなりません。 簡単なプログラムを書けば取り除けます。 僕は面倒なのでPerlで書きました。


##repair.pl
##perl repair.pl filename > newfile

if(!open(IN, $ARGV[0])){
	print("IREGAL!!\n");
	exit();
}

while($line = <IN>){
	$temp = $line;
	$temp =~ s/\s//g;
	if($temp !~ /^cylinder\{([^\{\}]*)\}/){
		print "$line";
		next;
	}
	$temp = $1;
	($a, $b) = split(/>,/, $temp);
	if($a eq $b){
		print "//";
		print "$line";
	}else{
		print "$line";
	}
}
close(IN);


このスクリプトは、両底面の座標が全く同じになってしまっている 円柱をコメントアウトします。
perl repair.pl hoge.inc > newhoge.inc
とでもして使って下さい。Perlインタプリタは、Vector等で 簡単に手に入ります。 これでめでたく完璧なワイヤーフレームができます。