Làm cách nào để làm phẳng địa hình dưới một đối tượng trò chơi?


10

Tôi đã có một kịch bản tạo ra một đối tượng địa hình và vẽ nó bằng họa tiết, nhưng tôi gặp vấn đề. Khi tôi cố gắng đặt các đối tượng trò chơi (chẳng hạn như đối tượng nước đơn giản mà sự thống nhất cung cấp), tôi sử dụng Raycast để xác định chiều cao chính xác để đặt đối tượng trò chơi, nhưng điều đó chỉ đảm bảo rằng nó được đặt chính xác tại điểm cụ thể đó.

Làm thế nào tôi có thể đi về làm phẳng địa hình dưới đối tượng trò chơi để nó không đi vào địa hình hoặc lơ lửng trong không khí mỏng trong trường hợp đồi núi?


3
Tìm tất cả các đỉnh tạo thành các hình tam giác địa hình dưới đối tượng trò chơi. Làm cho tọa độ y của tất cả các đỉnh đó giống nhau.
MichaelHouse

Câu trả lời:


6

Như tôi đã nói trong nhận xét của mình, bạn sẽ muốn tìm tất cả các đỉnh tạo nên các hình tam giác bên dưới đối tượng trò chơi của bạn và đặt giá trị y của chúng thành cùng một giá trị.

Tôi sẽ mở rộng nhận xét của mình với các bước chi tiết hơn. Tôi không quá quen thuộc với Unity, vì vậy tôi không biết các công cụ tốt nhất để sử dụng cho công việc, nhưng tôi tin rằng tôi có thể giúp bạn bắt đầu đi đúng hướng.

Phương pháp vũ phu:

  1. Truyền một lưới các tia thẳng xuống từ đối tượng trò chơi của bạn. Lưới phải đủ chặt để đảm bảo nó sẽ không bỏ sót bất kỳ hình tam giác nào trên bề mặt địa hình.
  2. Đối với mỗi tia chiếu vào thứ gì đó, bạn có thể lấy tam giác trong lưới địa hình bằng cách sau:

    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 và p2 là tất cả các vị trí của ba đỉnh tạo nên tam giác đã bị tấn công. Bạn muốn điều chỉnh từng vị trí đỉnh đó để có cùng ygiá trị. Bạn có thể thu thập tất cả các đỉnh, sau đó đặt tất cả các ygiá trị trung bình hoặc bạn có thể sử dụng ygiá trị được chọn ban đầu bạn tìm thấy khi đặt đối tượng trò chơi của mình.

Tối ưu hóa:

  • Thay vì chỉ truyền một lưới tia, bạn có thể quét một máy va chạm từ đối tượng trò chơi và thu thập các điểm tiếp xúc của các va chạm giữa máy va chạm đối tượng trò chơi và lưới va chạm địa hình. Sau đó, đối với mỗi điểm tiếp xúc đó, hãy thực hiện các bước trên để có được các đỉnh bạn muốn di chuyển.

  • Tạo địa hình của bạn theo cách sao cho mỗi đỉnh xzgiá trị được căn chỉnh theo lưới và chỉ khác nhau về ygiá trị của nó . Bây giờ bạn có thể dễ dàng lấy giới hạn của đối tượng trò chơi của mình và thay đổi tất cả các giá trị y của các đỉnh trong các giới hạn đó.

Tối ưu hóa cuối cùng đó thực sự là một phương pháp thay thế có thể dễ thực hiện và khá hiệu quả.


Từ những gì tôi có thể nói với đối tượng Địa hình ( docs.unity3d.com/Documentation/ScriptReference/Terrain.html ) có một đối tượng TerrainCollider ( docs.unity3d.com/Documentation/ScriptReference/ tựa ) không phải là một GridCollider ( docs.unity3d / ScriptReference / khắc ), do đó, nó thiếu thuộc tính sharedMesh mà bạn cố sử dụng ở bước 2. Tôi giả sử tôi sẽ cần một số loại logic để sửa đổi bản đồ chiều cao mà thuộc tính địa hìnhData lưu trữ.
Rapida

Bạn có thể kiểm tra tại đây: forum.unity3d.com/threads/ Từ Ngoài ra, có vẻ như đối tượng địa hình có lưới thông thường, vì vậy tối ưu hóa thứ hai có thể là lựa chọn tốt nhất của bạn.
MichaelHouse

1

Nó thường muốn mặt đất dưới vật thể bằng phẳng và mặt đất xung quanh nó được làm nhẵn.

Nếu đất được làm từ lưới và tòa nhà được căn chỉnh theo trục, điều này dễ dàng hơn nhiều.

Trong trường hợp chung, bạn chia nhỏ các hình tam giác của tòa nhà, và sau đó đặt y của tất cả các đỉnh trên các hình tam giác mà tòa nhà nằm trên cùng một y , và sau đó thực hiện chuyển vị giữa cho tất cả các đỉnh trong một khoảng cách nhất định không phải bản thân họ dưới một tòa nhà.

Tôi đã sử dụng phương pháp này để đặt đường lên địa hình 3D.

Bạn thường muốn thực thi một sự tách biệt tối thiểu giữa các tòa nhà để có đủ đất để làm mịn. Hoặc bạn có thể chạy thuật toán tạm thời trước khi đặt và xem có vượt quá ngưỡng dốc nào không và chính sách nơi người dùng có thể đặt các tòa nhà.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.