Название в значительной степени говорит обо всем. Я работаю над простым проектом «давайте привыкнем к lwjgl», включающим манипулирование кубом рубика, и я не могу понять, как определить, на какую сторону / квадрат направлен пользователь.
9
Ответы:
Вы захотите использовать 3D-сбор. Вот код, который я использую в своей игре.
Сначала я снимаю луч с моей камеры. Я использую мышь, но если вы просто используете то, куда смотрит пользователь, вы можете просто использовать центр окна. Это тот код из моего класса камеры:
Затем я следую за лучом, пока он не пересечется с объектом, вы можете сделать это с помощью ограничительных рамок или чего-то подобного, поскольку это характерно для вашей игры, я позволю вам справиться с этим. Обычно это делается путем следования за лучом (добавляя направление луча к его начальной точке снова и снова, пока вы не столкнетесь с чем-то).
Затем вы хотите увидеть, какое лицо выбирается, вы можете сделать это, перебирая треугольники в вашем кубе, чтобы увидеть, пересекает ли их луч. Следующая функция делает это и возвращает расстояние до выбранного лица, тогда я просто использую пересеченное лицо, которое находится ближе всего к камере (так что вы не выбираете заднюю сторону).
Треугольник с кратчайшим расстоянием является выбранным треугольником. Кроме того, бесстыдный плагин для моей игры, вы должны проверить его, следить за ним и голосовать в опросах, которые я периодически выкладываю. Спасибо! http://byte56.com
источник
Техника, которую вы ищете, называется «сбор» или «сбор 3D». Есть несколько способов сделать это; Одним из наиболее распространенных является преобразование 2D-точки на экране в пространство глаза с помощью обратного преобразования проекции. Это позволит вам сгенерировать луч в пространстве вида, который вы можете использовать для проверки на столкновение с физическим представлением ваших различных битов геометрии сцены, чтобы определить, какой объект пользователь «ударил».
Вы также можете использовать «буфер выбора» (или «буфер выбора»), который поддерживает GL. Это в основном включает запись некоторого уникального идентификатора объекта в буфер для каждого пикселя, а затем просто тестирование этого буфера.
В FAQ по OpenGL кратко обсуждаются оба варианта (он больше фокусируется на буфере выбора, поскольку это полностью функция GL; выбор лучей не зависит от API, за исключением, возможно, извлечения активных матриц из конвейера). Вот более конкретный пример техники выбора лучей (для iOS, но она должна переводиться достаточно легко). На этом сайте есть некоторый исходный код некоторых примеров Красной книги OpenGL, портированных на LWJGL, которые включают демонстрацию выбора.
Смотрите также этот вопрос на SO.
источник