Привета,Raytracing (LOS) на 3D шестигранная типа плитки карты
Я работаю над игровым проектом, который использует 3D вариант шестиугольных карт плитки. Плитки на самом деле кубики, а не гексы, но выложены так же, как гексы (потому что квадрат можно превратить в куб, чтобы экстраполировать с 2D на 3D, но нет трехмерной версии гекса). Вместо подробного описания, здесь идет пример 4x4x4 карты:
(я выделенный произвольная плитка (зеленый) и прилегающей к нему плитка (желтой), чтобы помочь описать, как все это является должно работать, но функция смежности является не проблему, которая уже решена)
у меня есть тип структуры для представления плитки и карты представлены в виде 3D-массива плитки (завернутом в Map
класса. добавить некоторые полезные методы, но это не очень важно). Каждая плитка должна представлять собой отлично кубическое пространство, и все они точно такого же размера. Кроме того, смещение между соседними «рядами» равно точно половина размера плитки.
Этого достаточно; мой вопрос:
Учитывая координаты двух точек A
и B
, как я могу сгенерировать список плиток (или, точнее, их координат), чтобы пересечь прямую линию между A
и B
?
Это позднее будет использоваться для самых разных целей, таких как определение прямой видимости, законности зарядки и т. Д.
Кстати, это может быть полезно: на моих картах используется (0,0,0) в качестве эталонного положения. «Зубчатость» карты может быть определена как смещение каждой плитки ((y+z) mod 2) * tileSize/2.0
справа от положения, которое она имела бы на «нормальной» декартовой системе. Для строк без зубьев, которые дают 0; для строк, где (y+z) mod 2
равен 1, он дает 0,5 плитки.
Я работаю над C# 4, нацеленным на .Net Framework 4.0; но мне не нужен конкретный код, просто алгоритм для решения странной геометрической/математической проблемы. Я пытался в течение нескольких дней решить это безрезультатно; и пытается сделать все это на бумаге «визуализировать» это не помогло :(.
Заранее спасибо за любой ответ
Спасибо! Мне только удалось получить декартовы преобразования <->. Теперь я остаюсь с фактическим трассировкой лучей, но есть много ответов, чтобы решить это на декартовом пространстве. Для записи я помещаю нижний «ближайший» левый угол ячейки (0,0,0) в точке (0,0,0), но по моим преобразованиям я беру центр каждой ячейки как точка. –