TSXFrame

タスク

 一個のTSXFrameは、一個のローカル座標系(フレーム)を保持します。

 尚、フレームの描画は、TSXScene.Renderメソッドで行います。

 

リファレンス目次

プロパティ

(凡例:    読み取り専用)

フレームの内容 Mesh
Texture
Textures
階層構造

Parent

Children

Ancestors
行列 Matrix
MatrixOnRender
MeshMatrix
MeshMatrixOnRender
WorldMatrix
座標変換についての設定 EnableMeshTransform
Style
情報 Rendered
ValidMatrixOnRender
可視判定用 Visibility
EnableBounds
Bounds
描画設定 Lighting
Specular
BlendMode
TextureWrap
FillMode
Material
SortKey
その他 Tag
RenderAttr
UserData

メソッド

コンストラクタ Create
デストラクタ Destroy
位置・姿勢 SetTransform
GetTransform
SetTranslation
GetTranslation

SetOrientation

GetOrientation

SetOrientationMatrix

SetOrientationQuat
LookAt
座標の変換 LocalToWorld
WorldToLocal
LocalToWorldRot
WorldToLocalRot
可視判定用情報設定 UpdateBounds
ActivateBounds
DeactivateBounds
その他 CalcMatrixOnRender
ViewMatrix
SetBlendModeRcv
SetLightingRcv
SetSpecularRcv
SetTextureWrapRcv
SetFillModeRcv
SetMaterialRcv
SetTexturesRcv

イベント

オーナードロウ OnRender
ソート時の比較用 OnQueryZ
自前可視判定 OnQueryVisibility

 

リファレンス〜プロパティ

Mesh

Mesh : TSXMesh

 フレームに格納されている物体の姿をあらわす、メッシュを指定します。

 

Texture

Texture : TDGTexture

 メッシュに貼り付けるテクスチャを指定します。

 

Textures

Textures[idx:Integer] : TDGTexture

 複数枚のテクスチャをメッシュに貼り付ける際に用います。

 SXLibのデフォルト描画ルーチンではTextures[0]以外は使われません。OnRenderイベント内でマルチテクスチャを利用する際に、自由に使ってください。

 idx = 0 〜 7が現在のSXLibの実装では有効です。

 なお、Textures[0] は Textureと同じです

 

Parent

Parent : TSXFrame

 親フレームを示します。

 親フレームが動けばそれにしたがって子フレームも動きます。親フレームが回転すれば、それにしたがって子フレームも回転します。これにより、多関節体の表現が容易に行えます。

 

Children

Children : TSXFrameList

 子フレームのリストを示します。

 追加された順に、Children[0], Children[1] ... と、若いインデクスが割り当てられます。

 

Ancestors

Ancestors : TSXFrameList

 自分の親フレーム、さらに親フレーム…と辿っていって、Nilフレームになる一つ手前までの先祖フレームのリストです。

 Nilを親に持つ、一番上位の階層のフレームがAncestors[0]になり、親フレームは一番添え字の大きいフレームになります。

 最上位のフレームでは、このプロパティはNilがセットされます。

 

Matrix

Matrix : D3DMATRIX

 親座標系に対する、変換行列です。

 自分の座標系での座標を、この行列で変換すると、親座標系での座標になります。

 回転、平行移動を表す行列のみを指定してください。シアー、拡大、縮小を表す行列は指定できません。

 パフォーマンスを上げるための工夫ですので、ご了承下さい。(逆行列の計算が非常に速くなる、など)

 

MatrixOnRender

MatrixOnRender : D3DMATRIX

 最後にTSXScene.Renderメソッドが実行された際の、自分の座標系からワールド座標系へ変換する行列です。

 親座標系でなく、ワールド座標系への変換行列なので、注意してください。紛らわしいネーミングで申し訳ない。

 

MeshMatrix

MatrixOnRender: D3DMATRIX

 メッシュを描画する際の、メッシュの座標系→自分の座標系に関する変換行列を指定します。

 これにより、メッシュが変な方向を向いた状態でモデリングされていたりしても、やや安心です(^^;)

 この行列に関しては、シアー、スケーリングを表す行列も指定できます。

 尚、EnableMeshTransformプロパティをFalseにすると、メッシュ座標系→フレームの座標系への変換をスキップして、高速化を図れます。

 

MeshMatrixOnRender

MeshMatrixOnRender: D3DMATRIX

 最後にTSXScene.Renderメソッドが実行された際の、メッシュの座標系からワールド座標系へ変換する行列です。

 フレーム座標系でなく、ワールド座標系への変換行列ですので、注意してください。

 

WorldMatrix

WorldMatrix : D3DMATRIX

 自分の座標系から、一番上位のフレームの座標系( = ワールド座標系)への変換を表す行列です。

 自分の座標系での座標を、この行列で変換すると、一番上位のワールド座標になります。

 

EnableMeshTransform

EnableMeshTransform : Boolean

 Falseを設定すると、メッシュ座標系から自分の座標系への変換をスキップして、高速化します。

 デフォルト値はTrueで、メッシュ座標系から自分の座標系への変換をスキップしません。

 参照 : MeshMatrix

 

Style

Style : TSXFrameStyle

TSXFrameStyle = (
  sxfsDefault,      
  sxfsMeshContainer
);

 座標変換についてのポリシーを設定します。

sxfsDefault 自分の座標系を持ちます
sxfsMeshContainer 親フレームと常に同じ変換行列を取り、純粋にメッシュ格納庫としての役割を果たします

 

Rendered

Rendered : Boolean

 最後にTSXScene.Renderメソッドを実行した際に、描画されたか(カリングされていないか)どうかを示します。

 

ValidMatrixOnRender

ValidMatrixOnRender : Boolean

 このフレームの、MatrixOnRender, MeshMatrixOnRenderが有効かどうかを示します。有効ならTrueです。

 最後にTSXScene.Renderメソッドを実行した際に、フレームがカリングされていて、なおかつビルボードの参照フレームにされていない場合(つまり、TSXScene.Renderの時点で変換行列を計算する必要が無かった場合)、Falseになります。

 このプロパティがFalseでも、なんとか最後にレンダリングした際の変換行列を得たいという場合は、CalcMatrixOnRenderを呼んでください。

 

Visibility

Visibility: TSXVisibility

TSXVisibility = (
  sxvShow,        //見える
  sxvHide,        //隠れる。子フレームも含めて
  sxvHideMyself   //隠れる。子フレームは隠れない。
);

 このフレームの可視性を定義します。

sxvShow フレームの内容は表示されます
sxvHide このフレームとこのフレームの子孫にあたるフレームの内容は表示されません
sxvHideMyself    このフレームの内容だけ、表示されません

 

EnableBounds

EnableBounds:Boolean

 Boundsプロパティによるカリングを行うかどうかを設定します。

 Trueなら、Boundsプロパティで示される外接球が画面に入っていないとき、子孫フレームも含めて画面に表示されません。Boundsプロパティによるカリングは行われません。

 

Bounds

Bounds:TSphere3D;

 このフレームと、子孫のフレームを囲む外接球を定義します。

 外接球自体が表示されたりはしませんが、カリングの際のヒントとして使われます。

 参照 : EnableBounds


Lighting

Lighting : Boolean

 メッシュを描画する際、照明計算を行うかどうかを指定します。

 メッシュを描画する際、ライトの設定に基づいて照明計算を行うならTrue、メッシュの頂点色をそのまま使うならFalseを指定します。


Specular

Specular : Boolean

 メッシュを描画する際に、スペキュラ・ハイライトをつけるかどうかを指定します。

 スペキュラ・ハイライトをつけるなら、Trueを指定します。


BlendMode

BlendMode : TSXBlendMode

TSXBlendMode = DWord;

 メッシュを描画する際の、背景色とのブレンド方法を指定します。

 以下が定義済みブレンドモードです。

sxbDefault ブレンドを行わず、そのまま描画します
sxbAdd これから描く内容と、背景の色を足します。発光体の表現などに向いています
sxbAlpha これから描く内容と、背景の色を、メッシュの頂点データやテクスチャのα値にしたがって混合します。半透明体の表現などに向いています
sxbMul これから描く内容と、背景の色を乗算します。影などの描画に向いています
sxbMulNeg これから描く内容の色を反転してから、背景の色と乗算します。減算の代わりとして使うと良いでしょう。ブラックホール弾 (どんなだ) の描画などに向いています
sxbColorKey αテストを行います。背景色とのブレンド自体は行われません。

 

TextureWrap

TextureWrap : DWord

 テクスチャのラップを行うテクスチャ座標軸を指定します。0または、以下の値の1つ以上の和で指定します。

D3DWRAP_U U座標に関して、ラップを行うようにします
D3DWRAP_V  V座標に関して、ラップを行うようにします
D3DWRAP_W  W座標に関して、ラップを行うようにします

 

FillMode

FillMode : D3DFILLMODE

 メッシュの塗りつぶし方を設定します。

D3DFILL_POINT 各頂点の位置に当たる、点だけを描画します
D3DFILL_WIREFRAME 各三角形の、辺だけを描画します
D3DFILL_SOLID 三角形を塗りつぶして描画します。デフォルトです。

 

Material

Material : D3DMATERIAL9

 メッシュを描画する際の、マテリアルを設定します。

 

SortKey

SortKey : TSXSortKey

TSXSortKey = (
  sxsMeshCenter,  //メッシュの中心
  sxsMeshFar,     //メッシュの遠い所
  sxsMeshNear     //メッシュの近い所
);

 メッシュ描画のソート時に、メッシュのどの部分のZ値をソートのキーとするかを設定します。

sxsMeshCenter メッシュの中心(重心ではなく、バウンディングボックスの中央です)のZ値を使います
sxsMeshFar 視点から見てメッシュの最も遠い所(正確には、メッシュのバウンディングボックスを構成する点のうち、最も遠いところ)のZ値を使います
sxsMeshNear      視点から見てメッシュの最も近い所(正確には、メッシュのバウンディングボックスを構成する点のうち、最も近いところ)のZ値を使います

 

Tag

Tag : LongInt

 任意のDWord値を指定してください。使い方は自由。


RenderAttr

RenderAttr : LongInt

 Tag同様、任意の値を指定して、自由に使ってください。

 

UserData

UserData : Pointer

 これもTag同様。任意のポインタを指定して、自由に使ってください。

 

 

リファレンス〜メソッド

Create

constructor Create (parentFrame:TSXFrame);

 TSXFrameオブジェクトを生成します。

 parentframeに、親フレームを指定します。

 親フレームが動けばそれにしたがって子フレームも動きますし、親フレームが回転すれば、それにしたがって子フレームも回転します。

 親の無いフレームを作る場合は、Nilを指定してください。


Destroy

destructor Destroy;

 TSXFrameオブジェクトを破棄します。

 親フレームがあれば、そのChildrenリストから自分を削除します。また、子フレームに指定されているフレームは全て解放されます。


SetTransform
GetTransform

procedure SetTransform(ref:TSXFrame; const mat:D3DMATRIX);

function GetTransform(ref:TSXFrame):D3DMATRIX;

 自分の座標系から、ref で示されるフレームの座標系への変換行列を指定・取得します。

 

SetTranslation
GetTranslation

procedure SetTranslation(ref:TSXFrame; const pos:D3Dvector)

function GetTranslation(ref:TSXFrame):D3DVector

 自分がどこに位置するかをref で示されるフレームの座標系で、設定・取得します。

 

SetOrientation
GetOrientation

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においては、vecZvecYは直交している必要があります。

 

SetOrientationQuat

procedure SetOrientationQuat(ref:TSXFrame; const quat:TQuaternion);

 ref で示されるフレームの座標系での姿勢をクォータニオンquatで設定します。 

 

SetOrientationMatrix

procedure SetOrientationMatrix(ref:TSXFrame; const mat:D3DMATRIX);

 ref で示されるフレームの座標系での姿勢をmatで設定します。 

 「姿勢」に関する部分のみが変更されて、平行移動分(_41,_42,_43成分) は変更されないという点で、Matrixプロパティによる設定と違う働きをもちます。

 

LookAt

procedure LookAt(target:TSXFrame; const pos:D3DVector; world:TSXFrame; const bank:Integer);

 targetで示されるフレーム内の座標 pos の方向に、自分のZ軸を向けます。

 その際、worldで示されるフレームのY軸を、自分のY軸の基準にします。

 bankをバンク角(world と自分のY軸がどれだけ傾いているか)とします。

 

LocalToWorld
WorldToLocal

function LocalToWorld(vec:D3DVector):D3DVector;

function WorldToLocal(vec:D3DVector):D3DVector;

 フレーム内での座標をワールド座標に変換します(LocalToWorld)

 また逆に、ワールド座標系内での座標をフレーム内の座標に変換します(WorldToLocal)

 

LocalToWorldRot
WorldToLocalRot

function LocalToWorldRot(rotvec:D3DVector):D3DVector;

function WorldToLocalRot(rotvec:D3DVector):D3DVector;

 フレーム内での向きベクトルを、ワールド座標での向きベクトルに変換します(LocalToWorldRot)
 ワールド座標系内での向きベクトルを、ローカル座標での向きベクトルに変換します(WorldToLocalRot)
 

UpdateBounds

procedure UpdateBounds(onlyMyself:Boolean);

 自分を含めて下位のフレームまでの状態から外接球を計算します。

 onlyMyselfがFalseの時は、下位フレームの外接球も更新します。

 可動部分の無い多関節体の外接球が、このメソッドで求めることが出来ます。可動部分の無い多関節体って意味があんまり無い気もしますけど(^^;)


ActivateBounds
DeactivateBounds

procedure ActivateBounds;     //下位フレームも含めて全部のフレームのBSをEnableに
procedure DeactivateBounds;   //下位フレームも含めて全部のフレームのBSをDisableに

 自分と下位のフレームについて、EnableBoundsをTrueにします(ActivateBounds)

 自分と下位のフレームについて、EnableBoundsをFalseにします(DeactivateBounds)

 

CalcMatrixOnRender

procedure CalcMatrixOnRender;

 最後にTSXScene.Renderメソッドでレンダリングを実行した時の行列を計算し、MatrixOnRenderMeshMatrixOnRenderプロパティに有効な値を設定し、ValidMatrixOnRenderプロパティにTrueを設定します。

 

ViewMatrix

function ViewMatrix:D3DMatrix;

 自分をカメラに設定した時のビュー行列を返します。

 WorldMatrixの逆行列に等しくなります。

 

SetBlendModeRcv
SetLightingRcv
SetSpecularRcv
SetTextureWrapRcv
SetFillModeRcv
SetMaterialRcv
SetTexturesRcv

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 などのプロパティを、自分と下位のフレームについて再帰的に変更します。

 

 

リファレンス〜イベント

OnRender

procedure OnRenderMesh(Sender:TSXFrame; Scene:TSXScene; DG:TDGCarad) of object

 OnRenderイベントハンドラがNil以外に設定されていると、デフォルトでのメッシュの描画の代わりにこのイベントハンドラが呼ばれます。いわば、フレームのオーナードロウを実現します。

 Senderには呼び出し元のTSXFrameオブジェクトがセットされます。

 Sceneには、レンダリングを行っているTSXSceneオブジェクトがセットされます。

 DGには、描画に用いているTDGCaradオブジェクトがセットされます。

 

OnQueryZ

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値には、カメラから描画する物体への距離を代入してください。

 

OnQueryVisibility

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    このフレームの内容だけ、表示されません