Ракета по высоте следов. Не самонаводящаяся ракета - PullRequest
1 голос
/ 13 марта 2010

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

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

3 голосов
/ 13 марта 2010

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

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

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

0 голосов
/ 13 марта 2010

Как насчет того, как военные поступают с местностью:

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

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

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

...