Проецирование сферы на куб - PullRequest
2 голосов
/ 14 июня 2009

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

  1. Плоскость, которую он пересекает
  2. Координаты x / y, которые я должен найти в моем 2d массиве, чтобы получить высоту.

Мое текущее решение - это (с использованием XNA):

  1. Построить луч, направленный из [0,0] вдоль поставляемого вектора направления. Проходите по каждой поверхности и делайте пересечение луча / плоскости (это метод, предоставляемый каркасом XNA), чтобы получить расстояние до точки пересечения. Выберите ближайшую плоскость (кратчайшее расстояние до пересечения)
  2. Возьмите 3D-точку и преобразуйте ее в 2D-точку, которую можно использовать для поиска в массиве, чтобы найти радиус (это бит, для которого я не могу отработать математику или найти какие-либо ссылки в Google).

Полезным ограничением является то, что система сферы / куба находится вокруг начала координат.

Итак, проблема, которую нужно решить, такова: Учитывая вектор направления, как мне определить, где он пересекает окружающий куб. Используя этот результат, как мне получить правильное значение в двумерном массиве, который «нарисован» на поверхности этого куба?

Ответы [ 3 ]

7 голосов
/ 14 июня 2009

Посмотрите на величину каждого из 3 компонентов направления. Тот, который имеет наибольшую величину, сообщает вам, на какое лицо куба вы попали (и его знак указывает, является ли это гранью + или -).

Две другие координаты дают вам ваши значения 2D-отображения. Мы должны нормализовать их, хотя. Если ваше направление XYZ имеет X как наивысшую величину, то ваши 2D координаты лица просто U = Y / X и V = Z / X. Они оба варьируются от -1 до 1.

Будьте осторожны с переворотами с положительной стороны на отрицательную, вам может потребоваться перевернуть 2D U и / или V значения в соответствии с вашей системой координат.

3 голосов
/ 14 июня 2009
# edges are called X_AXIS_POS, X_AXIS_NEG, Y_AXIS_POS, Y_AXIS_NEG, Z_AXIS_POS, Z_AXIS_NEG
if (x*x >= y*y) && (x*x >= z*z) : 
    return ( (x>0) ? X_AXIS_POS : X_AXIS_NEG, y/abs(x), z/abs(x))
if (y*y >= z*z) && (y*y >= x*x) : 
    return ( (y>0) ? Y_AXIS_POS : Y_AXIS_NEG, x/abs(y), z/abs(y))
return ( (z>0) ? Z_AXIS_POS : Z_AXIS_NEG, x/abs(z), y/abs(z))
0 голосов
/ 14 июня 2009

Если я правильно вас понимаю, вы пытаетесь отодвинуть пиксель от квадрата на поверхность сферы. Итак, я полагаю, вы успешно нашли пиксель на кубе. Теперь вы масштабируете вектор так, чтобы он касался сферы. Итак, у вас есть x, y, z на сфере.

Сферы, как правило, наложены на текстуру листа. Вы можете найти ссылку на то, как это делается в XNA (или посмотреть на лист текстуры и попытаться выяснить это), или вы можете сделать это: создать лист текстуры, который имеет увеличивающийся красный градиент вдоль оси x и увеличивающий зеленый градиент вдоль г. Карта в на сферу. Посмотрите, что происходит.

...