3Dホーミング弾の実装につまずいています。
Posted: 2014年6月22日(日) 19:47
こんにちは。
私は現在、3D空間における遅れて追従してくるタイプのホーミング弾の実装についてつまずいます。
いろいろと調べたり、自分なりに試行錯誤してみたのですが思うように行かず、こちらで質問させていただいた次第です。
以下ソースコードですが、注意すべきかもしれない点として、「Effekseer」をホーミング弾として用いています。
どの点が誤っているのか助言をいただけないでしょうか?
よろしくお願いいたします。
私は現在、3D空間における遅れて追従してくるタイプのホーミング弾の実装についてつまずいます。
いろいろと調べたり、自分なりに試行錯誤してみたのですが思うように行かず、こちらで質問させていただいた次第です。
以下ソースコードですが、注意すべきかもしれない点として、「Effekseer」をホーミング弾として用いています。
//生成された各弾の移動処理
for(int i=0; i<255; i++){
if(reimu.g_handleArray[i] != -1) {
//ターゲットへのベクルを算出(仮目標:vec(0,25,0) - 今の座標)
vecTarget[i] = VSub(VGet(0,25,0), VGet(reimu.g_Pos[i].x , reimu.g_Pos[i].y, reimu.g_Pos[i].z ));
//弾の正面(進行方向)ベクトル
vecForward[i] = VNorm(VGet(oldVector[i].x - reimu.g_Pos[i].x , oldVector[i].y - reimu.g_Pos[i].y, oldVector[i].z - reimu.g_Pos[i].z ));
//ターゲットまでの角度
float Seki = VDot(vecForward[i],vecTarget[i]);
float Zetai = sqrt(VSquareSize(vecForward[i])) * sqrt(VSquareSize(vecTarget[i]));
float angleDiff = acos(Seki/Zetai);
//1秒間に回転させる角度
float angleAdd = 60.0f * DX_PI / 180.0f;
//回転させる度合い
angle[i] = ( angleAdd / angleDiff );
//進行方向ベクトルを算出
goAngle[i] = angleDiff - angle[i];
goVec[i] = VGet(cos(goAngle[i]), sin(goAngle[i]), tan(goAngle[i]));
oldVector[i].x = reimu.g_Pos[i].x;
oldVector[i].y = reimu.g_Pos[i].y;
oldVector[i].z = reimu.g_Pos[i].z;
//ターゲットへのベクトル直接(成功:ちゃんと目標地点に向かう)
//reimu.g_Pos[i].x += vecTarget.x;
//reimu.g_Pos[i].y += vecTarget.y;
//reimu.g_Pos[i].z += vecTarget.z;
//弾の進行方向ベクトル(成功?:その場から動かない。初速与えてないので当たり前かもしれない。)
//reimu.g_Pos[i].x += vecForward.x;
//reimu.g_Pos[i].y += vecForward.y;
//reimu.g_Pos[i].z += vecForward.z;
//追従計算後
reimu.g_Pos[i].x += goVec[i].x;
reimu.g_Pos[i].y += goVec[i].y;
reimu.g_Pos[i].z += goVec[i].z;
//座標指定
g_manager->SetLocation( reimu.g_handleArray[i], ::Effekseer::Vector3D( reimu.g_Pos[i].x , reimu.g_Pos[i].y, reimu.g_Pos[i].z ) );
//倍率指定
if(reimu.Size[i] < 5.0f)reimu.Size[i] += 0.05f;
g_manager->SetScale(reimu.g_handleArray[i],reimu.Size[i],reimu.Size[i],reimu.Size[i]);
}
}
よろしくお願いいたします。