http://egohim.blog.me/70000858060



월드 어딘가에 존재하는 x, y에 대한 x’, y` (위치에 대한 모니터상으로 변환 공식)
————————————————————————————————————————————
x` = ((x-left) 2/right-left) - 1                       - 공식 x`
y’ = ((y-bottom) 2/top-bottom)) -1           - 공식 y`

공식 1과 공식 2는 3차원상의 어딘가의 점 x, y, z 에 대한
z = n (Z에 모니터위치 n) 의 어딘가에 찍히는 점 x`, y`, z` 의 공식이다.

x` (또는 y`) 는 -1 과 1사이 값이며, 곧 중심점 0을 기준으로 좌우측 또는 상하로
1만큼의 값의 x (또는 y)의 위치가 된다.

 

x’와 y` 구하는 공식 (원근이 가미된 투영 공식)
————————————————————————————————————————————
x, y, z를 기준으로 x`, y`, z` 각각의 기울기는 아래와 같다.

직선의 방정식 z = (p)z/(p)x * x 직선의 방정식 에서 z = n으로 대입
x = n(p)x / (p)z          - 원근공식 x

역시 직선의 방정식 z = (p)z/(p)y*y 직선의 방정식에 z = n 대입
y = n(p)y / (p)z          - 원근공식 y

시야절두체의 점은 left <= x <= right, bottom <= y <= top을 만족하므로

이 값을 -1, 1 사이의 값으로 변환 하려면
x` = ((x-left) 2/right-left) - 1(공식x`) 에 x = n(p)x / (p)z (원근공식 x) 를 대입한다.
x` = (( n(p)x / (p)z) -left) 2/right-left) - 1 인수분해
-> x` = 2n/right-left * ((p)x/(p)z) - (right+left/right-left) - 원근투영공식 x’

y’ = ((y-bottom) 2/top-bottom)) -1 (공식y`)에  y = n(p)y / (p)z (원근공식 y)를 대입한다.
y’ = (((n(p)y / (p)z)-bottom) 2/top-bottom)) -1 인수분해 
-> y` = 2n/top-bottom * ((p)y/(p)z) - (top+bottom/top-bottom) - 원근투영공식 y’

x`는 즉 어딘가에 있는 점 x 를 원점을 기준으로 직선을 그엇을때
z = n 에 (모니터가 z축에 위치한 점 n에 해당  ,n은 near) 걸쳐지는 직선상의 점을 x`로 정의 한다.

y`는 즉 어딘가에 있는 점 y 를 원점을 기준으로 직선을 그엇을때
z = n 에 (모니터가 z축에 위치한 점 n에 해당 ,n은 near) 걸쳐지는 직선상의 점을 y`로 정의 한다.

 

 z` 구하는 공식 (기울기가 가미)
————————————————————————————————————————————
z 는 near <= z <= far인데, 이 값을 0,1 사이의 값으로 변환 하여야 한다.
원근투영공식 x’ 와 원근투영공식 y’를 보면 z 값이 분모에 있으므로 아래와 같은 수식을 만족하는
A, B 항을 찾는다.

z` = A / z + B        공식 z` 

near = 0 이며 z = n, z` = 0 을 대입하고,  far = 1 이며 z = f, z` = 1 을 대입

0 = A/n + B      - 공식near 
1 = A/f + B       - 공식far
           (->n = near, f = far)

공식near - 공식far = 1 이므로 정리 해보면
1 = A/f - A/n      =>    1 = A(1/f - 1/n)       =>      1 = A(n-f/fn)      =>      A = fn / n-f
A = fn/n-f       -   공식 z’A

0 = (fn /n - f) / n + B     =>  0 = fn / n(n-f) + B    =>   B = f / f-n
B = f / f-n       -    공식 z`B 

공식  z`에 far의 A와 near의 B를 대입한다.
z` = (fn/n-f)(1/(p)z) + f/f-n

곧 원근투영 공식으로 어딘가의 점 z에 대한 모니터 화면 출력의 z`의 공식이 된다. 
z` = (fn/n-f)(1/(p)z) + f/f-n    - 원근투영공식 z`

 

 동차 좌표계 (homegeneous Coordinates)의

p’4 = (x`(p)z, y`(p)z, z`(p)z, (p)z) 점으로 변환
————————————————————————————————————————————
x`(p)z의 동차좌표계공식에 2n/right-left * ((p)x/(p)z) - (right+left/right-left)  원근투영공식 x’   대입
x`p(z) = (2n/right-left)(p)x - (right+left/right-left)p(z) - 동차좌표계 x`공식

 y`(p)z의 동차좌표계공식에  2n/top-bottom * ((p)y/(p)z) - (top+bottom/top-bottom) 원근투영공식 y’ 대입
y`p(z)=  (2n/top-bottom)(p)y - (top+bottom/top-bottom)(p)z- 동차좌표계의 y`공식

 z`(p)z의 공식에 (fn/n-f)(1/(p)z) + f/f-n = z` 공식 대입
z`p(z) = (-fn/f-n) + (f/f-n)(p)z  - 동차 좌표계의 z`공식 

위 공식 3개를 행렬로 대입시키면, 최종 원근 투영변환의 행렬 공식이 도출된다.
————————————————————————————————————————————
  2n / right - left                         0                                0                                    0
             0                   2n / top -bottomtom                    0                                    0
-(right+left / right-left) -(top+bottom/top-bottom)        far / far - near                        1
             0                                 0                -(far * near) / far - near                   0
————————————————————————————————————————————

right - left = width, top - bottom = height로,  left = -right, bottom = -top 으로 보고
————————————————————————————————————————————
    2n / width                            0                                 0                                    0
             0                      2n / height                             0                                    0    
             0                               0                      far / far - near                             1
             0                               0                 -(far * near) / far - near                    0
————————————————————————————————————————————

반응형

'수학 (Mathematics) > 3D수학' 카테고리의 다른 글

1. 복소수와 쿼터니온 그리고 회전  (0) 2012.11.02
동차좌표  (0) 2012.11.02
회전행렬  (0) 2012.11.02
회전 변환  (0) 2012.11.02
일차 독립, 일차 종속  (0) 2012.11.02

+ Recent posts