Посмотрите, на какой «блок» смотрит игрок - PullRequest
3 голосов
/ 07 августа 2011

Я создаю игру, в которой мир состоит из кубов (как в Minecraft), но есть только одна небольшая проблема, на которую я не могу положить палец.Я создал мир, плеер, движение и вращение камеры (glRotatef и glTranslatef).Теперь я застрял в том, чтобы выяснить, на какой блок смотрит игрок.

РЕДАКТИРОВАТЬ: В случае, если я не прояснил свой вопрос, я не понимаю, как привести луч, чтобы проверить на столкновение с блоками.Все блоки, которые я рисую, хранятся в трехмерном массиве, содержащем идентификатор блока (я знаю, что мне нужно использовать октреи, но я просто хочу, чтобы алгоритм работал, оптимизация наступает)

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

OpenGL - это API рисования / рендеринга, а не какой-то игровой / графический движок. Вы говорите ему, чтобы рисовать вещи, и это то, что он делает.

Тесты, подобные тем, которые вы намереваетесь, не охватываются OpenGL, вы должны реализовать их самостоятельно или использовать библиотеку, предназначенную для этого. В вашем случае вы хотите проверить мир на усмотрение просмотра. Точный блок, на который смотрит игрок, можно найти, выполнив тест на пересечение геометрии луча, то есть вы отбрасываете луч из позиции игрока в направлении, куда смотрит игрок, и проверяете, какие объекты пересекаются с этим лучом. Использование пространственной структуры подразделения помогает ускорить процесс. В случае мира, созданного из кубов, самая простая и эффективная структура - это окто-дерево, то есть один большой куб, который подразделяется на 8 субкубов с половиной длины ребра содержащего куба. Затем эти субкубы делятся и так далее.

Обход такой структуры легко реализуется с помощью рекурсивных функций - не беспокойтесь о переполнении стека, так как уже 10 маленьких подразделений дадут 2 ^ 10 ^ 3 = 2 ^ 30 sub-sub -...- sub- кубы с требованием по меньшей мере 8 ГБ данных для построения из них полной детализированной сетки. Но 10 функциональных уровней рекурсии не очень глубоки.

0 голосов
/ 07 августа 2011

Сначала представьте вектор от вашей точки зрения в направлении камеры с длиной, равной «радиусу действия» игрока.Если я правильно помню, вылет в Minecraft составляет около 4 блоков (или 4 метра).Для каждого блока в вашем мире, который может пересекать этот вектор (который может быть таким простым, как трехмерный цикл над кубом блоков, ограниченным значениями min / max x / y / z для вашего вектора досягаемости), навести луч на кубесли это не воздух), чтобы увидеть, если вы ударили его.Радиопередача в AABB (ограничивающий прямоугольник по оси) довольно проста, и вы можете использовать этот алгоритм в Google.Теперь отсортируйте результаты по расстоянию и верните блок, который первым попал на луч.

...