Простой ответ заключается в том, что часть рендеринга сцены включает в себя преобразование мировых координат для просмотра координат - где, в основном, все эти вещи относительно моих глазных яблок.
Плоскость просмотра - это экран, которыйэто то, на чем сидит мышьЕсли ваши координаты мыши (xx, yy), то, вероятно, они расположены в точке (xx, yy, 1) или (xx, yy, -1) в координатах вида.Вам, вероятно, понадобится использовать систему, в которой (0, 0) является центром вашего видового экрана на экране - не так, как обычно работают координаты мыши, но постоянные смещения достаточно просты.
zz = 0 - этогде игрок, в то время как плоскость обзора находится на небольшом расстоянии впереди, между игроком и тем, что он может видеть.Вот почему плоскость вида здесь принимается либо (xx, yy, 1), либо (xx, yy, -1) - если вы используете +1 (я думаю, что это нормальный случай), объекты с координатами вида, которые имеют положительное значение zперед вами.
Чтобы преобразовать это обратно в мировые координаты, примените то же преобразование, что и вы, чтобы преобразовать свои мировые координаты для просмотра координат, но в обратном направлении.Затем вы получаете указатель мыши в мировых координатах.Чтобы получить вектор направления, вычтите положение игрока.
Обратное преобразование использует обратную матрицу на каждом шаге и применяет шаги назад.В принципе, все шаги могут быть объединены в одну матрицу, и обратная матрица может быть рассчитана для всего преобразования - но это не лучший подход.Например, гораздо проще вычислить инверсию вращения, чем вычислить обратную матрицу общей матрицы.Если ваше преобразование из мировых координат для просмотра координат составлено по мере необходимости из компонентов (положение, ориентация ...), вам действительно нужно только рассчитать инвертированные компоненты и объединить их.Вместо 30 градусов влево (от мира к виду) вы используете 30 градусов влево (от вида к миру) и т. Д.
Если вам повезет, вы можете отказаться от всей проблемыположение игрока полностью - вычислите угол для указателя мыши в пространстве обзора (для этого достаточно углов Эйлера), затем примените часть ориентации только к преобразованию вида в мир.
Нет здесь-формулыИзвините, отчасти потому, что преобразование вида в мир зависит от того, как вы выполняете преобразование мира в вид, и отчасти потому, что у меня нет простого примера.
Хотя вопрос в другом,Вы можете найти некоторые соответствующие ссылки в ответах здесь ...
Умножение матриц - вид / проекция, мир / проекция и т. д.