2012-01-24 2 views
1

을 내가 한 perspectiveFieldOfViewLH 사용하지 않고 stage3d에 투영 행렬을 정의합니다.방법이 튜토리얼을 방법

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

내가 정말 이해할 수 있는지 확인하기 위해 내 자신의 매트릭스를 구현하기 위해 노력 : 나는 3D 프로그래밍, 그래서 투영 행렬이 explenation을 읽은 후 새로운 해요

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 
    ])); 

그리고 검은 색 화면이있어. 내가했던 모든 것은 튜토리얼의 행렬을이 행렬과 교환하고 있었다. 나는 얼마 동안 그걸 가지고 놀려고했지만 결과는 없었다. 제 1 및 제 2 행이 동일한 지

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 
    ])); 
} 

공지 : 이것은 가이드의 행렬이다.

답변

0

infact 매우 좋은 답변이지만 너무 높은 수준 일 수 있습니다. 투영 행렬의 작업은 시각 공간에서 클립 공간으로 이동해야합니다. 눈 공간은 눈이나 카메라가 원점 (0,0,0)에 있고 z를 내려다 보는 곳입니다. 시각 공간에서 정점은 보통 (x, y, z, 1)입니다. 버텍스 프로그램 출력은 클립 공간에 있습니다. 이를 이해하는 가장 쉬운 방법은 그림의 클립 공간 좌표 (x, y, z, w)에서 발생하는 것입니다. 모든 좌표를 w (z가 아닌)로 나누어 투영합니다. 그래서 x 스크린 좌표는 x/w 등입니다. 그러나 당신이 z 나 거리로 나눈 원근법을 얻으려면 w가 아닌 ​​여전히 눈 공간에서 1입니다. 그래서 투영 행렬의 주요 작업은 눈 공간 z를 클립 공간 w로 이동시키는 것입니다. 다른 모든 것들은 폴딩 된 추가 스케일링입니다.이 스케일링 중 하나가 잘못된 버전 인 것 같습니다. 가장 가능성이 높은 버전입니다. molehill에서 z 출력은 깊이 테스트에 사용되며 -1..0 범위입니다. z가 w로 나눌 것임을 잊지 않도록하십시오. 이 튜토리얼 행렬에 z 행에 -1이있는 이유는 깊이 테스트에 1/z와 같은 것을 얻기 위해서입니다. 이제 글의 벽을 썼습니다. 아마도 학습을위한 최고의 조언은 4x4 매트릭스 수학에 익숙해지고 종이에 변형 파이프 라인을 따르려고 시도하는 것입니다.

관련 문제