1

私が作成しようとしているのは、トラックをまっすぐに抱き締めるロケットです。すなわち)ロケットは真っ直ぐな方向に移動し、そのローカルx軸に基づいて方向を変えることができます。これは、ランプを上り下りすることができ、地面にぶつかることがないようにするためです。

現在、PhysXopenglとC++を使用しています。

これが私が今試みている方法です:1。ミサイルの前方からの光線投下(下向きの光線投下)2。光線投下が予想される光線投下長より短い場合、私は上向きにする必要があります。3.レイキャストが予想されるレイキャストの長さよりも長い場合は、下向きにする必要があります。

問題は、ミサイルが任意の角度(1度)に向けられていることです。ただし、ゲーム内のフレーム数が私ほど多くないため、これは悪いアプローチだと思います。あると思います。そのため、ロケットはランプにぶつかります。

私の主な質問は、これにアプローチするためのより良い方法と方法はありますか?

NxVec3 frontRayLoc = m_rocketConfig->getValueForKey<NxVec3>("r_frontRayCastLocation");
float threshhold = m_rocketConfig->getValueForKey<float>("r_angleThreshhold");
float predRayCastHeight = m_rocketConfig->getValueForKey<float>("r_predRayCastHeight");

NxVec3 rayGlobalPos_1 = m_actor->getGlobalPosition() + m_actor->getGlobalOrientation() * frontRayLoc;
NxVec3 dir = m_actor->getGlobalOrientation() * NxVec3(0,-1.0,0);
NxReal dist1 = castRay(rayGlobalPos_1, dir);

// Get the percentage difference
float actualFrontHeight = abs(1 - (dist1/predRayCastHeight));

// See if the percentage difference is greater then threshold
// Also check if we are being shot off track
if ((actualFrontHeight > threshhold) && (dist1 != m_rayMaxDist)){
    // Dip Down
    if (dist1 > predRayCastHeight){
        printf("DOWN - Distance 1: %f\n", dist1);
        // Get axis of rotation
        NxVec3 newAxis = m_actor->getGlobalOrientation() * NxVec3(1.0,0,0.0);
        // Rotate based on that axis
        m_orientateAngle = -1.0 * m_orientateAngle; // For rotating clockwise
        NxQuat newOrientation(m_orientateAngle, newAxis);
        NxMat33 orientation(newOrientation);
        m_orientation = m_orientation * orientation;
        // Orientate the linear velocity to keep speed of rocket and direct away from road
        NxVec3 linVel = m_actor->getLinearVelocity();
        m_actor->setLinearVelocity(m_orientation * linVel);
    }
    // Go Up
    else if (dist1 < predRayCastHeight){
        printf("UP - Distance 1: %f\n", dist1);
        // Get axis of rotation
        NxVec3 newAxis = m_actor->getGlobalOrientation() * NxVec3(1.0,0,0.0);
        // Rotate around axis
        NxQuat newOrientation(m_orientateAngle, newAxis);
        m_actor->setGlobalOrientationQuat(newOrientation);
        NxMat33 orientation(newOrientation);
        m_orientation = m_orientation * orientation;
        // Orientate the linear velocity to keep speed of rocket and direct away from road
        NxVec3 linVel = m_actor->getLinearVelocity();
        m_actor->setLinearVelocity(m_orientation*linVel);
    }
        m_actor->setGlobalOrientation(m_orientation);
}

ご支援ありがとうございます :)

4

2 に答える 2

3

レイトレーシングで前方のある時点で地形の高さを特定できる場合、ロケットの現在の水平座標で地形の高さを特定し、それより上の固定の高さでロケットをレンダリングできないのはなぜですか?

つまり、あなたはロケットの誘導システムを発明しようとしているようですが、本当に必要なのはそれをどこに引くかを理解することだけだと思われるときです。

実際には、ロケットが常にデッドレベルで表示されないように、ロケットをその下の地形の傾斜に一致させることで、ロケットの向きを取得できる可能性があります。目立つ斜面を追跡しているときに水平になっていると、奇妙に見えます。

于 2010-03-12T23:55:01.813 に答える
0

軍隊が次の地形で行うようにそれを行うのはどうですか?

前方の距離を見て、クラフトとの間の最も高い地形を見つけます。この値に地上からの希望の高さを追加すると、ロケットの高度がわかります。それがこの上昇より下にある場合、それがこの下降より上にある場合。

ロケットの望ましい動作を取得することを選択します。おそらくかなり小さいかもしれません。

高さを事前に計算できる可能性が非常に高いため、これは単純な配列ルックアップになります。(ほぼ無限の解像度の地形がある場合でも、高さデータに完全な粒度は必要ありません。)

于 2010-03-13T01:01:08.813 に答える