Как проверить, находится ли объект на дороге?

Я новичок в разработке игр и использую движок jMonkey. Я начал разрабатывать бесконечную игру типа бега. Для запуска я создал карту с помощью blender и импортировал ее в jME.

Как показано на скриншоте, я добавил его в ландшафт и сделал несколько гор. Теперь мне нужно получить точную векторную точку карты (точка A похожа на точку на снимке экрана).

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

это скриншот

ОБНОВИТЬ

Я хочу определить, находится ли бегущий объект на дороге серебряного цвета или нет. Как я могу это сделать?

1 ответ

Решение

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

Вот пример, который использует механику, предоставленную jMonkeyEngine 3:

public boolean isOnRoad(Vector3f avatarPosition, Geometry road) {
    // Pointing downwards (assuming that the Y-axis is facing upwards in your game)
    Vector3f direction = new Vector3f(0, -1, 0);

    // Create a line that starts at 'avatarPosition' and has a direction
    Ray ray = new Ray(avatarPosition, direction);

    // Results of the collision test are written into this object
    CollisionResults results = new CollisionResults();

    // Test for collisions between the road and the ray
    road.collideWith(ray, results);

    // If there is a collision, avatarPosition is above the road
    return results.size() != 0;
}

Вам нужно передать позицию аватара в функцию.
avatarPosition = avatar.getLocalTranslation();

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

Зов road.collideWith(ray, results) будет неявно строить дерево BIH (дерево иерархии ограничивающих интервалов) для дорожной сетки при первом его использовании. Это ускорит испытания на столкновение, так как не нужно проверять луч на каждом треугольнике дороги. Это будет достаточно быстро, чтобы сделать это в каждом цикле обновления.


Кроме того, вы можете работать с результатами теста на столкновение.
Это возвратит точную точку пересечения, которая является самой близкой к начальной точке:

Vector3f p = results.getClosestCollision().getContactPoint();

И с помощью итератора вы можете обрабатывать все столкновения отдельно, отсортированные от ближайшего к дальнему столкновению:

Iterator<CollisionResult> it = results.iterator();
while(it.hasNext())
{
    CollisionResult collisionResult = it.next();
    Vector3f p    = collisionResult.getContactPoint();
    Geometry geom = collisionResult.getGeometry();
    // Do something with contact point and geometry
}

Больше информации о столкновениях:
http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:collision_and_intersection

Приведение лучей также используется для выбора объектов в 3D-сцене с помощью перекрестия или мыши.
Это называется сбором:
http://hub.jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_picking

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