Проецирование сферы на куб

2

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

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

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

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

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

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

  • 0
    Мартин, не могли бы вы отредактировать свой пост, чтобы включить более четкий вопрос?
  • 0
    Конечно, я полагаю, это не совсем понятно.
Показать ещё 2 комментария
Теги:
math
3d
xna

3 ответа

7
Лучший ответ

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

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

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

  • 0
    Ага, это звучит несколько проще, чем та, которую я уже использую! Я попробую реализовать это, посмотрим, что произойдет. Спасибо!
3
# 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
    Не самый простой код, который я когда-либо видел;) Однако, спасибо, теперь я точно знаю, как он работает: D
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню