■ トピック関連記事
メタセコSDK 投稿者:sio29 投稿日:2010/09/28(Tue) 23:23 No.7204

メタセコのSDKはOnDrawのとき以外は画面のサイズが獲得できない。
メッセージもOnScreenUpdateのほうがOnDrawより早く来るので画面サイズが欲しいとき困ってしまう。
そこでどのメッセージ中でも存在するMQScreenから画面サイズを得る方法を以下に示す。
FMATRIXは4x4マトリクスクラス、FVECTORは3次元ベクトルクラスとする。
クラスはオリジナルだかD3DXMATRIXやD3DXVECTOR3と中身はほぼ同じである。
マトリクス乗算、逆行列、平行移動成分の獲得だけ置き換えればOK。

---------------------------------------------------
void CalcScreenSize(MQScene scene, int &width, int &height){
//ビューマトリクスとプロジェクションマトリクスを得る
FMATRIX pmt,vmt;
scene->GetProjMatrix((float *)&pmt);
scene->GetViewMatrix((float *)&vmt);
//ビューマトリクスxプロジェクションマトリクス
FMATRIX vpmt=vmt*pmt;
//上の逆行列
FMATRIX inv_vpmt=vpmt.Inverse();
//移動パラメータだけ得る
FVECTOR t=inv_vpmt.GetTrans();
//ワールド座標系からスクリーン座標系へ変換
FVECTOR t2=(FVECTOR&)scene->Convert3DToScreen((MQPoint&) t,NULL);
//2倍してwidthとheightへ値を返す
width =ceil(t2.x*2.0f);
height=ceil(t2.y*2.0f);
}
--------------------------------------------------
誤差が1ドットぐらいあるが、何もないよりましだろう。

Re: メタセコSDK - sio29   2010/09/28(Tue) 23:55 No.7205
独自クラスだと分からないと思われるのでMQMatrixとMQPointに置き換えたバージョン
MQMatrixはなぜか逆行列がないので作りました。

--------------------------------------------------------
static float det(const MQMatrix &a,int i1,int i2,int i3,int j1,int j2,int j3){
return ( (a).d[j1][i1]*(a).d[j2][i2]*(a).d[j3][i3]
+(a).d[j1][i2]*(a).d[j2][i3]*(a).d[j3][i1]
+(a).d[j1][i3]*(a).d[j2][i1]*(a).d[j3][i2]
-(a).d[j1][i1]*(a).d[j2][i3]*(a).d[j3][i2]
-(a).d[j1][i2]*(a).d[j2][i1]*(a).d[j3][i3]
-(a).d[j1][i3]*(a).d[j2][i2]*(a).d[j3][i1]);
}
//逆行列を求める
static MQMatrix MQMatrix_Inverse(const MQMatrix &mt1){
float d=det(mt1,0,1,2,0,1,2);
if(0.0<d || d<-0.0){
MQMatrix mt2;
d=1.0f/d;
mt2.d[0][0]= det(mt1,1,2,3,1,2,3)*d;
mt2.d[1][0]=-det(mt1,0,2,3,1,2,3)*d;
mt2.d[2][0]= det(mt1,0,1,3,1,2,3)*d;
mt2.d[3][0]=-det(mt1,0,1,2,1,2,3)*d;
mt2.d[0][1]=-det(mt1,1,2,3,0,2,3)*d;
mt2.d[1][1]= det(mt1,0,2,3,0,2,3)*d;
mt2.d[2][1]=-det(mt1,0,1,3,0,2,3)*d;
mt2.d[3][1]= det(mt1,0,1,2,0,2,3)*d;
mt2.d[0][2]= det(mt1,1,2,3,0,1,3)*d;
mt2.d[1][2]=-det(mt1,0,2,3,0,1,3)*d;
mt2.d[2][2]= det(mt1,0,1,3,0,1,3)*d;
mt2.d[3][2]=-det(mt1,0,1,2,0,1,3)*d;
mt2.d[0][3]=-det(mt1,1,2,3,0,1,2)*d;
mt2.d[1][3]= det(mt1,0,2,3,0,1,2)*d;
mt2.d[2][3]=-det(mt1,0,1,3,0,1,2)*d;
mt2.d[3][3]=1.0f;
return mt2;
}else{
return mt1;
}
}
//画面サイズを得る
void CalcScreenSize(MQScene scene, int &width, int &height){
//ビューマトリクスとプロジェクションマトリクスを得る
MQMatrix pmt,vmt;
scene->GetProjMatrix((float *)&pmt);
scene->GetViewMatrix((float *)&vmt);
//ビューマトリクスxプロジェクションマトリクス
MQMatrix vpmt=vmt*pmt;
//上の逆行列
MQMatrix inv_vpmt=MQMatrix_Inverse(vpmt);
//移動パラメータだけ得る
MQPoint t=inv_vpmt.GetTranslation();
//ワールド座標系からスクリーン座標系へ変換
MQPoint t2=scene->Convert3DToScreen(t,NULL);
//2倍してwidthとheightへ値を返す
width =ceil(t2.x*2.0f);
height=ceil(t2.y*2.0f);
}
--------------------------------------------------------
処理 記事No 暗証キー

- Joyful Note -