Инвертирование матриц проекции и вида модели для преобразования координат щелчка мыши в мировые координаты, пересекающие плоскость z=0

ФОН

Используя KIVY с функциями стиля OpenGL и GLU, я получил modelview а также projection матрицы работают. Матрица модели не используется, поэтому матрица просмотра модели - это просто преобразование, основанное на расположении камеры.

# cx,cy,cz are the location of the camera. cz is always positive
modelview = Matrix().look_at(cx,cy,cz,     # eye position coords
                             cx,cy,0.0,    # looking at this pt.
                             0.0,1.0,0.0)  # a vector pointing up

Матрица проекции также проста и работает по желанию.

aspect_ratio = float(Window.width)/Window.height
projection.perspective(90.0, aspect_ratio, 1.0, 400.0)

look_at а также perspective Функции происходят из класса Matrix от kivy, который эмулирует / инкапсулирует некоторые GLU-функции с одинаковым (или похожим) именем.

Кажется, что проекция работает правильно, но...

ПРОБЛЕМА

Точка на экране может рассматриваться как определяющая луч от глаз камеры до бесконечности. Я хотел бы знать мир x,y координаты, где этот луч пересекает плоскость, определенную z=0,

Вот (одна из) моих (многих) попыток заставить это работать.

x,y  # <--- mouse coords (I've tried range of [0..1], or [0..screenwidth]) 
z=0  # I have also tried z=cz

# create inverse proj. matrix with near set to the distance
# the camera is from z=0
proj = Matrix().identity()
proj.perspective(90.0, aspect_ratio, cz, cz+1.0)
proj_i = proj.inverse()

# create inverse modelview matrix
modelview_i = modelview_mat.inverse()

x,y,z = proj_i.transform_point(x,y,z)
x,y,z = modelview_i.transform_point(x,y,z)

Это не работает В частности, когда у меня камера постоянно удаляется (cz медленно увеличивается). Х, у щелчков мыши не меняются при движении камеры.

Что я делаю неправильно?

Я знаю, что существует много похожих вопросов, но я не смог найти информацию, которую ищу.

0 ответов

Другие вопросы по тегам