지형 객체를 만들고 텍스처로 페인트하는 스크립트가 있지만 문제가 있습니다. 게임 오브젝트 (예 : 유니티가 제공하는 간단한 물 오브젝트)를 배치하려고 할 때, 레이 캐스트를 사용하여 게임 오브젝트를 배치 할 정확한 높이를 결정하지만 특정 지점에 정확하게 배치되도록합니다.
게임 오브젝트 아래에서 지형을 평평하게하여 언덕의 경우 지형으로 들어가거나 얇은 공기에 빠지지 않게하려면 어떻게해야합니까?
지형 객체를 만들고 텍스처로 페인트하는 스크립트가 있지만 문제가 있습니다. 게임 오브젝트 (예 : 유니티가 제공하는 간단한 물 오브젝트)를 배치하려고 할 때, 레이 캐스트를 사용하여 게임 오브젝트를 배치 할 정확한 높이를 결정하지만 특정 지점에 정확하게 배치되도록합니다.
게임 오브젝트 아래에서 지형을 평평하게하여 언덕의 경우 지형으로 들어가거나 얇은 공기에 빠지지 않게하려면 어떻게해야합니까?
답변:
내 의견에서 말했듯이 게임 객체 아래 삼각형을 구성하는 모든 정점을 찾고 y 값을 동일한 값으로 설정하려고합니다.
더 자세한 단계로 내 의견을 확장하겠습니다. 나는 Unity에 너무 익숙하지 않으므로 작업에 사용할 최고의 도구를 모르지만 올바른 길을 시작할 수 있다고 생각합니다.
무차별 강제 방법 :
무언가에 부딪 치는 각 광선에 대해 다음을 사용하여 터 레인 메쉬에 삼각형을 얻을 수 있습니다.
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]];
p0, p1 및 p2는 적중 된 삼각형을 구성하는 세 정점의 위치입니다. 각 정점 위치를 동일한 y
값 으로 조정하려고 합니다. 모든 정점을 수집 한 다음 모두 평균값으로 설정 y
하거나 y
게임 오브젝트를 배치 할 때 찾은 초기 선택된 값을 사용할 수 있습니다 .
최적화 :
광선 그리드를 캐스팅하는 대신 게임 오브젝트에서 콜 라이더를 아래로 스윕하고 게임 오브젝트 콜 라이더와 지형 충돌 메시 사이의 충돌 접점을 수집 할 수 있습니다. 그런 다음 각 접점에 대해 이동하려는 정점을 얻기 위해 위의 단계를 수행하십시오.
각 정점 x
과 z
값이 그리드에 정렬되고 그 y
값만 변하는 방식으로 지형을 만듭니다 . 이제 게임 오브젝트의 범위를 쉽게 얻고 해당 범위 내 정점의 모든 y 값을 변경할 수 있습니다.
마지막 최적화는 실제로 구현하기 쉽고 상당히 효과적인 대안 방법입니다.
일반적으로 물체 아래의지면이 평평하고 주위의지면이 부드럽게되기를 원합니다.
토지가 그리드로 만들어지고 건물이 축 정렬되어 있으면 훨씬 쉽습니다.
일반적으로 건물이있는 삼각형을 세분화 한 다음 건물이있는 삼각형의 모든 꼭짓점의 y를 같은 y 로 설정 한 다음 특정 거리 내의 모든 꼭짓점에 대해 중간 점 변위 스무딩을 수행합니다. 건물 자체가 아닙니다.
이 방법을 사용하여 도로를 3D 지형에 배치했습니다.
매끄럽게하기에 충분한 토지를 확보하기 위해 일반적으로 건물 사이의 간격을 최소로 유지하려고합니다. 또는 배치하기 전에 알고리즘을 임시로 실행하고 가파른 임계 값이 초과되어 사용자가 건물을 배치 할 수있는 위치를 확인하는지 확인할 수 있습니다.