게임 오브젝트 아래에서 지형을 평평하게하려면 어떻게합니까?


10

지형 객체를 만들고 텍스처로 페인트하는 스크립트가 있지만 문제가 있습니다. 게임 오브젝트 (예 : 유니티가 제공하는 간단한 물 오브젝트)를 배치하려고 할 때, 레이 캐스트를 사용하여 게임 오브젝트를 배치 할 정확한 높이를 결정하지만 특정 지점에 정확하게 배치되도록합니다.

게임 오브젝트 아래에서 지형을 평평하게하여 언덕의 경우 지형으로 들어가거나 얇은 공기에 빠지지 않게하려면 어떻게해야합니까?


3
게임 오브젝트 아래에서 지형 삼각형을 형성하는 모든 정점을 찾으십시오. 모든 정점의 y 좌표를 동일하게 만드십시오.
MichaelHouse

답변:


6

내 의견에서 말했듯이 게임 객체 아래 삼각형을 구성하는 모든 정점을 찾고 y 값을 동일한 값으로 설정하려고합니다.

더 자세한 단계로 내 의견을 확장하겠습니다. 나는 Unity에 너무 익숙하지 않으므로 작업에 사용할 최고의 도구를 모르지만 올바른 길을 시작할 수 있다고 생각합니다.

무차별 강제 방법 :

  1. 게임 오브젝트에서 광선 그리드를 똑바로 내려 놓습니다. 격자는 지형 표면의 삼각형을 놓치지 않도록 단단히 고정되어야합니다.
  2. 무언가에 부딪 치는 각 광선에 대해 다음을 사용하여 터 레인 메쉬에 삼각형을 얻을 수 있습니다.

    RaycastHit hit;
    if (!Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit))
        return;
    
    MeshCollider meshCollider = hit.collider as MeshCollider;
    if (meshCollider == null || meshCollider.sharedMesh == null)
        return;
    
    Mesh mesh = meshCollider.sharedMesh;
    Vector3[] vertices = mesh.vertices;
    int[] triangles = mesh.triangles;
    Vector3 p0 = vertices[triangles[hit.triangleIndex * 3 + 0]];
    Vector3 p1 = vertices[triangles[hit.triangleIndex * 3 + 1]];
    Vector3 p2 = vertices[triangles[hit.triangleIndex * 3 + 2]];
    
  3. p0, p1 및 p2는 적중 된 삼각형을 구성하는 세 정점의 위치입니다. 각 정점 위치를 동일한 y값 으로 조정하려고 합니다. 모든 정점을 수집 한 다음 모두 평균값으로 설정 y하거나 y게임 오브젝트를 배치 할 때 찾은 초기 선택된 값을 사용할 수 있습니다 .

최적화 :

  • 광선 그리드를 캐스팅하는 대신 게임 오브젝트에서 콜 라이더를 아래로 스윕하고 게임 오브젝트 콜 라이더와 지형 충돌 메시 사이의 충돌 접점을 수집 할 수 있습니다. 그런 다음 각 접점에 대해 이동하려는 정점을 얻기 위해 위의 단계를 수행하십시오.

  • 각 정점 xz값이 그리드에 정렬되고 그 y값만 변하는 방식으로 지형을 만듭니다 . 이제 게임 오브젝트의 범위를 쉽게 얻고 해당 범위 내 정점의 모든 y 값을 변경할 수 있습니다.

마지막 최적화는 실제로 구현하기 쉽고 상당히 효과적인 대안 방법입니다.



여기서 확인할 수 있습니다 : forum.unity3d.com/threads/… 또한 지형 오브젝트에 규칙적인 메쉬가있는 것처럼 보이므로 두 번째 최적화가 최선의 방법 일 수 있습니다.
MichaelHouse

1

일반적으로 물체 아래의지면이 평평하고 주위의지면이 부드럽게되기를 원합니다.

토지가 그리드로 만들어지고 건물이 축 정렬되어 있으면 훨씬 쉽습니다.

일반적으로 건물이있는 삼각형을 세분화 한 다음 건물이있는 삼각형의 모든 꼭짓점의 y를 같은 y 로 설정 한 다음 특정 거리 내의 모든 꼭짓점에 대해 중간 점 변위 스무딩을 수행합니다. 건물 자체가 아닙니다.

이 방법을 사용하여 도로를 3D 지형에 배치했습니다.

매끄럽게하기에 충분한 토지를 확보하기 위해 일반적으로 건물 사이의 간격을 최소로 유지하려고합니다. 또는 배치하기 전에 알고리즘을 임시로 실행하고 가파른 임계 값이 초과되어 사용자가 건물을 배치 할 수있는 위치를 확인하는지 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.