Bagaimana cara meratakan medan di bawah objek game?


10

Saya punya skrip yang membuat objek terrain dan mengecatnya dengan tekstur, tetapi saya mengalami masalah. Ketika saya mencoba untuk menempatkan objek game (seperti objek air sederhana yang disediakan oleh kesatuan), saya menggunakan Raycast untuk menentukan ketinggian yang tepat untuk menempatkan objek game, tetapi itu hanya memastikan bahwa itu ditempatkan dengan benar pada titik tertentu.

Bagaimana saya bisa meratakan medan di bawah objek game sehingga tidak masuk ke medan atau bergaul di udara tipis dalam kasus bukit?


3
Temukan semua simpul yang membentuk segitiga medan di bawah objek game. Buat koordinat y semua simpul itu sama.
MichaelHouse

Jawaban:


6

Seperti yang saya katakan dalam komentar saya, Anda akan ingin menemukan semua simpul yang membentuk segitiga di bawah objek game Anda dan mengatur nilainya ke nilai yang sama.

Saya akan memperluas komentar saya dengan langkah-langkah yang lebih rinci. Saya tidak terlalu akrab dengan Unity, jadi saya tidak tahu alat terbaik untuk digunakan untuk pekerjaan itu, tapi saya yakin saya bisa membuat Anda memulai jalan yang benar.

Metode kekerasan:

  1. Lemparkan kisi sinar langsung ke bawah dari objek gim Anda. Kisi-kisi harus cukup kencang untuk memastikan tidak akan melewatkan segitiga di permukaan medan.
  2. Untuk setiap sinar yang mengenai sesuatu, Anda bisa mendapatkan segitiga di jala medan dengan yang berikut:

    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 dan p2 adalah semua posisi dari tiga simpul yang membentuk segitiga yang telah terkena. Anda ingin menyesuaikan masing-masing posisi simpul untuk memiliki nilai yang sama y. Anda dapat mengumpulkan semua simpul, lalu mengatur semuanya ke ynilai rata-rata , atau Anda dapat menggunakan nilai pengambilan awal yang yAnda temukan saat menempatkan objek game Anda.

Optimasi:

  • Alih-alih hanya melempar kisi-kisi sinar, Anda dapat menyapu collider ke bawah dari objek game dan mengumpulkan titik kontak tabrakan antara collider objek game dan mesh collision medan. Kemudian untuk masing-masing titik kontak tersebut, lakukan langkah-langkah di atas untuk mendapatkan simpul yang ingin Anda pindahkan.

  • Buat medan Anda sedemikian rupa sehingga setiap titik xdan znilai disejajarkan dengan kisi, dan hanya bervariasi ynilainya. Sekarang Anda dapat dengan mudah mendapatkan batas-batas objek permainan Anda dan mengubah semua nilai y dari simpul dalam batas tersebut.

Optimasi terakhir itu benar-benar metode alternatif yang mungkin mudah diimplementasikan dan cukup efektif.


Dari apa yang saya tahu objek Terrain ( docs.unity3d.com/Documentation/ScriptReference/Terrain.html ) memiliki TerrainCollider ( docs.unity3d.com/Documentation/ScriptReference/… ) bukan MeshCollider ( docs.unity3d.com/Documentation / ScriptReference / ... ), jadi tidak memiliki properti sharedMesh yang Anda coba gunakan pada langkah 2. Saya berasumsi saya akan memerlukan semacam logika untuk memodifikasi peta ketinggian yang disimpan oleh properti terrainData.
Rapida

Anda dapat memeriksa di sini: forum.unity3d.com/threads/... Juga, sepertinya objek medan memiliki mesh biasa, sehingga optimisasi kedua mungkin merupakan taruhan terbaik Anda.
MichaelHouse

1

Biasanya ingin tanah di bawah objek menjadi datar dan tanah di sekitarnya segera dihaluskan.

Jika tanah dibuat dari kisi-kisi dan bangunan sejajar sumbu, ini jauh lebih mudah.

Dalam kasus umum, Anda membagi segitiga di mana bangunan itu berada, dan kemudian mengatur y dari semua simpul pada segitiga di mana bangunan itu berada pada y yang sama , dan kemudian melakukan perpindahan titik tengah perataan untuk semua simpul dalam jarak tertentu yang bukan diri mereka di bawah gedung.

Saya telah menggunakan pendekatan ini untuk menempatkan jalan ke medan 3D.

Anda biasanya ingin menerapkan pemisahan minimum antara bangunan agar memiliki cukup tanah untuk dihaluskan. Atau Anda dapat menjalankan algoritme untuk sementara sebelum penempatan dan melihat apakah beberapa ambang batas kecuraman terlampaui dan dengan demikian mengawasi di mana pengguna dapat menempatkan bangunan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.