2014-01-07 2 views
1

나는 하향식 게임을 위해 2D 카메라 (아래 코드)를 만들었습니다. 플레이어 위치가 0.0x와 0.0y에 가까울 때 모든 것이 잘 작동합니다.XNA 2D 카메라 느슨한 정밀도

거리가 증가 불행하게도으로 변환은 약 0.0X 30e7y에서 문제를 (넵 즉 3000 만 y를) 카메라가 플레이어의 이동은 (카메라가 각각의 끝에서 플레이어의 위치에 업데이트되는 때 전율하기 시작 것 같다 업데이트) 실제로 큰 거리에서 10 억 개 이상의 카메라가 플레이어를 추적하지 못합니다. 매트릭스에서 오류가 너무 많이 발생했다는 것을 짐작할 수 있습니다.

제 질문은 : 행렬에 문제가 있거나 극단적 인 숫자에 대한 표준 동작입니다.

카메라 방법을 변환 :

public Matrix getTransform() 
{ 
    Matrix transform; 

    transform = (Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) * 
      Matrix.CreateRotationZ(rotation) * Matrix.CreateScale(new Vector3(zoom, zoom, 1.0f)) * 
    Matrix.CreateTranslation(new Vector3((viewport.Width/2.0f), (viewport.Height/2.0f), 0))); 

    return transform; 
} 

카메라 업데이트 방법 :

이것은 그 다음 카메라 위치로 설정되어 기본 Vector2를 반환,이 ID의 주어진 객체의 위치를 ​​요청합니다.

if (camera.CameraMode == Camera2D.Mode.Track && cameraTrackObject != Guid.Empty) 
{ 
    camera.setFocus(quadTree.getObjectPosition(cameraTrackObject));      
} 

매트릭스 오류가 발생하는 이유를 설명하는 사람이 누구인지 알 수 있다면 가장 감사하게 생각합니다.

+0

매우 이상합니다. 나는이 매우 높은 숫자가 필요하다고 생각하고 있습니다 (수백만). 가능한 한 내 첫 번째 제안은 이것을 줄이는 것입니다. – tjheslin1

+0

나는 주위에 해결 방법을 알아 냈습니다, 그리고 아래의 버그에 대한 이유를 게시, 코멘트 주셔서 감사합니다 : D 조 – user3170345

답변

0

나는 실제로 이것에 대한 이유를 발견했다. 나는 생각해야 할 것이었다.

저는 정밀도가 7 자리 인 단 정밀도 부동 소수점을 사용하고 있습니다. 더 작은 수의 경우에는 괜찮습니다 (최대 250 만 개까지 표시). 부동 소수점이 잘 리기 시작하면 행렬의 곱셈 함수와 이것에 대한 모든 것이 정밀 오류를 얻기 시작합니다.

내 특정 문제를 해결하는 가장 좋은 방법은 일부 인공 스케일링을 도입하는 것입니다 (시뮬레이션이 공간에 설정 될 때 매우 큰 숫자가 필요함). 나는 나의 세계를 500 만 단위 제곱 (+250 만 단위)으로 제한했으며 세상을 과립 화시키는 또 다른 방법을 생각해 낼 것이다.

Vertices shaking with large camera position values

그리고 더 자세히 부동 점에 대해 설명 좋은 기사 :

What Every Computer Scientist Should Know About Floating-Point Arithmetic

의 의견 주셔서 감사

는 또한 여기에 대한 좋은 답변을 찾을 코멘트!!