Координаты мыши на игровые координаты WebGL - PullRequest
0 голосов
/ 06 января 2012

Я пытаюсь перевести координаты мыши x, y в трехмерные мировые координаты холста webgl.Я получил это частично, но у меня возникли проблемы, когда мир вращается вокруг любой оси.

Я использую метод unproject, который получает начальную / конечную точки луча, а затем делает линиюиспытание на столкновение с плоскостью для плоской плоскости с нормальным 0, 1, 0 и используемой точкой 0, 0, 0.

Код можно найти на wingsofexodus.com делать вид источника.Используются следующие функции: RtoW (реальное в мир, для преобразования мыши в мир), lpi (тестирование пересечения линейной плоскости) и unproject.

Прошло много времени, так как мне приходилось выполнять математику / векторную математику и чисткупосле того, как так долго не получается, все становится трудно.

Сайт может работать медленно, мое интернет-соединение не так уж и велико.Если это окажется проблемой, я скопирую код сюда.

Любая помощь или ссылки, которые могут помочь, приветствуются.

1 Ответ

1 голос
/ 06 января 2012

Вы правильно поняли, но я вижу две ошибки и одно ненужное осложнение:

  • Сложность: вместо дублирования кода для вычисления матрицы вида по углам поворота и т. Д. Сохраните копиюоб этом, когда вы вычисляете его (в начале drawScene) и используете это вместо mm.Или убедитесь, что матричный стек находится в нужном месте, и у него есть unproject, просто используйте mvMatrix.Это позволит избежать ошибок из этого.
  • Вы ссылаетесь на перевод в том, что вы делаете с результатом непроекции (в RtoW).Это ошибка, потому что перевод уже включен в mm;Вы или удваиваете или отменяете это.После того, как вы отменили проекцию координат мыши, у вас есть мировые координаты , которые не нуждаются в дальнейшей модификации перед выполнением теста на столкновение лучей.
  • В непроектированном виде вы инвертируете матрицу вида перед умножениемэто с матрицей проекции.Вы можете сделать (псевдокод) invert(view)*invert(projection), или (дешевле) invert(projection*view), но вы в настоящее время делаете invert(projection*invert(view)), что неправильно.

Это то, что выскочило на меня,но я не просмотрел весь ваш кодОтверстие выглядит нормально, когда я сравниваю его с моей собственной версией того же .

...