Я пытаюсь выполнить простую перспективную проекцию различных трехмерных структур, определенных как множество трехмерных многоугольников (разных z), каждый из которых содержит множество точек. Структура будет просматриваться рядом различных камер, которые я определяю. Эти камеры определяются путем помещения мировой камеры (глаза) в (0,0, z) в мои мировые координаты, просмотра (0,0,0) и вверх (0,1,0) и вращения мировых осей на альфа ( около оси x), бета (около y) и гамма (около z), тем самым создавая мою локальную систему координат для этой конкретной камеры. [Я понимаю, что могу сделать это с OpenGL, но я хочу попробовать сделать это сам и понять, а не использовать черный ящик]
Основа моей глобальной камеры определяется с помощью векторов u, v и w, где w = (взгляд) .normalised = (0,0,1); u = up.cross (w) = (1,0,0) и v = w.cross (u) = (0,1,0)
Я работаю с однородными координатами, поэтому моя матрица преобразования для u_dashed, v_dashed, w_dashed выглядит следующим образом:
T (px, py, pz) = [1,0,0, px; 0,1,0, py; 0,0,1, pz; 0,0,0,1] и R = [u , 0; v, 0; ш, 0; 0,0,0,1]
так что сложив все вместе, я получаю
Tr = T (взгляд) x R 'x R_zyx x R x T (- (взгляд глазами)), где R' - транспонирование R, а R_zyx - комбинированная матрица прямого вращения (мир => локальные координаты) )
Затем я умножаю матрицу ортогональной проекции (O) на матрицу перспективного преобразования (P) (http://www.cs.uu.nl/docs/vakken/gr/Slides/06-projection.pdf), чтобы определить комбинированное преобразование:
C = O x P x Tr
Наконец, proj = (C x 4Dpoint) и разделить перспективу, т.е. (proj.x / proj.w, proj.y, pro.w)
Или мне лучше определить координаты каждой камеры, т.е. R_zyx x [0; 0; z; 1] и u, v и w, по Rzyx x [ux, vx, wx, 0; uy, vy, wy , 0, UZ, уг, WZ, 0; 0,0,0,0]
?