Как определить матрицу проекции в stage3d, не используя методpectiveFieldOfViewLH - PullRequest
1 голос
/ 25 января 2012

Я сделал этот урок:

http://ltslashgt.com/2011/02/28/molehill-spinning-cube/

Интересная часть в том, что он не использовал перспективуFieldOfViewLH и вместо этого он определил свою собственную матрицу проекции.Я новичок в трехмерном программировании, поэтому после прочтения этого объяснения матрицы проекций:

http://www.songho.ca/opengl/gl_projectionmatrix.html

я попытался реализовать свою собственную матрицу, чтобы проверить, действительно ли я ее понимаю:

var y2:Number = near * Math.tan(fov * Math.PI / 360);
var y1:Number = -y2;
var x1:Number = y1 * aspect;
var x2:Number = y2 * aspect;

return new Matrix3D(Vector.<Number>([
    2 * near / (x2 - x1), 0, 0, 0, //x
    0, 2 * near / (y2 - y1), 0, 0, //y
    0, 0, (far + near) / (near - far), -2 * far * near/ (far - near), //z
    0, 0, -1, 0 //w
    ]));

И у меня черный экран.Все, что я сделал, это обменял матрицу из учебника на эту матрицу.Я пытался поиграть с ним некоторое время, но безрезультатно.Это матрица из учебника:

protected function perspectiveProjection(fov:Number=90,
  aspect:Number=1, near:Number=1, far:Number=2048):Matrix3D {
  var y2:Number = near * Math.tan(fov * Math.PI / 360);
  var y1:Number = -y2;
  var x1:Number = y1 * aspect;
  var x2:Number = y2 * aspect;

  var a:Number = 2 * near / (x2 - x1);
  var b:Number = 2 * near / (y2 - y1);
  var c:Number = (x2 + x1) / (x2 - x1);
  var d:Number = (y2 + y1) / (y2 - y1);
  var q:Number = -(far + near) / (far - near);
  var qn:Number = -2 * (far * near) / (far - near);

  return new Matrix3D(Vector.<Number>([
    a, 0, 0, 0,
    0, b, 0, 0,
    c, d, q, -1,
    0, 0, qn, 0
  ]));
}

Обратите внимание, что первая и вторая строки совпадают.

1 Ответ

0 голосов
/ 29 января 2012

Infact имеет очень хороший ответ, но это может быть слишком высокий уровень.Задача матрицы проекции - переходить из пространства глаза в пространство клипа.Глазное пространство - это то место, где глаз или камера находятся в начале координат (0,0,0) и смотрят вниз z.в глазном пространстве вершины обычно (x, y, z, 1).вывод вершинной программы находится в пространстве клипа.проще всего понять, что происходит с этими (x, y, z, w) координатами пространства клипа для рисования: они проецируются путем деления всех координат на w (не z!).таким образом, координата экрана x равна x / w и т. д., но чтобы получить перспективу, вы хотите разделить на z или расстояние, а не на w, которое все еще равно 1 в пространстве глаз.поэтому основная задача матрицы проекции - переместить глазное пространство z ​​в пространство клипа w.все остальное - просто сложенное дополнительное масштабирование. похоже, что одно из этих масштабирований неверно в вашей версии, скорее всего, z.в мольхилле вывод z используется для проверки глубины и находится в диапазоне -1,0.просто убедитесь, что не забываете, что z тоже будет делиться на w.Вот почему матрица обучающего курса имеет -1 на w для строки z, чтобы получить что-то вроде 1 / z в тесте глубины.теперь я написал текстовую стену :), возможно, лучший совет для обучения - познакомиться с математикой матрицы 4х4 и попытаться следовать конвейерам преобразования на бумаге.

...