チュートリアル > Z-深度チャネルへのアクセス |
3ds Max の既定値のスキャンライン レンダラーにより、カラー、テクスチャの座標、法線、透明度、速度、適用範囲などについての情報を提供する多数の追加データ チャネルが生成されます。これらのチャネルはすべて、MAXScript 経由で読み取ることができます。
下に示してある単純なスクリプトで、Z-バッファの深度情報を含むイメージがレンダリングされます。そしてこのイメージが、単独のイメージ ピクセルを表すジオメトリを生成するための深度データを使用して、いわゆる「ボクセルの横置き」に変換されます。
グレースケール マスクとしての Z-バッファ チャネルへのアクセス
最初に、過去のセッションのすべてのボクセル オブジェクトが削除されていることを確認します。名前が「VoxelBox」で始まるすべてのオブジェクトを、名前の残りの文字にかかわらず削除します。
ここで、32x32 の解像度でアクティブなビューポートをレンダリングし、その結果を変数 rbmp に格納します。追加の Z-深度チャネルの生成を要求します。仮想フレーム バッファは、レンダリング中に無効になります。
イメージをレンダリングした後に、グレースケール マスクとして ZDepth チャネルのコピーを要求します。コピーは、ビットマップの z_d に格納されます。
指定したキャプション付きの新しい進行状況インジケータを起動します。 これは、UI の一番下のステータス バーに表示されます。
次に、レンダリングされたビットマップ内ですべてのラインを巡回するループを開始します。変数 y は、1 からビットマップの高さまで変化します。
progressupdate メソッドには、パーセント値が必要です。現在のビットマップ ライン番号の y を合計ライン数の rbmp.height で割ります。この結果の範囲は、0.0 から 1.0 までの間です。
それに 100.0 を乗算すると、0.0 から 100.0 までの間のパーセント値が返されます。
次に、RGBA ビットマップと Z-バッファの両方から、ピクセルから成るライン全体を読み取ります。ビットマップのインデックスは 0 を基点とし、高さから 1 を引いた数までであることに注意してください。つまり、垂直の位置の値が「1 引かれて」います。
1 からビットマップの幅を数えることで、現在のスキャンラインの各ピクセルにアクセスします。
次に、幅と長さが 10、高さが Z-バッファのグレースケール値の半分のボックスを作成します。さらに、ピクセルの座標に基づいて、10 番目 のワールド単位ごとに X と Y の位置を設定します。ボックスの左上隅が左上に表示されるように、y には負の値を使用する必要があります。ビットマップは左上から始まりますが、MAX ワールド空間の正の四分円は左下から始まります。そのため、ビューポート内で有効なビットマップ表示を行うために垂直座標を逆にします。
レンダリングされたピクセルの RGB カラーを使用して、新しいワイヤフレーム カラーを新しいボックスに割り当てます。
Viewport_related_node_properties
また、ボックスの名前に「VoxelBox」で始まる固有の名前を設定します。
スクリプトを実行するには、単に Ctrl+E を押すか、MAXScript エディタのメニューで[ツール](Tools) > [すべてを評価](Evaluate All)を選択します。または、ファイル/すべてを評価を実行します。レンダリングする目的のビューが現在のビューポートに表示されていることを確認します。進行状況バーによって、スクリプトが機能しているのがわかります。 このスクリプトを実行した結果、ワールド原点の左上に、レンダリングされたカラーと深度を表しているボックスのグループが表示されます。
このスクリプトを手始めとして、Sphere や Cylinder などの別のタイプのオブジェクトを作成することができます。 さらに上級のバージョンでは、リアルなハイトマップ評価のために、カメラの Z-深度に基づいたメッシュ グリッド内で頂点の Z 位置を変更することができます。