Ракета, следующая по высоте гусеницы. Не самонаводящаяся ракета

То, что я пытаюсь создать, — это ракета, которая будет двигаться по трассе в прямом направлении. т.е. Ракета движется в прямом направлении и может ориентироваться на основе своей локальной оси x. Это делается для того, чтобы он мог двигаться вверх/вниз по рампе и никогда не ударялся о землю.

В настоящее время я использую PhysX opengl и 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);
}

Спасибо за поддержку :)


person Aero Chocolate    schedule 12.03.2010    source источник


Ответы (2)


Если ваша трассировка лучей может определить высоту местности в какой-то точке впереди, почему бы вам просто не определить высоту местности в текущих горизонтальных координатах ракеты и визуализировать ракету на фиксированной высоте над ней?

То есть вы как будто пытаетесь изобрести систему наведения для ракеты, тогда как на самом деле все, что вам нужно, это придумать, где ее нарисовать.

На самом деле, вы, вероятно, могли бы получить ориентацию ракеты, заставив ее соответствовать наклону местности под ней, чтобы она не казалась все время абсолютно ровной. Было бы странно, если бы он был ровным при движении по заметным склонам.

person JustJeff    schedule 12.03.2010
comment
Да, я пытался избежать того, чтобы ракета оставалась на фиксированной высоте, потому что я думал, что это будет выглядеть рывками, когда она приблизится к рампе. Но я думаю, что я попытаюсь сделать это снова. Скажем, raycast I с передней части ракеты (raycasting перпендикулярно направлению ракеты). Если число меньше, скажем, единицы, равной 1, то должен ли я вращаться до тех пор, пока длина raycast снова не станет равной 1? Спасибо за помощь. - person Aero Chocolate; 13.03.2010
comment
чем больше вы пытаетесь имитировать реальную физику, тем более реальной она будет выглядеть за счет дополнительного использования процессора и снижения частоты кадров. - person JustJeff; 13.03.2010
comment
Должен ли я использовать raycasting дважды? один раз сзади ракеты и один раз перед ракетой. Вниз? Значит, я могу повернуть и попытаться сделать длину одинаковой? - person Aero Chocolate; 13.03.2010

Как насчет того, чтобы сделать это так, как это делают военные, следуя рельефу местности:

Загляните вперед и найдите самую высокую местность между кораблем и . Добавьте к этому значению желаемую высоту над землей, и вы получите высоту, на которой должна находиться ракета. Если ниже этого подъема, если выше этого спуска.

Выберите, чтобы получить желаемое поведение ракеты. Вероятно, он может быть довольно маленьким.

Существует очень большая вероятность того, что высоты могут быть предварительно рассчитаны, и, таким образом, это сводится к простому поиску массива. (Даже если у вас ландшафт с почти бесконечным разрешением, вам не нужна идеальная детализация данных о высоте.)

person Loren Pechtel    schedule 13.03.2010