В настоящее время я работаю над созданием игры на планете, способ, которым я планирую хранить данные, в 6 2-мерных массивах, которые являются картами роста вокруг сферы (на гранях куба), Проблема у меня в том, что, учитывая нормированный вектор, который указывает из центра сферы, как я могу определить эти две вещи:
Мое текущее решение - это (используя XNA):
Полезным ограничением является то, что сфера/кубическая система находится вокруг начала координат.
Итак, проблема, которая нуждается в решении, такова: Учитывая вектор направления, как определить, где он пересекает окружающий куб. Используя этот результат, как мне получить правильное значение в 2D-массиве, который "окрашен" на лице этого куба?
Посмотрите на величину каждой из трех составляющих направления. Тот, у кого наибольшая величина, указывает вам, на какую сторону куба вы нажмете (и его знак сообщает вам, есть ли это + или - лицо.)
Другие две координаты дают вам значения двумерного отображения. Мы должны их нормализовать. Если ваше XYZ-направление имеет X как самую большую величину, то ваши координаты 2D-графа суть U = Y/X и V = Z/X. Они варьируются от -1 до 1.
Будьте осторожны, переворачиваясь с положительных сторон на отрицательные стороны, вам может потребоваться перевернуть значения 2D U и/или V в соответствии с вашей системой координат.
# 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))
Если я правильно понимаю вас, вы пытаетесь вытащить пиксель с квадрата и на поверхность сферы. Поэтому я предполагаю, что вы успешно нашли пиксель на кубе. Теперь вы масштабируете вектор, чтобы он касался сферы. Итак, на сфере есть x, y, z.
Сферы обычно представляют собой текстуру, сопоставленную с листом. Вы можете найти ссылку на то, как это делается в XNA (или посмотреть на лист текстуры и попытаться выяснить это), или вы можете сделать это: создать лист текстуры, который имеет увеличивающийся красный градиент вдоль оси x и увеличение зеленого градиента вдоль y. Перейдите в сферу. Посмотрите, что произойдет.