Bir oyun nesnesinin altındaki araziyi nasıl düzleştirebilirim?


10

Arazi nesnesi yapan ve dokularla boyayan bir senaryom var, ama bir sorunum var. Oyun nesnelerini yerleştirmeye çalıştığımda (birliğin sağladığı basit su nesnesi gibi), oyun nesnesini yerleştirmek için doğru yüksekliği belirlemek için bir Raycast kullanıyorum, ancak bu sadece o noktaya doğru yerleştirilmesini sağlıyor.

Oyun nesnesinin altındaki araziyi, araziye girmemesi veya tepeler durumunda ince havaya takılmaması için nasıl düzleştirebilirim?


3
Oyun nesnesinin altındaki arazi üçgenlerini oluşturan tüm köşeleri bulun. Tüm bu köşelerin y koordinatını aynı yapın.
MichaelHouse

Yanıtlar:


6

Yorumumda söylediğim gibi, oyun nesnenizin altındaki üçgenleri oluşturan tüm köşeleri bulmak ve y değerlerini aynı değere ayarlamak isteyeceksiniz.

Yorumumu daha ayrıntılı adımlarla genişleteceğim. Unity'ye çok aşina değilim, bu yüzden iş için kullanılacak en iyi araçları bilmiyorum, ama inanıyorum ki doğru yola başlayabilirim.

Kaba kuvvet yöntemi:

  1. Oyun nesnenizden bir ışın ızgarası oluşturun. Izgara, arazi yüzeyindeki üçgenleri kaçırmayacak kadar sıkı olmalıdır.
  2. Bir şeye çarpan her ışın için, arazi ağındaki üçgeni aşağıdakilerle alabilirsiniz:

    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 ve p2, vurulan üçgeni oluşturan üç köşenin tüm konumlarıdır. Bu köşe pozisyonlarının her birini aynı ydeğere sahip olacak şekilde ayarlamak istiyorsunuz . Tüm köşeleri toplayabilir, sonra hepsini ortalama bir ydeğere ayarlayabilir veya yoyun nesnesini yerleştirirken bulduğunuz ilk seçilen değeri kullanabilirsiniz .

optimizasyonları:

  • Sadece bir ışın ızgarası dökmek yerine, bir çarpıştırıcıyı oyun nesnesinden aşağı doğru süpürebilir ve oyun nesnesi çarpıştırıcısı ile arazi çarpışma ağı arasındaki çarpışmaların temas noktalarını toplayabilirsiniz. Ardından, bu temas noktalarının her biri için taşımak istediğiniz köşeleri almak için yukarıdaki adımları uygulayın.

  • Arazinizi, her tepe noktası xve zdeğer bir ızgaraya hizalanacak ve yalnızca ydeğerinde farklılık gösterecek şekilde oluşturun . Artık oyun nesnenizin sınırlarını kolayca elde edebilir ve bu sınırlar içindeki köşelerin tüm y değerlerini değiştirebilirsiniz.

Bu son optimizasyon, uygulanması kolay ve oldukça etkili olabilecek alternatif bir yöntemdir.


Terrain ( docs.unity3d.com/Documentation/ScriptReference/Terrain.html ) nesnesinin MeshCollider'da ( docs.unity3d.com/Documentation/ScriptReference/… ) bir MeshCollider ( docs.unity3d.com/Documentation ) olmadığını söyleyebileceğimden / ScriptReference /… ), bu nedenle 2. adımda kullanmaya çalıştığınız bir sharedMesh özelliği yok. Ben terrainData özelliği depoladığı yükseklik eşlemesini değiştirmek için bir tür mantık gerekir varsayılır.
Rapida

Burada kontrol edebilirsiniz: forum.unity3d.com/threads/… Ayrıca, arazi nesnesi düzenli bir ağa sahip gibi görünüyor, bu yüzden ikinci optimizasyon en iyi bahsiniz olabilir.
MichaelHouse

1

Genellikle nesnenin altındaki zeminin düz olmasını ve hemen çevresindeki zeminin düzeltilmesini ister.

Arazi bir ızgaradan yapılmışsa ve bina eksene hizalanmışsa, bu çok daha kolaydır.

Genel durumda, binanın oturduğu üçgenleri alt bölümlere ayırırsınız ve ardından binanın oturduğu üçgenlerdeki tüm köşelerin y değerini aynı y ve sonra olan belirli bir mesafe içinde tüm köşeler için bir orta nokta deplasman yumuşatmayı yapmak kendilerini bir binanın altında değil.

Bu yaklaşımı, 3D bir araziye yollar koymak için kullandım.

Düzeltmek için yeterli araziye sahip olmak için genellikle binalar arasında minimum bir ayrım yapmak istiyorsunuz. Veya yerleştirmeden önce algoritmayı geçici olarak çalıştırabilir ve biraz diklik eşiğinin aşılıp aşılmadığını ve kullanıcının binaları yerleştirebileceği yerlerde polislik yapıldığını görebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.