2013-03-13 2 views
0

XNA 스타일 "MinecraftGame"으로 작은 게임을 개발 중입니다."카메라 전면"모델을 전체 또는 부분적으로 표시하는 방법 - XNA

을 그릴 큐브가 많으므로 입니다. 카메라 앞에 큐브 만 그릴 수있는 기능을 만들었습니다! 그러나 문제는 큐브가 내 시야에서 완전히 채워지지 않으면 그려지지 않을 것이라는 것입니다. 으로, 아래의 '스크린 샷'에서 확인할 수 있습니다. 모서리에있는 큐브는 그려지지 않습니다. 카메라 앞에 큐브를 완전히 그리고 부분적으로 표시하는 방법은 무엇입니까? 뿐만 아니라 전적으로.

덕분에 많은 여기

절두체 모델 포함되어있는 경우 내 코드 확인 :

이 캡처 화면
//Initialize frustum 
private void GenerateFrustum() 
{ 
    Matrix viewProjection = View * Projection; 
    Frustum = new BoundingFrustum(viewProjection); 
} 

//private void UpdateFrustum 
{ 
    Matrix viewProjection = View * Projection; 
    Frustum.Matrix = viewProjection; 
} 

//Function that will add models instantiated in the transformation matrix only if the model is in the field of view ! 
private udpateTransformModelInstancied() 
{ 
    for (int i = 0; i < ListInstance.Count; i++) 
    { 
     if(camera.Frustum.Contains(ListInstance[i].Transform.Translation) != ContainmentType.Disjoint) 
     { 
       instanceTransforms.Add(ListInstance[i].Transform); 
     } 

     } 
....... 
} 

: enter image description here

답변

3

큐브의 위치를 ​​확인하고 있습니다. 이것은 큐브의 실제 크기를 고려하지 않음을 의미합니다. 당신은 그것들을 하나의 포인트로 다루고 있고, 그 포인트가 보이지 않는다면 그것을 렌더하지 않을 것입니다. 당신이해야 할 일은 큐브의 어떤 부분이 보이는지 확인하는 것입니다. 이 작업을 수행하는 가장 간단한 두 가지 방법은 테두리 모양을 찾아서 사용하거나보기에 위치 점이 아닌 큐브의 모서리 점이 있는지 확인하는 것입니다.

+1

하지만 지금은 또 다른 문제가 있습니다^^ 카메라를 빨리 움직이면 땅이 가장자리에서 충분히 빨리 그려지지 않습니다. –

+2

작은 안전 버퍼를 추가하십시오. 당신의 절두체를 실제 시야보다 약간 크게 만드십시오. – anaximander

+1

감사합니다.내가 올바르게 이해하면, 특히 더 큰 절두체를위한 전망과 투영을 만들어야합니다. –

1

을 최대한 멀리 볼 수, 당신은 단지 확인됩니다 각 큐브의 위치. 가장 효과적인 해결 방법은 큐브 중 하나를 완전히 포함하고 큐브 위치로 변환하여 위치를 대신하는 BoundingSphere를 만드는 것입니다.

또한; 절두 원뿔의 가장자리를 설명하는 데 필요한 것보다 구를 조금 더 크게 만듭니다. 그리고 기억하십시오. minecraft-clone을 만들고 싶다면 일종의 일괄 처리 기술을 사용해야 할 것입니다. 인스턴스 버퍼를 사용하여 GPU에 보낼 데이터가 줄어들고 구현하기가 쉬워 지므로 좋습니다.

1

큐브의 위치가 아닌 입방체의 경계 구조를 테스트하는 것이 효과적 일 수 있지만 여러 경계 구조를 관리하고 점이 아닌 경계 구조를 테스트하는 수학을 필요로하여 게임의 복잡성을 증가시킵니다. . 다른 물건에 대한 경계 구조가 필요한 경우 해당 경로로 이동하십시오. 그러나 그렇지 않다면, 나는 큐브의 위치를 ​​취하여 큐브의 왼쪽 또는 오른쪽으로 포인트를 결정하고 그 포인트를 테스트 할 것입니다. 둘 중 하나가 'in'이면 입방체를 그립니다.

Vector3 leftRightVector = Matrix.Transpose(view).Right;//calc once for each frame(or only when camera rotates) 

Vestor3 testPoint1 = cubePosition + (leftRightVector * maxCubeWidth);//calc for each cube 
Vestor3 testPoint2 = cubePosition + (leftRightVector * -maxCubeWidth); 
if(frustum.Contains(testPoint1 || testPoint2) 
{ 
    //draw 
} 
+0

고맙습니다. 나는이 가능성을 사용하지 않았고^^라고 생각했다. 이것은 깨끗한 코드이지만 더 많은 계산을 할 수 있습니다. –

-1

이것은 Mehdi Bugnard의 의견에 대한 대답이어야합니다. Mehdi Bugnard는 카메라를 빨리 움직이면 땅이 가장자리에서 충분히 빨라지지 않는다고 말했다. 나는 모든 객체가 ListInstance에 저장되고 for 루프에서 각각을 그리기 때문에 이런 현상이 발생한다고 생각한다. 그가 많은 객체를 가지고 있다면 루프가 더 많이 실행됩니다. 즉, 코드가 느리게 실행되고 그리기가 실행됩니다. 이 코드는 다시 그리기가 필요하기 때문에 모든 카메라 동작을 반복하며 카메라가 빠르게 움직일 때 훨씬 더 많이 반복합니다. 생각보다 빨리 드로잉을하기 위해 코드를 쉽게 만드는 방법을 더 어렵게 생각해야합니다.

+0

예, 그녀에 관한 것입니다! 답장을 보내 주셔서 대단히 감사합니다. 나는 세계지도를 몇 개의 작은 배열 목록에 몇 개의 작은 영역으로 나누고로드하고 그리는 것이 더 빠르다고 생각했다. 모든 것을 단일 목록에로드하기 전에 –

관련 문제