Ракета по высоте следов. Не самонаводящаяся ракета

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам