Line Renderer hatları nasıl düz kalır?


10

Bir Line Renderer hattına daha fazla köşe eklerken, çizginin büküldüğünü ve düzgün bir çizgi olmayı bıraktığını fark ettim.

resim açıklamasını buraya girin

.GIF Burada: http://i.imgur.com/hRAhCXM.gif

Tüm çizgiler aynı z seviyesindedir, malzemeleri kaldırsam bile çizgiler hala bükülmüş gibi görünür.

Neden bu ya da çözüm hakkında gitmek için herhangi bir öneri hakkında hiçbir fikrim yok? C #


Bu, LineRenderer'ın keskin köşeleri zayıf bir şekilde ele alan köşelerini konumlandırmak için kullandığı algoritma ile ilgili bir sorundur. Köşeleri yuvarlamak için daha fazla nokta ekleyerek biraz iyileştirebilirsiniz, ancak bulduğum en sağlam yöntem, ihtiyacınız olan köşelerle dinamik bir Mesh oluşturarak veya yaratıcı olarak daha iyi bir algoritma ile işlevselliğini kendiniz çoğaltmaktır. nokta zincirini çizmek için bir ParticleSystem'ı kullanmak.
DMGregory

1
Güncelleme: Unity'nin (5 5+) sonraki sürümleri LineRenderer algoritmasını geliştirdi , bu nedenle LineRenderers kullanmayı düşünen kullanıcılar bu gün kullanıma hazır sonucu bu günlerde önemli ölçüde daha iyi bulabilirler.
DMGregory

Yanıtlar:


11

Sorun temel olarak şudur:

resim açıklamasını buraya girin

LineRenderer kırmızı nokta konumlarını bağlamaya çalışıyor. Bir kafes yapmak için yeşil köşeler yaratıyor. Böylece en üst segment harika görünüyor. Ama sonra LineRenderer ekonomik olmaya çalışır, ikinci çizgi segmentinin sonunda bir çizgi parçasının sonundaki köşeleri yeniden kullanır. Keskin bir açı olduğunda, gördüğünüz sorunu alırsınız. İkinci çizgi parçası kesişme noktasında sıkışır, çünkü 'uç kapağı' diğer 'uç başlığı' ile dik değildir.

Çözüm, kendi çizgi oluşturucunuzu oluşturmak ve bu kadar ekonomik hale getirmemek. Bunu dinamik bir kafes oluşturarak yapabilirsiniz . Ağ, bir dizi ince dörtlüden oluşacaktır. Her bir çizgi parçası için, çizginin normalini ve belirtilen bir çizgi genişliğini hesaplayarak dörtlüün dört köşesini hesaplayabilirsiniz:

Vector3 normal = Vector3.Cross(start, end);
Vector3 side = Vector3.Cross(normal, end-start);
side.Normalize();
Vector3 a = start + side * (lineWidth / 2);
Vector3 b = start + side * (lineWidth / -2);
Vector3 c = end + side * (lineWidth / 2);
Vector3 d = end + side * (lineWidth / -2);

Burada a, b, cve dsadece yukarıdaki resimde yeşil noktalar gibi, tek bir doğru parçasının dört köşesine oluşturuyor. Bu köşeler ağa eklenir ve ayrıca dört köşeyi iki üçgene yapmak için endeksleri de eklersiniz (yani, altı indeks eklenir, abc ve bdc).

Bu açıkça karmaşık olabilir. Unity'nin Unline'ın LineRenderer'ını yaptıkları gibi uygulamasının başka bir nedeni olduğuna inanıyorum çünkü bunu yapmak başka bir problemden, köşelerden kaçınıyor. Her çizgi parçasını çizmeye başladığınızda, iki çizgi parçasının nerede bir araya geldiğini ve çirkin bir bağlantı oluşturduğunu görmeye başlarsınız. Bununla, her iki satır arasındaki paylaşılan normali hesaplayıp köşelerini paylaşılan normal ile güncelleyerek bununla başa çıkmanın yolları vardır, ancak bu, sıkışan çizgilerle kolayca sonuçlanabildiğiniz için sorunu sadece kısmen çözer. En sağlam çözüm, köşe olarak hareket etmek için eklemlerde ek köşeler oluşturmaktır.


1
Ayrıca, birlik çizgisi oluşturucuyu kullanarak ve küçük bir gönye oluşturmak için ek noktalar ekleyerek de uzaklaşabilirsiniz. Bir noktayı, bir önceki noktadan sonraki noktaya doğru biraz yol göster.
mklingen

Büyük açıklama Bayt, teşekkürler. Muhtemelen her köşede daha fazla puan üretip üretemeyeceğimi deneyeceğim, eğer bu işe yaramazsa, devam edeceğim ve dinamik bir kafes yapmak için elimi deneyeceğim. Teşekkür ederim.
Douglas Gaskell

1

Aynı sorunu yaşadım ve kenarları pürüzsüzleştirmek için daha fazla puan ekleyerek çözdüm, zarif bir çözüm değil, basit ve çalışıyor. En azından benim için. Bunu yapmak için bir işlev yazdım:

Vector3[] Generate_Points(Vector3[] keyPoints, int segments=100){
    Vector3[] Points = new Vector3[(keyPoints.Length - 1) * segments + keyPoints.Length];
    for(int i = 1; i < keyPoints.Length;i++){
        Points [(i - 1) * segments + i - 1] = new Vector3(keyPoints [i-1].x,keyPoints [i-1].y,0);
        for (int j = 1;j<=segments;j++){
            float x = keyPoints [i - 1].x;
            float y = keyPoints [i - 1].y;
            float z = 0;//keyPoints [i - 1].z;
            float dx = (keyPoints [i].x - keyPoints [i - 1].x)/segments;
            float dy = (keyPoints [i].y - keyPoints [i - 1].y)/segments;
            Points [(i - 1) * segments + j + i - 1] = new Vector3 (x+dx*j,y+dy*j,z);
        }
    }
    Points [(keyPoints.Length - 1) * segments + keyPoints.Length - 1] = new Vector3(keyPoints [keyPoints.Length-1].x,keyPoints [keyPoints.Length-1].y,0);
    return Points;
}


0

Opak çizgiler için bunu çözmenin bir yolu, her eklemde bir daire oluşturmaktır. Dairenin çizgi genişliğine eşit bir çapa sahip olması gerekir. Bu, birkaç ekstra köşe noktası oluşturulmasını gerektirir, ancak gerçekten güzel görünüyor. Daha sonra eklemler arasındaki paylaşılan normallerden de kurtulabilirsiniz.

Bu, Unity Line Renderer'ı kullanmak yerine kendi oluşturma kodunuzu yazmanızı gerektirir.

Bunu sadece http://u3d.as/nFE adresinde yapan bir varlık yaptım


0

Bundan kaçındığım yol, her zaman z konumunu LineRenderer.SetPosition () yönteminde 0 olarak ayarlamamdır. Yani yazmak yerine

LineRenderer.SetPosition(i, myVector3);

yazdım

LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));

Ama bu en iyi çözüm değil, çünkü o tuhaf çizgileri alacaksın. Aklıma gelen en iyi çözüm ayrı çizgiler oluşturmaktı. Bu benim için mükemmel çalıştı. Umarım bu size yardımcı olur.

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.