Как построить матрицу проекции с ортогональностью по оси y и перспективой по оси x

#3d #shader #webgl

Вопрос:

Как бы я создал матрицу, которая отображает координаты следующим образом:

Рядом с самолетом

 x: [-3,3] -> [-1,1]
y: [-6,2] -> [-1,1]
z: 2 -> -1
 

Дальний самолет

 x: [-4,4] -> [-1,1]
y: [-4,4] -> [-1,1]
z: 0 -> 1
 

Иллюстрация усеченного конуса в плоскости xz и плоскости yz

Я могу сделать это в шейдере вершин со специальной функцией, но хотел бы сделать это с помощью матрицы проекции, если это возможно.

 vec4 special_projection(vec4 p){
  float ty = 0.25 * p.z;
  float tx = 0.25 * p.x;
  float xz = (tx / 3.0) * (p.z / 2.0);
  float x = tx   xz;
  float y = 0.25 * p.y   ty;
  float z = -0.5 * p.z;
  return vec4(x,y,z,1);
}
 

Ответ №1:

То, что вы хотите, не представляется возможным с помощью умножения матриц в однородном пространстве 4d, в котором вы работаете.

Чтобы правильно разделить перспективу, вам нужно будет установить w_clip некоторую линейную функцию z_eye . Стандартным соглашением GL было бы w_clip = -z_eye , и я собираюсь использовать его здесь. Чтобы получить y без искажения перспективы, вам нужно y_clip умножить на w_clip = - z_eye .

Вы, конечно, можете записать любую формулу в шейдер, который вам нравится, но имейте в виду, что, искажая пространство так, как вы намереваетесь, перспективная коррекция интерполяции даст результаты, которых вы, возможно, не ожидали.