このトピックで説明するメソッドでは、下位レベルで 3ds Max のグラフィックス システムへ下位レベルでアクセスできます。これらのメソッドは、通常の上位レベル グラフィックス メソッドを使用できないグラフィックスでスクリプトに利用できます。
これらのメソッドは、既存の 3ds Max ビューポートで使用でき、アクティブ ビューポートのみで動作します。これらのメソッドは、既存の 3ds Max ビューポートで使用でき、アクティブ ビューポートのみで動作します。ただし、上位レベルのグラフィックス ライブラリではないため、気軽に使用することはできません。たとえば、これらのメソッドを使用してポリゴンを 1 つハイライトして表示させるには、数多くのステップが必要です。
これらのメソッドは、高速処理を目的に最適化されたもので、スクリプト プログラマにとっての使いやすさが目的ではありません。このトピックで説明するメソッドでは、実際にはグラフィックス ウィンドウに操作を実行します。グラフィックス ウィンドウはビューポートと同一ではありませんが、相互に関連しています。各ビューポートには独自のグラフィックス ウィンドウがあり、ビューポートの表示内容は、グラフィックス ウィンドウの内容のスナップショットと考えることができます。ディスプレイ メモリに書き込みを行うと操作速度が低下するため、3ds Max では代わりにグラフィックス ウィンドウに書き込みを行います。 すべての書き込みが完了した時点で、グラフィックス ウィンドウの内容をビューポートに再描画します。
3ds Max 2012 で導入された Nitrous グラフィックス マネージャは、連続的な更新を実行して、最終的なイメージを微調整します。そのためには、このトピックで詳細に説明するすべてのグラフィックス メソッドの特別な処理が必要です。これらのメソッドは、シーン再描画コールバック関数にラップされている場合にのみ実行されます。
つまり、3ds Max 2012 以降を実行し、シーン再描画コールバック関数からすべてのビューポート図面操作を呼び出す場合は、Nitrous グラフィックス マネージャを調べるように既存のスクリプトを変更する必要があり、新しく作成するスクリプトでは同じ方法を考慮して実装する必要があります。
3ds Max に付属する MacroScript Macro_GrabViewport.mcr は、これらのルールに従って更新されており、例として使用できます。
前の例は、古いバージョンの 3ds Max で Direct3D ドライバを使用しても動作しますが、3ds Max 2012 で Nitrous グラフィックス マネージャを使用している場合は、これが gw ビューポート図面メソッドを実装する唯一の方法です。
このメソッドでは、グラフィックス ドライバを識別する文字列を返します(可能な場合、製造元情報も含まれます)。
ドライバが指定した機能をサポートしているかどうかを確認します。有効な <feature_name> の値は次のとおりです。
ドライバがテクスチャ補正をサポートしているかどうかを確認します。
これを使用して、ドライバがすべての 3D データをネイティブ処理することを 3ds Max (特に mesh クラス)に知らせます。この場合、3D ワールド空間データを渡し、ドライバに頂点を変換、クリッピング、およびライト調整させることで、メッシュのレンダリングが行われます。これが false を返す場合は、mesh クラスによってすべての変換、クリッピング、およびライト調整の計算が処理され、ドライバによるラスタライズ処理のため hPolygon または hPolyline 2 1/2D が呼び出されます。(実際に切り取られるプリミティブは、Polygon/Polyline メソッドに送信されます)。
現時点では、OpenGL ドライバのみがこのクエリーに true を返しますが、他のドライバも true を返すように開発されており、HEIDI や D3D ドライバも将来変更される可能性があります。
このメソッドが true を返す場合、3ds Max は、レンダリング メソッドを呼び出す前にメッシュをストリップします。現時点では、ドライバは[ドライバ設定](driver configuration)ダイアログ ボックスで設定されているユーザ設定のみを返します。この設定の既定値は true です。
ドライバでデュアル プレーンがサポートされている場合は、true を返します。標準の 3ds Max OpenGL ディスプレイ ドライバでは、3ds Max で効率よく処理が行われるよう、元となるディスプレイ ドライバにカスタム OpenGL 拡張が実装されている場合のみ、 true が返されます。
このメソッドは、ビューポートが再表示されるたびに 3ds Max がシーン全体を再描画する必要がある場合に、 true を返します。
このメソッドは、ドライバがイメージを矩形外に捨てずにビューポートの矩形サブセットを更新できる場合に、 true を返します。ビューポート領域の表示を切り替えるほとんどのドライバの場合は true が返され、ハードウェア内でページの反転が行われるドライバの場合は false が返されます。OpenGL では、ディスプレイ ドライバに Microsoft glSwapRectHintWIN 拡張が実装されている場合に、 true が返されます。
このメソッドは、ドライバが 1 つのパスで呼び出し解除できる場合に true を返します。現時点では、OpenGL では true が返され、HEIDI および D3D では false が返されます。
このメソッドは、ドライバに設定ダイアログ ボックスがある場合に true を返します。3ds Max の 3 つの標準ドライバは、すべて true を返します。
このメソッドは、ビューポート バックグラウンドがテクスチャ長方形として実装されている場合に true を返し、表示切り替えされたビットマップである場合には、 false を返します。
このメソッドは、ビューポートがアタッチされている物理ウィンドウを超えてビューポートを拡大できるようになっているドライバの場合に true を返します。現時点では、OpenGL のみが true を返します。
このメソッドは、WM_PAINT メッセージによってバックバッファの表示切り替えが発生する場合に(ページ反転の切り替え動作の逆)、 true を返します。これにより、3ds Max はダメージのある領域をすばやく修復できます。このメソッドは、 #swapModel フラグとともに動作します。
このメソッドは、ドライバが一連の 2 ポイントのセグメントの代わりに、三角形のストリップを使って 3ds Max にワイヤフレーム モデルを送信させる場合に true を返します。これは、OpenGL ドライバのみで使用されます。ユーザは速度と正確さのどちらを優先させるかを選択できます(ストリップは高速処理され、背面が非表示になりますが、可視性をオンにしたときのように非表示のエッジが表示されます)。
[基本設定](Preference Settings)ダイアログ ボックスの[ビューポート](Viewport)タブにある、[ビューポート パラメータ/デュアル プレーンを使用](Viewport Parameters/Use Dual Planes)チェック ボックスの状態を取得/設定します。
ビューがパース投影内にある場合は true を返し、それ以外の場合は false を返します(正投影)。
アクティブ ビューポートのグラフィックス ウィンドウ変換行列を指定された matrix3 値に設定し、モデリング座標を正投影の座標行列に更新します。また、このルーチンでは、各ライトと視点を逆変換し、モデリング座標でライトを実行できるようにします。
このメソッドを使用して、描画メソッドに渡されたポイントを変換する行列を設定できます(描画メソッドには、 gw.text() 、 gw.marker() 、 gw.polyline() 、 gw.polygon() などがあります)。これらのメソッドは、通常ワールド座標を要求します。ただし、この行列をオブジェクトの変換行列に設定する場合は、オブジェクトのスペース座標内の座標を渡すことができます。渡された座標は、ワールド空間に変換されます(描画されると、画面スペースに配置されます)。ただし、これを単位行列に設定する場合は、ワールド空間座標を渡すことができます。以下を使って、この行列をオブジェクトの変換行列に設定できます。
gw.text() 、 gw.marker() 、 gw.polyline() 、 gw.polygon() などのメソッドによるワールド空間から画面スペースへの変換では、開発者はこの行列を単位行列に明示的に設定しなければなりません。これは、グラフィックス ウィンドウでは、単位行列以外の変換行列が前回の操作のまま配置されている場合があるためです。
グラフィックス ウィンドウのサイズと位置を設定します。座標はすべてグラフィックス ウィンドウの親ウィンドウのスペース内にあるウィンドウ座標です。すべての座標は Windows フォーマットで、起点は左上に置かれます。
x - 左のグラフィックス ウィンドウの起点を指定します。y - 最上位のグラフィックス ウィンドウの起点を指定します。
このメソッドは、X 軸方向の現在のウィンドウ サイズを取得します。
このメソッドは、アクティブ ビューポートのグラフィックス ウィンドウのイメージをビットマップ値で返します。
3ds Max 2015 以降、 captureAlpha: オプション キーワード引数が指定され、True に設定されている場合、ビューポート アルファもキャプチャされます。指定されないまたは False に設定された場合、返されたイメージには、アルファおよび RGB チャンネルのみが含まれます。
さらに、3ds Max 2015 以降、 gammaCorrect: オプション キーワード引数が指定され、False に設定されている場合は、ガンマ補正はビットマップ値では実行されません。True に設定されている、または指定されていない場合は、返されるイメージはガンマ補正されます。
詳細については、「Viewport.GetViewportDib」および「windows.snapshot()」も参照してください。
このメソッドは、更新矩形をリセットします。更新矩形とは、変更された項目を反映するために更新する必要のある画面領域です。システムで項目のレンダリングが完了したとき、実際に変更したビューポート領域だけを更新するのが目的です。このメソッドは、更新矩形(ディスプレイで表示切り替えを行う領域)を、特別な「空」の値に設定します。こうすることにより、後で gw.enlargeUpdateRect() が呼び出されたとき、渡された Box2 領域がこの領域として使用されます。
このメソッドは、渡された Box2 値を含めるよう更新矩形を拡張します。 #whole を指定すると、ビューポート全体が後で更新されます。
このメソッドは、現在の更新矩形を Box2 値として取得します。更新する必要のあるビューポート領域がない場合は、特別な Box2 の「空」の値を返します。
プリミティブの呼び出しで使用されたレンダリング制限を設定します。レンダリング制限の設定は、オブジェクトの表示を処理する 3ds Max のさまざまな機能間での通信に使用されます。たとえば、この制限を #polyEdges に設定したのちにポリゴンを作成しても、ポリゴンにはエッジが描画されません。エッジを描画するように指定するフラグのみが設定されているからです。
つまり、次のように説明できます。上位レベルの 3ds Max 内にある一部のコードでは、ポリゴンのエッジが表示されていることを認識します。ところが、このコードは実際に描画を行う 3ds Max の機能部分とオブジェクト指向のアーキテクチャを介しては関連付けられていません。3ds Max は、オブジェクトを描画するとき、ポリゴンのエッジのフラグがオンであることを認識し、2 つの描画手順を実行するよう通知されます。つまり、ポリゴンを作成し、 outlinePass() を true で呼び出します。この場合、多数のエッジを描き、 outlinePass() を false で呼び出します。このようにして、この描画ルーチンではフラグが確認され適切に描画が行われます。このメソッドは、後で確認できる制限の設定のみを行います。
<render_limits_name_array> は、ビューポートで使用されるレンダリング制限を <render_limits_name> 値の配列として指定します。有効な <render_limits_name> 値は次のとおりです。
項目のすべてのエッジが表示されます(非表示のエッジも含む)。
背面非表示が使用されます。ビュー方向から離れたサーフェスの面法線のエンティティは描画されません。
これは、ポリゴンには頂点カラーがあり、そのカラーを使用することを指示します。頂点カラーがあってもフラグが設定されていない場合、カラーは表示されません。
これは、 #illum および #specular の設定と同じです。
これは、レンダリングではなく、ヒット テストを実行するように指定します。
このモードにより、ポリゴンのエッジ(エッジ面)が表示されます。
これは、 #colorVerts を修正します。これをオンにするとライトが有効になり、頂点カラーを使ってライトによって発生するカラーが調整されます。オフにすると、各頂点のカラーは、三角形を直接シェーディングするために使用されます。3ds Max で #shadeCverts モードが使用されると、白の拡散のみのマテリアルがオブジェクトに適用されるため、カラーを損なうことなくシェーディングされているように見えます。
さらに、 #shadeCverts をオフにすると、頂点カラーが直接使用されます。つまり、純白の自動照明のマテリアルによって調整されます。
#shadeCverts をオンにすると、白の拡散のマテリアルがシーン ライトによって照らされるため、黒から白に変化するシェーディングが作成され、ほとんどの頂点は単純なグレーのシェーディングで表示されます。頂点カラーがマテリアル カラーによって調整されると、1 未満の数値で通常は乗算され、カラー表示が暗くなります。
カラーの RGB コンポーネントは均等に調整されるため、カラーが赤から緑に変化することはありません。ただし、元になるマテリアルの重みが均等でない場合(つまり、純粋なグレーが黒と白の間に配置される場合)には、このような変化が発生する場合があります。つまり、シェーディングをオンにすると頂点カラーの厚さのみが変更され、輝度やクロミナンスなどは変更されません。
これは、擬似モードで、このモードをオンにしてもグラフィックス ドライバの操作は実際には何も変わりません。Mesh クラスでテストが実行され、頂点マーカー(+)が送信されます。
座標を描画プリミティブに指定すると、x、y、z 値が入力されます。エンティティをビューポートで描画する場合は、z 値を無視した方がよいことがあります。たとえば、3ds Max ビューポートでは、ビューポートのタイプ(フロント、レフトなど)を表示するテキストは z 値なしで描かれます。これは、円弧回転の円制御や座標軸でも同様です。これらの項目は、フラグ設定なしで描画されるため、常に前面に表示されます。
プリミティブの呼び出しに使用したレンダリング制限を名前配列で取得します。返される名前値のリストについては、 gw.setRndLimits() を参照してください。
ビューポートで使用した現在のレンダリング モードを名前配列で返します。これは、レンダリング制限のサブセットで、レンダリング制限で適用される制限は、現在のモードで強制的に適用されます。返される名前値のリストについては、 gw.setRndLimits() を参照してください。
ビューポートを「高速ビュー表示」に設定したときにスキップされる三角形の数を設定します。高速ビューを無効にするには、1 を指定します。高速ビューを無効にするには を指定します。三角形はグラフィックス ドライバに 1 つずつ渡されるため、指定した三角形の数をスキップするかどうかは、三角形をグラフィックス ドライバに送るコードに依存します。3ds Max 内のメッシュ レンダリングは、この方法でスキップ カウントを使用します。
<skip_count_integer> には、「n 番目」ごとの三角形を描画するよう指定します。2 に設定すると、1 つおきの三角形が描画されます。
Direct3D ドライバの[カスタマイズ](Customize) > [基本設定](Preferences) > [ビューポート](Viewports) > [ドライバを設定](Configure Driver)ダイアログ ボックスにチェックボックスとして表示されている UI、[三角形エッジをすべて表示](Display All Triangle Edges)を公開します。true に設定した場合、すべてのエッジが描画されます。false に設定すると、すべての可視エッジが描画されます。
次のメソッドは、グラフィックス ウィンドウの現在の変換からデバイス スペースに、ポイントをマップします。グラフィックス ウィンドウの変換を単位行列に設定すると、ワールド空間で指定したポイントからマップされます。それ以外の場合、指定されたポイントはグラフィックス ウィンドウの変換によって変換され、ワールド空間のポイントとみなされます。したがって、ワールド空間から画面スペースへの変換を実行するには、グラフィックス ウィンドウの変換を次の関数で単位行列に設定する必要があります。
このメソッドは、point3 座標を「h」形式のデバイス座標に変換します。戻り値の各コンポーネントは、グラフィックス ドライバ用のネイティブ デバイス座標での整数で示されます。HEIDI および OpenGL では、起点を左下に置きます。Direct3D では、起点を左上に置きます。
このメソッドは、point3 座標を「w」形式のデバイス座標に変換します。戻り値の各コンポーネントは整数で示され、起点を左上に置きます。
このメソッドは、point3 座標を「h」浮動小数点座標に変換します。戻り値の各コンポーネントは浮動小数点で示され、起点を左上に置きます。これは、丸めエラーの発生を回避するためのヘルパー ルーチンです。3ds Max では、IK にだけ使用します。
「h」で始まるメソッドは、整数のデバイス座標を取り、起点を左下に置きます。「w」で始まるメソッドは、ウィンドウ デバイス座標を取り、起点を左上に置きます。「h」および「w」のルーチンでは、特別に指定されていない限り、クリッピングを実行しません。指定領域外に描画すると、3ds Max がクラッシュする原因になります。これらの座標系では、左手規則が採用されています。
「h」または「w」で始まらないメソッドは、グラフィックス ウィンドウの現在の変換からデバイス スペースにポイントをマップします。この座標系では、右手規則が採用されています。グラフィックス ウィンドウの変換を単位行列に設定すると、ワールド空間で指定したポイントからマップされます。それ以外の場合、指定されたポイントはグラフィックス ウィンドウの変換によって変換され、ワールド空間のポイントとみなされます。したがって、ワールド空間から画面スペースへの変換を実行するには、グラフィックス ウィンドウの変換を次の関数で単位行列に設定する必要があります。
この項で説明されているメソッドを使ってグラフィックス ウィンドウへの描画を完了したら、 gw.updateScreen() を呼び出してビューポート表示を更新する必要があります。
ビューポート表示を更新し、以下のメソッドを使ってグラフィックス ウィンドウに書き込まれるテキスト、マーカー、多角形、ポリゴン、または三角ストリップを表示します。
gw.text <point3> <string> [ color:<color> ] gw.hText <point3> <string> [ color:<color> ] gw.wText <point3> <string> [ color:<color> ]
指定された(オプションの)カラーを使って、2D 固定フォント コメント文字列テキストを指定された場所に描きます。カラーが指定されていない場合は、既定カラーの赤が使用されます。
3ds Max 2015 以降、複数行テキストがサポートされているので、\n エスケープ シーケンスを使用して、文字列に改行を挿入できます。3ds Max の以前のバージョンでは、1 行の文字しかサポートされませんでした。
文字列のテキスト コンテンツを point2 値としてビューポートに表示されるように返します。
gw.Marker <point3> <marker_name> [ color:<color> ] gw.hMarker <point3> <marker_name> [ color:<color> ] gw.wMarker <point3> <marker_name> [ color:<color> ]
指定された場所にマーカーを描きます。このメソッドを pickpoint() と組み合わせて使用すると、ユーザがクリックした場所をすばやく表示できます。これらのマーカーは一時的なもので、ビューポートが更新されるたびに削除されます。カラーが指定されていない場合は、既定カラーの赤が使用されます。有効な <marker_name> のタイプは次のとおりです。
#point #hollowBox #plusSign #asterisk #xMarker #bigBox #circle #triangle #diamond #smallHollowBox #smallCircle #smallTriangle #smallDiamond
マーカーの全タイプのインスタンスを均等なスペースで作成する例は次のとおりです。
gw.Polyline <vertex_point3_array> <isClosed_boolean> [rgb:<color_array>] gw.hPolyline <vertex_point3_array> <isClosed_boolean> [rgb:<color_array>] gw.wPolyline <vertex_point3_array> <isClosed_boolean> [rgb:<color_array>]
このメソッドは、複数のセグメントの多角形を描画します。<vertex_point3_array> の個々の値は、多角形の頂点を示します。<isClosed_boolean> を true に設定すると、最初のポイントが最後のポイントとつながり、多角形が閉じられます。 false に設定すると、多角形は開いたままになります。オプションの RGB カラー配列を指定し、シェーディング モードをスムーズに設定すると、多角形が Gourand シェーディングで描画されます。これは、3ds Max でライトを適用したワイヤフレームの描画を実行する例です。オプションの RGB カラー配列を指定しない場合、ラインは gw.setColor() を使って指定されたライン カラーで描かれます。<color_array> 内の要素数は、<vertex_point3_array> 内の要素数と同じである必要があります。
gw.Polygon <vertex_point3_array> <color_array> <uvw_point3_array> gw.hPolygon <vertex_point3_array> <color_array> <uvw_point3_array> gw.wPolygon <vertex_point3_array> <color_array> <uvw_point3_array>
このメソッドは、複数のポイントから形成されるポリゴンを描画します。<vertex_point3_array> の個々の値は、ポリゴンの頂点を示します。<color_array> は、各頂点のカラーを指定します。レンダリング モード( gw.setRndLimits() を使って設定)には、使用するカラー値の #colorVerts が必要です。<uvw_point3_array> は、頂点ごとに UVW 座標を指定します。レンダリング モードには、使用する UVW 座標の #texture が必要です。要素数は、各配列で一致させる必要があります。
box2 で指定された座標を使用して、指定されたカラーで長方形を描画します。
3ds Max 2008 以降 で使用可能です。従来、Avguard 拡張機能として提供されていた機能です。
このメソッドを呼び出すと、一連の三角形がレンダリング用に送信開始されます。このメソッドを呼び出し、次に gw.triangle() を 1 回または複数回呼び出してから、最後に gw.endTriangles() を呼び出します。
3ds Max 2008 以降 で使用可能です。従来、Avguard 機能拡張として提供されていた機能です。
このメソッドは、三角形のレンダリングを完了するときに呼び出します。
3ds Max 2008 以降 で使用可能です。従来、Avguard 拡張機能として提供されていた機能です。
このメソッドは、三角形を描画します。<vertex_point3_array> の個々の値は、三角形の頂点を示します。
<color_array> は、各頂点のカラーを指定します。レンダリング モード( gw.setRndLimits() を使って設定)には、使用するカラー値の #illum が必要です。
gw.startTriangles() を最初に呼び出し、 gw.triangle() を 1 回以上呼び出し、三角形を描画したら gw.endTriangles() を呼び出します。
3ds Max 2008 以降 で使用可能です。従来、Avguard 拡張機能として提供されていた機能です。
このメソッドは、「ストリップ」として指定された一連の三角形を描画します。
メソッドには 3 つ以上の頂点が必要となり、ストリップ内に三角形が作成されます。前回の情報を使ってラスタライズを開始できるため、送信するデータ量が大幅に減少し、元になるグラフィックス ライブラリでも設定するデータ量が大幅に減少します。このルーチンではクリッピングが処理されないため、渡された頂点はすべてビュー内に収める必要があります。
パラメータは、 gw.Polygon() の場合と同じです。しかし、<vertex_point3_array> の処理方法は異なります。最初の 2 つの頂点ができた後は、頂点が追加されるたびに新たな三角形を作成します。たとえば、四角形を描くには、最初の 3 つの頂点によって最初の三角形が指定され、次の頂点は前の頂点のうち 2 つと組み合わされ、これにより四角形が完成します。
3ds Max 2008 以降 で使用可能です。従来、Avguard 機能拡張として提供されていた機能です。
gw.hTriStrip <vertex_point3_array> <color_array> <uvw_point3_array> gw.wTriStrip <vertex_point3_array> <color_array> <uvw_point3_array>
指定された描画タイプに使用した RGB カラーを設定します。有効な <type_name> 値は次のとおりです。
#line -- line drawing color #fill -- polygon fill color #text -- text drawing color #clear -- The color that the viewport is cleared to when you call gw.clearScreen()
画面上で指定された矩形領域をクリアします。オプションの useBkg パラメータを false に設定すると、該当する領域のカラーがクリア用のカラー(上記の gw.setColor() を参照)に設定されます。 true に設定すると、クリアされた領域を塗り潰すためにバックグラウンドが使用されます。 useBkg の既定値は false です。