Просто думаю о моих ногах здесь.
Ваши эффективные входные данные - это кажущееся отношение RB / RG [+], видимый угол BRG и угол, который (скажем) RB делает с вашей координатой экрана y (я что-то пропустил). Вы нуждаетесь в компонентах нормализованного нормального (хе!) Вектора, который, как я полагаю, представляет собой только два независимых значения (хотя у вас осталась бы двусмысленная спереди, если карта просвечивает). [++]
Так что я предполагаю, что это возможно ...
С этого момента я работаю в предположении, что видимый угол RB всегда равен 0, и мы можем повернуть окончательное решение вокруг оси z позже.
Начните с карты, расположенной параллельно плоскости просмотра и ориентированной «естественным» образом (т.е. вы выполняете задания сверху вниз и слева и справа). Мы можем достичь всех интересных позиций карты, повернув \theta
вокруг начальной оси x (для -\pi/2 < \theta < \pi/2
), затем повернув на \phi
вокруг начальной оси y (для -\pi/2 < \phi < \pi/2
). Обратите внимание, что мы сохранили видимое направление вектора RB.
На следующем шаге вычисляется видимое соотношение и видимый угол после в терминах \theta
и \phi
и инвертируется результат. [+++]
Нормальным будет R_y(\phi)R_x(\theta)(0, 0, 1)
для R_i
примитивной матрицы вращения вокруг оси i
.
[+] Абсолютные длины не учитываются, потому что это просто говорит о расстоянии до карты.
[++] Еще одно предположение: расстояние от карты до плоскости просмотра намного больше, чем размер карты.
[+++] Здесь важна проекция, которую вы используете из трехмерного пространства на плоскость просмотра. Это сложная часть, но мы не сможем помочь вам, если вы не скажете, какую проекцию вы используете. Если вы используете настоящую камеру, то это перспективная проекция, которая рассматривается практически в любой книге по трехмерной графике.