一個のTSXFrameは、一個のローカル座標系(フレーム)を保持します。
尚、フレームの描画は、TSXScene.Renderメソッドで行います。
(凡例:
読み取り専用)
| フレームの内容 | Mesh | |
| Texture | ||
| Textures | ||
| 階層構造 | ||
| Ancestors | ||
| 行列 | Matrix | |
| MatrixOnRender | ||
| MeshMatrix | ||
| MeshMatrixOnRender | ||
| WorldMatrix | ||
| 座標変換についての設定 | EnableMeshTransform | |
| Style | ||
| 情報 | Rendered | |
| ValidMatrixOnRender | ||
| 可視判定用 | Visibility | |
| EnableBounds | ||
| Bounds | ||
| 描画設定 | Lighting | |
| Specular | ||
| BlendMode | ||
| TextureWrap | ||
| FillMode | ||
| Material | ||
| SortKey | ||
| その他 | Tag | |
| RenderAttr | ||
| UserData |
| オーナードロウ | OnRender |
| ソート時の比較用 | OnQueryZ |
| 自前可視判定 | OnQueryVisibility |
Mesh : TSXMesh
フレームに格納されている物体の姿をあらわす、メッシュを指定します。
Texture : TDGTexture
メッシュに貼り付けるテクスチャを指定します。
Textures[idx:Integer] : TDGTexture
複数枚のテクスチャをメッシュに貼り付ける際に用います。
SXLibのデフォルト描画ルーチンではTextures[0]以外は使われません。OnRenderイベント内でマルチテクスチャを利用する際に、自由に使ってください。
idx = 0 〜 7が現在のSXLibの実装では有効です。
なお、Textures[0] は Textureと同じです
Parent : TSXFrame
親フレームを示します。
親フレームが動けばそれにしたがって子フレームも動きます。親フレームが回転すれば、それにしたがって子フレームも回転します。これにより、多関節体の表現が容易に行えます。
Children : TSXFrameList
子フレームのリストを示します。
追加された順に、Children[0], Children[1] ... と、若いインデクスが割り当てられます。
Ancestors : TSXFrameList
自分の親フレーム、さらに親フレーム…と辿っていって、Nilフレームになる一つ手前までの先祖フレームのリストです。
Nilを親に持つ、一番上位の階層のフレームがAncestors[0]になり、親フレームは一番添え字の大きいフレームになります。
最上位のフレームでは、このプロパティはNilがセットされます。
Matrix : D3DMATRIX
親座標系に対する、変換行列です。
自分の座標系での座標を、この行列で変換すると、親座標系での座標になります。
回転、平行移動を表す行列のみを指定してください。シアー、拡大、縮小を表す行列は指定できません。
パフォーマンスを上げるための工夫ですので、ご了承下さい。(逆行列の計算が非常に速くなる、など)
MatrixOnRender : D3DMATRIX
最後にTSXScene.Renderメソッドが実行された際の、自分の座標系からワールド座標系へ変換する行列です。
親座標系でなく、ワールド座標系への変換行列なので、注意してください。紛らわしいネーミングで申し訳ない。
MatrixOnRender: D3DMATRIX
メッシュを描画する際の、メッシュの座標系→自分の座標系に関する変換行列を指定します。
これにより、メッシュが変な方向を向いた状態でモデリングされていたりしても、やや安心です(^^;)
この行列に関しては、シアー、スケーリングを表す行列も指定できます。
尚、EnableMeshTransformプロパティをFalseにすると、メッシュ座標系→フレームの座標系への変換をスキップして、高速化を図れます。
MeshMatrixOnRender: D3DMATRIX
最後にTSXScene.Renderメソッドが実行された際の、メッシュの座標系からワールド座標系へ変換する行列です。
フレーム座標系でなく、ワールド座標系への変換行列ですので、注意してください。
WorldMatrix : D3DMATRIX
自分の座標系から、一番上位のフレームの座標系( = ワールド座標系)への変換を表す行列です。
自分の座標系での座標を、この行列で変換すると、一番上位のワールド座標になります。
EnableMeshTransform : Boolean
Falseを設定すると、メッシュ座標系から自分の座標系への変換をスキップして、高速化します。
デフォルト値はTrueで、メッシュ座標系から自分の座標系への変換をスキップしません。
参照 : MeshMatrix
Style : TSXFrameStyle TSXFrameStyle = ( sxfsDefault, sxfsMeshContainer );
座標変換についてのポリシーを設定します。
| sxfsDefault | 自分の座標系を持ちます |
| sxfsMeshContainer | 親フレームと常に同じ変換行列を取り、純粋にメッシュ格納庫としての役割を果たします |
Rendered : Boolean
最後にTSXScene.Renderメソッドを実行した際に、描画されたか(カリングされていないか)どうかを示します。
ValidMatrixOnRender : Boolean
このフレームの、MatrixOnRender, MeshMatrixOnRenderが有効かどうかを示します。有効ならTrueです。
最後にTSXScene.Renderメソッドを実行した際に、フレームがカリングされていて、なおかつビルボードの参照フレームにされていない場合(つまり、TSXScene.Renderの時点で変換行列を計算する必要が無かった場合)、Falseになります。
このプロパティがFalseでも、なんとか最後にレンダリングした際の変換行列を得たいという場合は、CalcMatrixOnRenderを呼んでください。
Visibility: TSXVisibility TSXVisibility = ( sxvShow, //見える sxvHide, //隠れる。子フレームも含めて sxvHideMyself //隠れる。子フレームは隠れない。 );
このフレームの可視性を定義します。
| sxvShow | フレームの内容は表示されます |
| sxvHide | このフレームとこのフレームの子孫にあたるフレームの内容は表示されません |
| sxvHideMyself | このフレームの内容だけ、表示されません |
EnableBounds:Boolean
Boundsプロパティによるカリングを行うかどうかを設定します。
Trueなら、Boundsプロパティで示される外接球が画面に入っていないとき、子孫フレームも含めて画面に表示されません。Boundsプロパティによるカリングは行われません。
Bounds:TSphere3D;
このフレームと、子孫のフレームを囲む外接球を定義します。
外接球自体が表示されたりはしませんが、カリングの際のヒントとして使われます。
参照 : EnableBounds
Lighting : Boolean
メッシュを描画する際、照明計算を行うかどうかを指定します。
メッシュを描画する際、ライトの設定に基づいて照明計算を行うならTrue、メッシュの頂点色をそのまま使うならFalseを指定します。
Specular : Boolean
メッシュを描画する際に、スペキュラ・ハイライトをつけるかどうかを指定します。
スペキュラ・ハイライトをつけるなら、Trueを指定します。
BlendMode : TSXBlendMode TSXBlendMode = DWord;
メッシュを描画する際の、背景色とのブレンド方法を指定します。
以下が定義済みブレンドモードです。
| sxbDefault | ブレンドを行わず、そのまま描画します |
| sxbAdd | これから描く内容と、背景の色を足します。発光体の表現などに向いています |
| sxbAlpha | これから描く内容と、背景の色を、メッシュの頂点データやテクスチャのα値にしたがって混合します。半透明体の表現などに向いています |
| sxbMul | これから描く内容と、背景の色を乗算します。影などの描画に向いています |
| sxbMulNeg | これから描く内容の色を反転してから、背景の色と乗算します。減算の代わりとして使うと良いでしょう。ブラックホール弾 (どんなだ) の描画などに向いています |
| sxbColorKey | αテストを行います。背景色とのブレンド自体は行われません。 |
TextureWrap : DWord
テクスチャのラップを行うテクスチャ座標軸を指定します。0または、以下の値の1つ以上の和で指定します。
| D3DWRAP_U | U座標に関して、ラップを行うようにします |
| D3DWRAP_V | V座標に関して、ラップを行うようにします |
| D3DWRAP_W | W座標に関して、ラップを行うようにします |
FillMode : D3DFILLMODE
メッシュの塗りつぶし方を設定します。
| D3DFILL_POINT | 各頂点の位置に当たる、点だけを描画します |
| D3DFILL_WIREFRAME | 各三角形の、辺だけを描画します |
| D3DFILL_SOLID | 三角形を塗りつぶして描画します。デフォルトです。 |
Material : D3DMATERIAL9
メッシュを描画する際の、マテリアルを設定します。
SortKey : TSXSortKey TSXSortKey = ( sxsMeshCenter, //メッシュの中心 sxsMeshFar, //メッシュの遠い所 sxsMeshNear //メッシュの近い所 );
メッシュ描画のソート時に、メッシュのどの部分のZ値をソートのキーとするかを設定します。
| sxsMeshCenter | メッシュの中心(重心ではなく、バウンディングボックスの中央です)のZ値を使います |
| sxsMeshFar | 視点から見てメッシュの最も遠い所(正確には、メッシュのバウンディングボックスを構成する点のうち、最も遠いところ)のZ値を使います |
| sxsMeshNear | 視点から見てメッシュの最も近い所(正確には、メッシュのバウンディングボックスを構成する点のうち、最も近いところ)のZ値を使います |
Tag : LongInt
任意のDWord値を指定してください。使い方は自由。
RenderAttr : LongInt
Tag同様、任意の値を指定して、自由に使ってください。
UserData : Pointer
これもTag同様。任意のポインタを指定して、自由に使ってください。
constructor Create (parentFrame:TSXFrame);
TSXFrameオブジェクトを生成します。
parentframeに、親フレームを指定します。
親フレームが動けばそれにしたがって子フレームも動きますし、親フレームが回転すれば、それにしたがって子フレームも回転します。
親の無いフレームを作る場合は、Nilを指定してください。
destructor Destroy;
TSXFrameオブジェクトを破棄します。
親フレームがあれば、そのChildrenリストから自分を削除します。また、子フレームに指定されているフレームは全て解放されます。
procedure SetTransform(ref:TSXFrame; const mat:D3DMATRIX); function GetTransform(ref:TSXFrame):D3DMATRIX;
自分の座標系から、ref で示されるフレームの座標系への変換行列を指定・取得します。
procedure SetTranslation(ref:TSXFrame; const pos:D3Dvector) function GetTranslation(ref:TSXFrame):D3DVector
自分がどこに位置するかをref で示されるフレームの座標系で、設定・取得します。
procedure SetOrientation(ref:TSXFrame; const vecZ:D3DVector; const vecY:D3DVector) procedure GetOrientation(ref:TSXFrame; var vecZ:D3DVector; var vecY:D3DVector)
ref で示されるフレーム内での姿勢を設定・取得します。
vecZで、自分のZ軸が、refフレームの座標系でどちらを向いているのか
vecYで、自分のY軸が、refフレームの座標系でどちらを向いているのか
それぞれを単位ベクトルで指定します。SetOrientationにおいては、vecZ、vecYは直交している必要があります。
procedure SetOrientationQuat(ref:TSXFrame; const quat:TQuaternion);
ref で示されるフレームの座標系での姿勢をクォータニオンquatで設定します。
procedure SetOrientationMatrix(ref:TSXFrame; const mat:D3DMATRIX);
ref で示されるフレームの座標系での姿勢をmatで設定します。
「姿勢」に関する部分のみが変更されて、平行移動分(_41,_42,_43成分) は変更されないという点で、Matrixプロパティによる設定と違う働きをもちます。
procedure LookAt(target:TSXFrame; const pos:D3DVector; world:TSXFrame; const bank:Integer);
targetで示されるフレーム内の座標 pos の方向に、自分のZ軸を向けます。
その際、worldで示されるフレームのY軸を、自分のY軸の基準にします。
bankをバンク角(world と自分のY軸がどれだけ傾いているか)とします。
function LocalToWorld(vec:D3DVector):D3DVector; function WorldToLocal(vec:D3DVector):D3DVector;
フレーム内での座標をワールド座標に変換します(LocalToWorld)
また逆に、ワールド座標系内での座標をフレーム内の座標に変換します(WorldToLocal)
function LocalToWorldRot(rotvec:D3DVector):D3DVector; function WorldToLocalRot(rotvec:D3DVector):D3DVector;
フレーム内での向きベクトルを、ワールド座標での向きベクトルに変換します(LocalToWorldRot)
ワールド座標系内での向きベクトルを、ローカル座標での向きベクトルに変換します(WorldToLocalRot)
procedure UpdateBounds(onlyMyself:Boolean);
自分を含めて下位のフレームまでの状態から外接球を計算します。
onlyMyselfがFalseの時は、下位フレームの外接球も更新します。
可動部分の無い多関節体の外接球が、このメソッドで求めることが出来ます。可動部分の無い多関節体って意味があんまり無い気もしますけど(^^;)
procedure ActivateBounds; //下位フレームも含めて全部のフレームのBSをEnableに procedure DeactivateBounds; //下位フレームも含めて全部のフレームのBSをDisableに
自分と下位のフレームについて、EnableBoundsをTrueにします(ActivateBounds)
自分と下位のフレームについて、EnableBoundsをFalseにします(DeactivateBounds)
procedure CalcMatrixOnRender;
最後にTSXScene.Renderメソッドでレンダリングを実行した時の行列を計算し、MatrixOnRender、MeshMatrixOnRenderプロパティに有効な値を設定し、ValidMatrixOnRenderプロパティにTrueを設定します。
function ViewMatrix:D3DMatrix;
自分をカメラに設定した時のビュー行列を返します。
WorldMatrixの逆行列に等しくなります。
procedure SetBlendModeRcv(Value:TSXBlendMode); procedure SetLightingRcv(Value:Boolean); procedure SetSpecularRcv(Value:Boolean); procedure SetTextureWrapRcv(Value:DWord); procedure SetFillModeRcv(Value:D3DFILLMODE); procedure SetMaterialRcv(Value:D3DMATERIAL9); procedure SetTexturesRcv(idx:Integer; Value:TDGTexture);
BlendMode, Lighting などのプロパティを、自分と下位のフレームについて再帰的に変更します。
procedure OnRenderMesh(Sender:TSXFrame; Scene:TSXScene; DG:TDGCarad) of object
OnRenderイベントハンドラがNil以外に設定されていると、デフォルトでのメッシュの描画の代わりにこのイベントハンドラが呼ばれます。いわば、フレームのオーナードロウを実現します。
Senderには呼び出し元のTSXFrameオブジェクトがセットされます。
Sceneには、レンダリングを行っているTSXSceneオブジェクトがセットされます。
DGには、描画に用いているTDGCaradオブジェクトがセットされます。
procedure OnQueryZ(Sender:TSXFrame; Scene:TSXScene; DG:TDGCarad; var ZValue:Single) of object;
描画前のソートのために、Z値の比較用にこのイベントハンドラが呼ばれます。Nilの場合、デフォルトのZ値計算ルーチンを用います。
OnRenderイベントによるオーナードロウがなされていて、かつMesh = Nilの場合は、必ずこのイベントをセットして、Z値を返すようにしてください。
Senderには呼び出し元のTSXFrameオブジェクトがセットされます。
Sceneには、レンダリングを行っているTSXSceneオブジェクトがセットされます。
DGには、描画に用いているTDGCaradオブジェクトがセットされます。
ZValueに、計算後のZ値を代入してください。
Z値には、カメラから描画する物体への距離を代入してください。
procedure OnQueryVisibility(Sender:TSXFrame; Scene:TSXScene; DG:TDGCarad; var Visibility:TSXVisibility) of object;
可視判定を自前で行う場合に、このイベントをセットしてください。
デフォルトでは、Mesh <> Nil の場合、Mesh.Sphereの可視判定を行うことでフレームのカリングを行います。Mesh = Nil の場合、 OnRender = Nilならば何も描かれず、OnRender <> Nil ならば常にフレームの内容は描画されます(OnRenderに委ねられます)
Senderには呼び出し元のTSXFrameオブジェクトがセットされます。
Sceneには、レンダリングを行っているTSXSceneオブジェクトがセットされます。
DGには、描画に用いているTDGCaradオブジェクトがセットされます。
Visibilityに、計算後の可視属性を代入してください。
Visibilityに指定する値としては、以下のいずれかが有効です。
| sxvShow | フレームの内容は表示されます |
| sxvHide | このフレームとこのフレームの子孫にあたるフレームの内容は表示されません |
| sxvHideMyself | このフレームの内容だけ、表示されません |