2013-03-09 3 views
1

투영 행렬에서 줌 비율을 계산하려고합니다. 다음 코드는 이미지가 회전되지 않는 한 작동합니다적절한 크기 조정을 위해 회전을 "실행 취소"하는 방법은 무엇입니까?

void UpdateZoomPercent() 
{ 
    var zoom = _projMatrix.M11 * glControl.Width/2; // M11 is the top left value 
    lblZoomPercent.Text = (zoom * 100).ToString("G3") + "%"; 
} 

는 본질적으로 그것은 단지 X 스케일을 소요하고 뷰포트에을 곱합니다. X와 Y는 항상 비율에 따라 비율이 조정되므로 Y를 볼 필요가 없습니다. 내 장면은 2D입니다.

어떻게 회전 요소를 고려해야합니까?

답변

2

직교 좌표계의베이스를 형성하는 실수 값의 행렬을 생각해 보자. 각 열은 기본 벡터를 나타냅니다. 등각 투영 줌의 경우 모든 기본 벡터의 길이가 동일합니다. C (M, n) = 행렬 M의 n 번째 열 벡터를 C (M, n) = M_n, j라고하면, 등각 투영의 경우 len (C (M, 0)) = len 비대칭 스케일링의 경우, 기본 벡터의 길이는 다를 것이며, 이는 다음과 같이된다 : C (M, 1)) = len (C (M, ...)) 여기서 len (v) = sqrt (v · v)

이 상황을 감지하는 데 사용할 수있는 것입니다.

컴퓨터 그래픽에서 만나는 행렬은 동질성이며 단일 행렬이 나타내는 공간 내의 모든 가능한 변환을 나타낼 수 있습니다. 동 질적 행렬은 N + 1 개의 행과 열을 가지며, 여기서 N은 이들이 나타내는 좌표 공간의 차원 수입니다. 규칙에 따라 (적어도 모든 인기있는 컴퓨터 그래픽 소프트웨어에서) N 번째 열과 행이 균일 한 부분을 형성하면서 왼쪽 상단 부분 (즉, M_i, j 여기서 i와 j는 1 ... N에서 1을 기준으로하는 인덱스)이 기본 벡터를 형성합니다 .

그래서 OpenGL의 경우 왼쪽 위의 3x3 서브 매트릭스를 좌표 기본 벡터로 보았습니다. 그리고 OpenGL은 열의 주요 순서를 색인하기 때문에 OpenGL에서 가져온 것을 재정렬 할 필요가 없습니다.

+0

"W"치수에 대해 알고 있지만, 왼쪽 위 3x3 서브 매트릭스 (또는 2x2, 우리는 2D로 작업하고 있기 때문에)로 무엇을 할 지 잘 모르겠습니다. M (0,0)과 M (1,1)은 스케일링과 회전 모두에 사용되며 회전을 다시 계산하는 방법을 모르겠습니다. – mpen

+2

@ 마크 : 회전을 "제외"할 필요는 없습니다. 단지 서브 매트릭스의 열 벡터의 길이를 계산하면 * 스케일링 요소 *입니다. – datenwolf

+0

오! 나는 따라 가지 않고 있었다고 생각한다. 완벽하게 작동합니다. 감사합니다 .-) – mpen

관련 문제