2016-11-01 6 views
0

C++ 용 DirectXTK를 사용하고 있으며 스프라이트 배치 기능을 많이 사용하고 있습니다.DirectxTK SpriteBatch 및 뷰포트 센터링

등각 렌더링 엔진을 개발하려고합니다. 나는 이미 등각 투영 렌더링을 제대로 수행했습니다. 상쇄와 함께. 그러나 나는 하나의 큰 문제에 부딪친 다.

나는 세상의 (0,0) 또는 다른 좌표로 카메라의 중심을 맞추는 방법을 생각할 수 없다.

그리고 SpriteBatch.Begin으로 카메라에서 직접 생성이 변환 행렬()

Matrix Camera::getTransformMatrix() { 

    Matrix Transform = Transform.CreateTranslation(Vector3(World_Pos.x, World_Pos.y, 0)); 
    Matrix Rotation = Rotation.CreateRotationZ(0); 
    Matrix Scale = Scale.CreateScale(ZoomFactor, ZoomFactor, 1); 
    return Transform * Rotation * Scale; 
} 

아무것도 일어나지 보인다 주입 후

. 이것은 카메라의 월드 위치가 (0,0)으로 설정되고 스프라이트의 월드 위치가 (0,0)으로 설정된 상태입니다.

이것은 결과 이미지입니다.

http://i.imgur.com/Bep7l5a.png

나는 이유를 디버깅 알파 블렌딩 및 스프라이트 오프셋을 해제.

아무도 도와 줄 수 있습니까? 또한 누군가가 y를 뒤집는 법을 말해 줄 수 있다면 그것은 좋을 것입니다.

+0

DirectXTK를 사용하지는 않았지만'Camera :: getTransformMatrix()'에 의해 반환되는 변환 매트릭스를 적용하는 방법은 무엇입니까? –

+0

@ Zamrony를 그대로 spritebatch.begin의 인수에 입력하여. – moonshineTheleocat

답변

1

SpriteBatch으로 사용자 지정 변환을 제공하면 화면 뷰포트의 기본 변환이 계속 적용됩니다. 기본 변환을 사용하면 SpriteBatch이 화면의 왼쪽 상단에서 시작하는 픽셀 좌표로 작동합니다.

사용자 지정 변환을 사용하려면 "있는 그대로"최종 뷰포트 변환과 합치하지 않고, 당신이 방향 처리를 위해이 특별한 경우를 사용할 수 있습니다

spriteBatch->SetRotation(DXGI_MODE_ROTATION_UNSPECIFIED); 

wiki 읽어주십시오.

+0

내가 원하는 부분은 아니지만 해결했습니다. – moonshineTheleocat

+0

회전 모드를 this로 설정하면 중심을 0,0으로 설정하여 표준 정규화 된 공백 (-1에서 1)으로 다시 놓고 기본 축척 및 간격 띄우기를 건너 뛰기 때문에 변환 할 필요가 없습니다. 왼쪽 상단에 가운데가있는 0,0, 너비, 높이에 넣으십시오. –

1

내 대답을 찾았습니다. 이 문제에 부딪히는 사람들에게도. 보기 포트가 화면 중심으로 중앙 (0,0)으로 변환되어야한다는 사실을 보완해야합니다. 당신이 필요로하는 행렬이라고 말할 것입니다

...

보기 * 번역 (폭 * 0.05, 높이 * 0.05)보기의 제품의 역행렬이다

당신의 세계 규모, 세계 교체 및 세계 변형.

되도록 최종 세계 변환 행렬 F 및 뷰 매트릭스 V를 만족의 생성물 ...

I = F * V

I는 항등 행렬이다

.