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);
}
--------------------------------------------------------