Hamalガイド

3501 ワード

概要
HamalはPython 3スクリプトで、ポイントセット、無方向図、カーブ、ベクトルフィールド、メッシュサーフェスなどの3 DジオメトリデータをPOV-Rayシーンファイルに変換します.つまり、Hamalはデータを生産せず、グラフィックレンダリングも担当せず、POV-Rayを理解し、POV-Rayを使用して上記の3 Dジオメトリを光線追跡レンダリングしたい人向けのデータフォーマット変換器としか言えません.
インストール
$ git clone https://github.com/liyanrui/hamal.git
$ cd hamal
$ chmod +x hamal
$ sudo install hamal /usr/local/bin

ポイントセット
レンダリングされる3 Dポイントセットデータは、ASCII符号化テキストファイルに格納されるべきであり、ファイルの各行のテキストは、3 Dポイント座標のフォント値である.たとえば、次のようにします.
1.2 3.3 5.4
0.1 2.2 8.5
... ... ...

3 Dポイントセットのデータファイルがfooであると仮定する.ascは、以下のコマンドによりPOV-Rayシーンファイルfooに変換することができる.povとfoo.inc:
$ hamal foo.asc

このコマンドは現在のディレクトリでfooを生成します.povとfoo.incは、前者がビューファイル、後者がPOV-Rayモデルファイルであるpovrayコマンドを用いるfooに基づくことができる.povとfoo.incでポイントセットをレンダリングするには:
$ povray foo.pov

レンダリング結果は、現在のディレクトリの下にあるビットマップファイルfooである.png.例:
Hamalのデフォルトのポイントのサイズは0.0025です.次のコマンドでは0.005に設定できます.
$ hamal --point-size=0.005 foo.asc

新たに生成するfooをpovrayで再処理する.png、結果は以下の通りです.
注:実際、ポイントのサイズをxとすると、ポイントのPOV-Rayにおける実際のサイズはx*r、rはポイントセットのほぼ最小の外接球の半径となります.
ポイントセットは、後述する無方向図、ベクトルフィールド、およびメッシュの「ソリッド」です.
むきず
ポイントセットデータファイルfooについて.asc,対応点セットのユークリッド最小支持ツリー(EMST)を算出したと仮定すると,EMSTはツリーであり,無方向図でもある.EMSTのデータがfoo-graphに保存するとする.ascファイル、このファイルの各行はEMSTの1辺の2つの端点で、ただ記憶するのは点座標ではなくfooである.ascファイルの対応点座標の行番号はfooにすぎない.ascの最初の行の行番号は0から始まります.foo.ascはC言語のn行3列の2次元配列と見なすと理解しやすいかもしれません.例:
0 1
1 15677
15677 12881
12881 12849
... ...

無方向図を描くには、無方向図データをPOV-Rayに変換するときに、ポイントセットデータファイルと無方向図データファイルをロードする必要があります.
$ hamal --graph=foo-graph.asc foo.asc

次にpovrayを使用して新しいfoo.povで処理すると、EMSTのレンダリング結果が得られます.
結果は、点セットが非常に密集しているため、上述した点セットモデルのレンダリング結果とあまり差がないようです.修正するとfoo.povは、カメラをポイントセットに近づけることで、EMSTの局所分岐を見極めることができます.
fooを開きます.pov,将
camera {
  location <0, 0, -2 * model_radius> + model_center * z
  look_at <0, 0, 0>
  translate view_center
}

次のように変更します.
camera {
  location model_center * z
  look_at <0, 0, 0>
  translate view_center
}

上記の変更は、カメラがz軸正方向に2*model_移動したことを意味します.radiusユニットは、カメラをEMSTに近づけることを繰り返します.povrayでfooを再処理する.pov,得られる:
ポイントのサイズと最初の幅が大きすぎるようです.サイズを小さく設定できます.たとえば、hamalを使用してPOV-Rayシーンファイルを生成するときにサイズを小さく設定できます.
$ hamal --graph=foo-graph.asc --point-size=0.001 --line-width=0.0005 foo.asc

結果:
曲線
1つのカーブを離散化して、先頭と末尾に接続されたセグメントのセットを形成します.これにより、無方向図を構成し、前のセクションで無方向図をレンダリングする方法でカーブのレンダリングを行うことができます.
次の図は、3回のBezierカーブのレンダリング結果です.
ベクトル場
ベクトルフィールドは、fooのような上記の点セットファイルの始点であるベクトルのセットである.ascは、foo-vector-fieldなどのベクトルフィールドファイルに格納される.asc.ベクトルフィールドファイルのフォーマットはポイントセットファイルと同じです.
次のコマンドは、ベクトルフィールドをPOV-Rayシーンファイルに変換します.
$ hamal --vector-field=foo-vector-field.asc --point-size=0.001 --line-width=0.0005 foo.asc

前節のようにfooを修正する.povファイルは、カメラとモデルの間の距離を近づけ、結果は次のようになります.
メッシュ(Mesh)
プレゼンテーションを容易にするために、次のコマンドでは、qhullを使用してランダムなポイントセットのセットにバンプを構築し、バンプデータ(三角メッシュファイル)をPOV-Rayシーンファイルに変換してpovrayでレンダリングします.
$ rbox 100 W0 > points.asc
$ qhull QJ i < points.asc TO hull.asc
$ sed -i '1,2d' points.asc
$ sed -i '1d' hull.asc
$ hamal --object=hull --mesh=hull.asc --point-size=0.03 points.asc
$ povray +P hull.pov

hamalの--objectオプションは、POV-Rayモデルのファイル名を設定するために使用されます(拡張子は含まれません).
次のようなレンダリング結果が得られます.
内幕
「Python出会いPOV-Ray」と「腹ばいに行け!」を見ます.