アクティブ ビューポート情報、タイプ、および変換へのアクセス

 
 
 

次のグローバル変数とメソッドにより、3ds Max のビューポートにアクセスできます。

また、3ds Max 2013 で導入された ViewPanelManager コア インタフェースは、ビュー パネル管理機能、およびスプリッタ バーの配置とビューポートの設定をコントロールすることに関連のあるメソッドを各拡張のタイプに公開します。

   

3ds Max

viewport.activeViewport 

この 3ds Max システム グローバル変数により、アクティブ ビューポートのインデックスを取得および設定できます。

現在のアクティブ ビューポートを 2D ビューに変更すると、この変数の値は 0 になります。

   

viewport.numViews 

この 3ds Max システム グローバル変数には、現在のビューポート レイアウト内の 3D ビューポートの数が含まれています。

この変数は読み込み専用です。

この変数には、ビューポート レイアウト内のトラック ビュー、スケマティク ビュー、MAXScript リスナーなどの 2D ビューは反映されません。

たとえば、 viewport.getLayout() #layout_4 を返し、この変数の値が 2 の場合、2 つのビューポートに 2D ビューが含まれていることがわかります。

3ds Max 2013 の前までは、MAXScript で 2D ビューポートにアクセスすることはできませんでした。3ds Max 2013 以降のビューポートは、特にトラック ビュー、スケマティク ビュー、シーン エクスプローラなどのいくつかの拡張タイプに設定することができます。詳細については、 ViewPanelManager.SetExtendedView() メソッドを参照してください。

   

ビューポート レイアウト

<view_layout_name>viewport.getLayout() 

ビューポート レイアウトを返します。可能なレイアウト名のリストについては、以下を参照してください。

<void>viewport.setLayout <view_layout_name> 

ビューポート レイアウトを設定します。このレイアウトでは、<view_layout_name> によってりビューポート レイアウト設定を指定します。

レイアウトの設定の際に各ビューポート内に表示されるビューは、[カスタマイズ](Customize) > [ビューポート設定](Viewport Configuration) > [レイアウト](Layout)で行った設定セットに基づきます。

次に有効な <view_layout_name> 値の構文を示します。

# is the total number of viewports.
V = vertical split
H = horizontal split
L/R = left/right placement
T/B = top/bottom placement

有効な <view_layout_name> 値は次のとおりです。

レイアウト (Layout) 名前 説明
 

#layout_1

1 つのビューポート

 

#layout_2v

2 つのビューポート、同じサイズの垂直分割

 

#layout_2h

2 つのビューポート、同じサイズの水平分割

 

#layout_2ht

2 つのビューポート、上が小さめの水平分割

 

#layout_2hb

2 つのビューポート、下が小さめの水平分割

 

#layout_3vl

3 つのビューポート、左に 2 つ、右に 1 つ

 

#layout_3vr

3 つのビューポート、左に 1 つ、右に 2 つ

 

#layout_3ht

3 つのビューポート、上に 2 つ、下に 1 つ

 

#layout_3hb

3 つのビューポート、上に 1 つ、下に 2 つ

 

#layout_4vl

4 つのビューポート、左に 3 つ、右に 1 つ

 

#layout_4vr

4 つのビューポート、左に 1 つ、右に 3 つ

 

#layout_4ht

4 つのビューポート、上に 3 つ、下に 1 つ

 

#layout_4hb

4 つのビューポート、上に 1 つ、下に 3 つ

 

#layout_4

4 つのビューポート、すべて同じサイズ

3ds Max 2013 以降、スプリッタ バーの実際の場所は MAXScript を使ってコントロールできます。詳細については、 ViewPanelManager.SetSplitterBarPos() メソッドを参照してください。

   

<view_type_name>viewport.getType [ index:<integer> ] 

このメソッドは、アクティブ ビューポートのタイプを返します。

3ds Max 2009 以降でオプションの index: キーワード引数が指定されている場合は、インデックス付きビューポートのタイプを返します。

このインデックス番号は、 viewport.activeViewport で使用されているインデックス番号に対応します。

<boolean>viewport.setType <view_type_name> 

このメソッドは、アクティブ ビューポートのビュー タイプを設定します。

ビュー タイプが設定された場合は true を、設定されなかった場合は false を返します。

有効な <view_type_name> 値は次のとおりです。

#view_top 上部 (Top)
#view_bottom 下面 (Bottom)
#view_right Right
#view_left Left
#view_front 前面 (Front)
#view_back 後面 (Back)
#view_persp_user パース ビュー (Perspective)
#view_iso_user ユーザ
#view_camera カメラ
#view_spot ライト (Light)
#view_shape シェイプ
#view_grid グリッド

現在のビューポートが拡張ビューポート(例: スケマティク ビュー、アセット マネージャ、または MAXScript リスナー ビューポート)の場合、 getType() undefined を返します。 setType() によってカメラが指定されており、カメラが 1 つだけ選択されている条件が満たされていない場合は、使用するカメラを選択するためのダイアログ ボックスが表示されます。カメラがない場合は、「シーンにカメラがありません」という警告が表示されます。

viewport.getType #view_none の戻り値も取得できます。いずれのビューポートもフォーカスを保持しない場合、 false が返されます。

viewport.setType #view_top -- set active viewport to Top view
--> true
viewport.getType() -- should return what you expect...
--> #view_top

3ds Max 2013 以降のビューポートは、トラック ビュー、スケマティク ビュー、またはシーン エクスプローラなどのいくつかの拡張タイプに設定することができます。詳細については、 ViewPanelManager.SetExtendedView() メソッドを参照してください。

   

<index>viewport.GetID <viewportIndex> 

3ds Max 2009 以降 では、インデックスで指定されたビューポートの ID を返します。ID は設定できません。

ビューポートを最大化すると、インデックスは必ず 1 になり、その ID は最大化されないときのインデックスに対応します。たとえば、インデックスが 4 の右下のビューポートを最大化すると、インデックスは 1 になりますが、ID は 4 のままになります。

   

<void>viewport.ResetAllViews() 

このメソッドは、3ds Max のすべてのビューポートをリセットし、既定のレイアウトに戻します。

   

<node>getActiveCamera()

アクティブ ビューに関連付けられたカメラ ノードを返します。ビューがカメラ ビューではない場合は、 undefined を返します。

<node>viewport.getCamera [index:<integer>] 

アクティブ ビューに関連付けられたカメラ ノードを返します。ビューがカメラ ビューではない場合は、 undefined を返します。

3ds Max 2009 以降 では、オプションの index: キーワードが指定されている場合、アクティブ ビューポートのカメラの代わりにインデックス付きビューポートのカメラを返します。

このインデックス番号は、 viewport.activeViewport で使用されているインデックス番号に対応します。

   

<void>viewport.setCamera <camera_or_light_node> 

指定されたカメラを使って、アクティブ ビューポートをカメラ ビューに設定します。

また、フリー、ターゲット、またはダイレクト ライトを使用して、アクティブ ビューをライト ビューに設定することもできます。

   

<boolean>viewport.CanSetToViewport() 

ビューポート カメラとして使用可能なカメラとライトの場合は true を返します(言い換えると、オブジェクトは viewport.setCamera() の有効な引数です)。

   

ビューポート表示とレンダリング制御

<void>viewport.setGridVisibility {<int> | #all} <bool> 

このメソッドにより、ビューポートでのグリッド可視性を設定します。

<int> はビューポート インデックス、<bool> は新しいグリッド可視性状態です。

#all を指定すると、すべてのビューポートでのグリッド表示は、指定した状態に設定されます。

   

<boolean>viewport.getGridVisibility <int> 

このメソッドは、指定したビューポートにグリッドが表示される場合には true を、表示されない場合は false を返します。

<int> 引数は、ビューポート インデックスです。

   

<boolean>viewport.isWire() 

このメソッドは、アクティブ ビューポートがワイヤ モードの場合に true を返します。

   

viewport.DispBkgImage 

このプロパティを true に設定すると、アクティブ ビューポートにバックグラウンド イメージが表示されます。false に設定すると、バックグラウンド イメージは表示されません。

   

<boolean>viewport.EnableSolidBackgroundColorMode <bool>

3ds Max 2013 の新機能: このメソッドにより、ソリッド バックグラウンド カラー表示とグラデーション バックグラウンド カラー表示をコントロールします。

ブール演算引数が true の場合、現在のビューポートのバックグラウンドはソリッド カラーに設定されます (言い換えると、グラデーションは無効にされます)。

ブール演算引数が false の場合、現在のビューポートのバックグラウンドにグラデーション カラーが適用されます。

成功した場合は true を、失敗した場合は false を返します。

   

<boolean>viewport.IsSolidBackgroundColorMode()

3ds Max 2013 の新機能: このメソッドは、現在のビューポートがソリッド バックグラウンド カラー モードの場合には true を、グラデーション モードの場合は false を返します。

   

<render_level>viewport.GetRenderLevel() 

ビューポート レンダリング レベルを返します。

戻り値は、 #smoothhighlights #wireFrame #smooth #facethighlights #facet #flat #litwireframe #Box #hiddenline のいずれかになります。

   

<void>viewport.SetRenderLevel <render_level> 

現在のビューポートでエッジ面が有効になっている場合は true、それ以外の場合は false を返します。

有効な引数の値は、 #smoothhighlights #wireFrame #smooth #facethighlights #facet #flat #litwireframe #Box #hiddenline です。

   

<boolean>viewport.GetShowEdgeFaces() 

現在のビューポートで[エッジ面](Edged Faces)表示が有効になっている場合は true、それ以外の場合は false を返します。

   

<void>viewport.SetShowEdgeFaces <boolean> 

ブール値の引数によってエッジ面の表示のオンとオフを切り替えます。

   

<integer>viewport.GetTransparencyLevel() 

現在のビューポートの透明度のレベルを返します。有効な値は次のとおりです。

1 - なし

2 - シンプル

3 - ベスト

   

<void>viewport.SetTransparencyLevel <transp_level> 

現在のビューポートの透明度のレベルを設定します。有効な値については、上記を参照してください。

   

<boolean>viewport.IsEnabled() 

現在のビューポートが有効になっている場合は true、無効になっている場合は false を返します。

   

<boolean>viewport.IsPerspView() 

現在のビューポートがパース ビューポート(パースまたは正射投影以外のカメラ)である場合は true、正射投影ビュー(トップ、ボトム、フロント、バック、レフト、ライト、ユーザ、正射投影のカメラなど)である場合は false を返します。

   

<float>viewport.GetFPS() 

現在のビューポートの[統計を表示](Show Statistics)オーバレイで計算された、最後のフレーム レートの値をフレーム/秒単位で返します。ビューポートの[統計を表示](Show Statistics)がオンに設定されていない場合には、返される値はビューポートの現在のフレーム レートを表しません

3ds Max 9 以降 で使用可能です。

3ds Max 2008 以降では、[最適表示](Adaptive Degradation)がオンの場合、報告される値は実際のフレーム レートではなくターゲット フレーム レートになります。

   

ビューポート変換

<matrix3>getViewTM() 
<matrix3>viewport.getTM() viewport.setTM <matrix3> 

正射投影以外(パースおよびアイソメトリック ユーザ ビュー)のビューポートのアクティブ ビュー画面とワールド間の変換行列を取得または設定します。これはアフィン カメラまたはビューポート行列です。 setTM はパース ビューポートでのみ実行され、ビュー変換行列が正しく設定された場合は true を返し、それ以外の場合は false を返します。

次の関数は、アクティブ ビューポートの「目」の位置と方向を示すレイ値を返します。ビューポートは、正投影以外のビューポートでなければなりません。

fn getViewDirectionRay =
(
-- The affine TM transforms from world coords to view coords -- so we need the inverse of this matrix
local coordSysTM = Inverse(getViewTM())
-- The Z axis of this matrix is the view direction.
local viewDir = -coordSysTM.row3
-- get the view position from this matrix
local viewPt = coordSysTM.row4
return ray viewPt viewDir
)

   

<fov_value>getViewFOV() 

アクティブ ビューポートの視野を返します。ビューポートが正投影ビューポートの場合は、57.2958(1 ラジアン)が返されます。

<fov_value>viewport.GetFOV() 

アクティブ ビューポートの視野を返します。 getViewFOV() と同じ。

   

<boolean>viewport.SetFOV <float> 

アクティブ ビューポートの視野を、指定された角度(単位: 度)に設定します。

パース ビューおよびカメラ ビューでのみ動作します。

成功した場合は true を、現在のビューポートがパースペクティブまたはカメラ ビューではない場合は false を返します。

3ds Max 2008 以降 で使用可能です。

   

<focal_distance>viewport.getFocalDistance() 

パース ビューの場合は、アクティブ ビューポートの焦点距離を返し、それ以外の場合は undefined を返します。

3ds Max 2008 以降 で使用可能です。

   

<boolean>viewport.setFocalDistance <focal_distance> 

アクティブ ビューポートの焦点距離を設定します。

パース ビューでのみ動作します。 カメラ ビューでは動作しません。

成功した場合は true を、現在のビューポートがパースペクティブまたはカメラ ビューではない場合は false を返します。

3ds Max 2008 以降 で使用可能です。

   

<boolean>viewport.pan <float> <float> 

最初の引数を X、2 番目の引数を Y 方向のピクセル単位のデルタ値として使用して、現在のビューポートをパンします。

オブジェクトベースのタイプ(カメラ、ライトなど)を除くすべてのビューポート タイプで動作します。

成功した場合は true を、ビューポートがオブジェクトベースの場合は false を返します。

3ds Max 2008 以降 で使用可能です。

viewport.pan 10 0 -- pan horizontally by ten pixel
completeredraw() -- redraw the views to see the changes 

   

<boolean>viewport.zoom <float> 

渡された浮動小数点値をズーム係数として使用して、現在のビューポートのズームを実行します(例: 2.0 の場合には 1/2 にズーム縮小し、0.5 の場合には 2 倍にズーム拡大します)。

オブジェクトベースのタイプ(カメラ、ライトなど)を除くすべてのビューポート タイプで動作します。

成功した場合は true を、ビューがオブジェクトベースの場合は false を返します。

3ds Max 2008 以降 で使用可能です。

 --while the perspective viewport is active, evaluate
viewport.setFOV 50.0 --set viewport Field Of View to 50 deg.
true
completeredraw() --redraw the views
OK
viewport.zoom 2.0 --zoom out two times
true
completeredraw() --redraw the views
OK
viewport.getFOV() --get the new Field Of View
86.0061

この結果の意味は以下のとおりです。

FOV 角度は、イメージ面の幅に応じて異なりますが、ターゲット距離は同じままです。

角度が 50 度の場合、半分の角度のタンジェントは、

tan (50.0/2) -> 0.466308 となります。

2 回ズームインすると、幅が 2 倍になります。

したがって、atan(0.466308*2) -> 43.0031 (新しい半分の角度)および

43.0031 * 2 = 86.0062 となり、これがフル ビューポート FOV 角度です。

 

   

<boolean>viewport.zoomPerspective <float> 

アクティブなビューポートをズームします。3ds Max UI のインタラクティブ ズーム ツールとまったく同等です。

このメソッドは、パース ビューでのみ動作します。カメラ ビューでは動作しません。3ds Max UI で、ユーザが正射投影ビューまたはアイソメトリック ユーザ ビューをズーム拡大すると、ビューポート タイプに対して内部的に切り替えが実行され、代わりに ViewExp::Zoom( viewport.zoom() )が呼び出されます。

成功した場合は true を、ビューポートがパースペクティブ ビューではない場合は false を返します。

3ds Max 2008 以降 で使用可能です。

   

<boolean>viewport.rotate <quat> [center:<Point3>] 

渡されたクォータニオン値を回転の値、Point3 値を回転の中心点として使用し、現在のビューポートの回転を実行します。

オブジェクトベースのタイプ(カメラ、ライトなど)を除くすべてのビューポート タイプで動作します。

成功した場合は true を、ビューがオブジェクトベースの場合は false を返します。

3ds Max 2008 以降 で使用可能です。

theAxis = (viewport.getTM()).row3
for i = 1 to 180 do
(
viewport.rotate (quat 2 theAxis)
completeredraw()
)

   

<bitmap>viewport.getViewportDib() 

このメソッドは、アクティブ ビューポートのグラフィックス ウィンドウのイメージをビットマップ値で返します。

ビットマップのサイズは、ビューポートのサイズと同一です。

このメソッドと、 別のトピックで説明されている gw.getViewportDib() との相違点は、このメソッドに maxops.displayActiveCameraViewWithMultiPassEffect() を使用した結果が含まれることです。このため、このメソッドは、被写界深度(DOF)またはモーション ブラーのプレビューを含むビューポート イメージを生成するために使用できます。

3ds Max 2008 以降 で使用可能です。従来、Avguard 機能拡張として提供されていた機能です。

   

<void>viewport.ZoomToBounds <All_Bool> <A_Point3> <B_Point3> 

すべてのビューポートまたは現在のビューポートを境界で囲まれた領域にズームします。

1 番目の引数が true として渡された場合、すべてのビューポートがズームされます。 false の場合は、選択されたビューポートだけがズームされます。

2 番目と 3 番目の引数は、ズームする、境界で囲まれた領域を定義します。

   

<point2>getViewSize() 

アクティブ ビュー サイズをピクセル数による point2 で返します。

   

<float>getScreenScaleFactor <point3> 

アクティブ ビューのスケール係数を返し、ポイントのビュー スペース原点からの距離にワールド スペース単位で幅を指定します。

   

<float>viewport.GetScreenScaleFactor() 

アクティブ ビューのスケール係数を返し、ポイントのビュー スペース原点からの距離にワールド スペース単位で幅を指定します。 getScreenScaleFactor() と同じ。

   

<ray>mapScreenToWorldRay <pixel_coord_point2> 

現在のアクティブ ビューにあり、ビューポート面に垂直なビューポート ピクセル座標を通過する、ワールド スペースの Ray 値を返します。

   

<point3>mapScreenToView <pixel_coord_point2> <depth_float> [ <viewport_size_point2> ] 

ビュー座標空間内の 3D 点を返します。アクティブ ビューポート画面(ビューポート ピクセル座標)のポイント、およびビュー座標の深さにより、このメソッドはこのポイントをビュー座標にマップします。 <viewport_size_point2> が指定されている場合は、実際のビューポート サイズの代わりに指定されたビューポート サイズが使用されます。

   

<point3>mapScreenToCP <pixel_coord_point2> [ <viewport_size_point2> ] 

現在アクティブなビューのビューポート ピクセル座標をワールド座標の作図平面にマップします。 <viewport_size_point2> が指定されている場合は、実際のビューポート サイズの代わりに指定されたビューポート サイズが使用されます。

   

<matrix3>getCPTM() 

作図平面とワールド間の変換行列を返します。

   

<float>gw.nonScalingObjectSize() 

このメソッドから返される値は、ビューポートのズームを元のサイズに戻すスケール係数として使用できます。たとえば、ライト、カメラ、テープ ヘルパー オブジェクトは、ビューポートがズーム拡大および縮小するときシーン内のノードを一定のサイズに保つために、この係数を使用します。

この値は、[ビューポート設定](Viewport Preferences)ダイアログ ボックスの[非スケーリング オブジェクトのサイズ](Non-Scaling Object Size)編集ボックスの影響を受けるので、ある程度の制御が可能です。

   

<point3>gw.getPointOnCP <pixel_coord_point2> 

指定した画面座標に基づいて、現在の作図平面上のワールド スペース内のポイントを返します。

   

<float>gw.getCPDisp <base_point3> <dir_point3> <start_pixel_coord_point2> <end_pixel_coord_point2> 

このメソッドは、画面の開始点( <start_pixel_coord_point2> )、画面の終了点( <end_pixel_coord_point2> )、基点( <base_point3> )、および方向ベクトル( <dir_point3> )により、ワールド スペース内の長さを返します。たとえば、円柱を作成する場合、マウスをクリックして円柱の中心点(基点)を定義し、半径をドラッグします。続いて円柱の高さをドラッグします。このメソッドは、初期基点、方向ベクトル(Z 軸)、マウスの開始点、およびユーザがインタラクティブに調整している現在のポイントに基づいて、途中および最終の円柱の高さを返す場合に使用します。

   

<float>gw.getVPWorldWidth <point3> 

ワールド スペース内のポイントに対するワールド スペース内のビューポート画面の幅係数を返します。

   

<point3>gw.mapCPToWorld <point3> 

作図平面上の所定のポイントに対応するワールド スペースのポイントを返します。たとえば、 gw.getPointOnCP() を使用して画面上の座標を作図平面上のポイントに変換した場合、次にこのメソッドを呼び出して作図平面上のポイントをワールド スペースのポイントに変換できます。

   

<float>gw.getFocalDist() 

アクティブ パース ビューの焦点距離を返します。

   

<boolean>gw.IsPerspView() 

アクティブ ビューポートがパース ビューの場合は true 、それ以外の場合は false を返します。

   

ビューポートのスナップ設定

<point3>gw.snapPoint<pixel_coord_point2> [ snapType:<snapType_name> ] [ snapPlane:<matrix3> ] 

2 次元画面座標を指定すると、このメソッドは、現在のスナップ設定およびオプションの snapType: パラメータに基づいて、現在の作図平面またはオプションの snapPlane の 3D 点を返します。

有効な <snapType_name> 値は次のとおりです。

#in3d - すべてのポイントにスナップします。

#inPlane - 作図平面上のポイントだけにスナップします。

#unSelObjs - スナップ ポイントを考慮するとき、選択されているノードを無視します。

#selObjs - スナップ ポイントを考慮するとき、選択されていないノードを無視します。

#unSelSubobj - スナップ ポイントを考慮するとき、選択されているサブオブジェクト ジオメトリを無視します。

#selSubobj - スナップ ポイントを考慮するとき、選択されていないサブオブジェクト ジオメトリを無視します。

#force3d - ユーザ設定を無視し、3D 点に強制的にスナップします。

3ds Max 8 以降で使用可能なオプションの snapPlane: 引数は、XY 平面をスナッピング平面にマップする変換の matrix3 値です。指定した matrix3 値が単位行列(Matrix3 1)に等しい場合、スナッピング平面は XY 作図平面と同一になります。

tm = Matrix3(1) --represents the XY plane
m = Point2 0 0 --screen pixel coordinates
p = gw.snapPoint m snapPlane:tm --returns the snapping point 

   

<float>gw.snapLength <length_float> 

このメソッドは、最も近いスナップ増分に長さをスナップし、スナップした距離を返します。

   

ビューポート領域

viewport.setRegionRect <viewport index> <box2> 

指定されたビューポートの領域矩形を設定します。

   

viewport.getRegionRect <viewport index> 

指定されたビューポートの領域矩形を取得します。

   

viewport.setBlowupRect <viewport index> <box2> 

指定されたビューポートの引き伸ばし矩形を設定します。引き伸ばし矩形は、現在のレンダリング出力サイズと同じアスペクトに設定する必要があります。トップ、ボトム、およびレフト コンポーネントの値は Box2 値の引数から得られますが、ライト コンポーネント値はアスペクトを強制的に適合するように再計算されます。

   

viewport.getBlowupRect <viewport index> 

指定されたビューポートの引き伸ばし矩形を取得します。

インタフェース: EditRenderRegion を使用すると手動の領域編集ギズモをコントロールできます(3ds Max 2009 以降で使用可能)。