2010-07-23 6 views
0

저는 현재 WPF 주위에서 머리를 감싸려고 노력 중이며 Matrix3D 구조체로 좌표 공간을 변환하는 단계에 있습니다.WPF Matrix3D.Rotate() 함수가 좋지 않습니까?

WPF가 Point3D와 Vector3D 사이에 차이가 있다는 것을 깨닫고 나면 (번역본 2 시간 전 ...) 변환 매트릭스를 얻을 수 있습니다. 나는 이제 회전 행렬을 도입하려고 시도하고 있지만, 무서운 결과를주는 것으로 보인다. 여기 내 세계 좌표 변환에 대한 내 코드 ...

번역이 잘 작동 것으로 보인다
private Point3D toWorldCoords(int x, int y) 
    { 


     Point3D inM = new Point3D(x, y, 0); 


     //setup matrix for screen to world 
     Screen2World = Matrix3D.Identity; 

     Screen2World.Translate(new Vector3D(-200, -200, 0)); 
     Screen2World.Rotate(new Quaternion(new Vector3D(0, 0, 1), 90)); 

     //do the multiplication 
     Point3D outM = Point3D.Multiply(inM, Screen2World); 

     //return the transformed point 
     return new Point3D(outM.X, outM.Y, m_ZVal); 


    } 

, 90도 회전 그러나 부동 소수점 inaacuracies를 반환하는 것입니다. 행렬의 오프셋 행은 렌더링에서 앨리어싱을 생성하는 약간의 요인 (0.000001 또는 어느 쪽이든)에 의해 벗어나는 것처럼 보입니다. 여기서 누락 된 것이 있습니까? 아니면 매트릭스를 수동으로 라운드 할 필요가 있습니까? 심지어 배정 밀도 수학에

건배

답변

2

는 행렬 곱셈과 반올림 오류가있을 것입니다.

4 개의 곱셈을 수행 한 다음 새 행렬의 각 요소에 대한 결과를 합산합니다.

Screen2World 행렬을 변환 행렬로 설정하고 변환하여 단위 행렬을 곱한 다음 회전으로 시작하는 것이 더 나을 수 있습니다. 이것은 하나가 아닌 두 개의 행렬 곱셈이며 반올림 오류의 두 배입니다.

관련 문제