วิธีทำให้ Line Renderer อยู่ในแนวราบ


10

ฉันสังเกตเห็นว่าในขณะที่ฉันเพิ่มจุดยอดเพิ่มเติมให้กับ Line Renderer Line การบิดตัวของเส้นและหยุดเป็นเส้นเรียบ

ป้อนคำอธิบายรูปภาพที่นี่

.GIF ที่นี่: http://i.imgur.com/hRAhCXM.gif

เส้นทุกเส้นอยู่ในระดับ z เดียวกันแม้ว่าฉันจะเอาวัสดุออกไปก็ตามเส้นก็ยังดูเหมือนว่าจะบิด

ฉันไม่รู้ว่าทำไมมันถึงเป็นเช่นนี้หรือจะแก้ไขข้อเสนอแนะได้อย่างไร C #


นี่เป็นปัญหาของอัลกอริทึมที่ LineRenderer ใช้ในการจัดตำแหน่งจุดยอดของมันซึ่งทำงานได้ดีกับมุมที่คมชัด คุณสามารถแก้ไขได้บ้างโดยการเพิ่มคะแนนมากขึ้นเพื่อปัดเศษมุมออก แต่วิธีที่แข็งแกร่งที่สุดที่ฉันพบคือทำซ้ำการทำงานของตัวเองด้วยอัลกอริทึมที่ดีกว่าโดยสร้างตาข่ายแบบไดนามิกที่มีจุดยอดที่คุณต้องการหรือสร้างสรรค์ การใช้ประโยชน์จากระบบ ParticleSystem เพื่อดึงจุดต่าง ๆ
DMGregory

1
อัปเดต: Unity รุ่นที่ใหม่กว่า (5 5+) ได้ปรับปรุงอัลกอริทึม LineRendererดังนั้นผู้ใช้ที่พิจารณาใช้ LineRenderers อาจพบว่าผลลัพธ์ที่ออกมานอกกรอบนั้นดีขึ้นอย่างมากในวันนี้
DMGregory

คำตอบ:


11

ปัญหานี้เป็นพื้น:

ป้อนคำอธิบายรูปภาพที่นี่

LineRenderer พยายามเชื่อมต่อตำแหน่งจุดสีแดง มันกำลังสร้างจุดยอดสีเขียวเพื่อทำตาข่าย ดังนั้นกลุ่มบรรทัดบนสุดจึงดูดี แต่แล้ว LineRenderer พยายามประหยัดมันจะนำจุดยอดกลับมาจากจุดสิ้นสุดของส่วนของบรรทัดหนึ่งในส่วนท้ายของส่วนของบรรทัดที่สอง เมื่อมีมุมที่คมชัดคุณจะพบปัญหาที่คุณเห็น ส่วนของบรรทัดที่สองถูกบีบที่จุดตัดเนื่องจาก 'ฝาท้าย' ไม่ได้ตั้งฉากกับส่วนปลายอื่น ๆ

วิธีแก้ปัญหาคือการสร้างตัวแสดงผลบรรทัดของคุณเองและไม่ทำให้ประหยัด คุณสามารถทำได้โดยการสร้างแบบไดนามิกตาข่าย ตาข่ายจะประกอบด้วยชุดของสี่คนบางล่าม สำหรับแต่ละส่วนของเส้นคุณสามารถคำนวณสี่มุมของรูปสี่เหลี่ยมโดยคำนวณตามปกติของบรรทัดและความกว้างของบรรทัดที่ระบุ:

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);

ที่นี่a, b, cและdทำขึ้นสี่มุมของส่วนของเส้นเดียวเช่นเดียวกับจุดสีเขียวในภาพดังกล่าวข้างต้น จุดยอดเหล่านี้จะถูกเพิ่มเข้าไปในตาข่ายและคุณยังเพิ่มดัชนีเพื่อทำให้จุดยอดสี่จุดเป็นสองสามเหลี่ยม

เห็นได้ชัดว่ามันค่อนข้างซับซ้อน ฉันเชื่อว่าอีกเหตุผลหนึ่งที่ Unity ใช้ LineRenderer ของพวกเขาในแบบที่พวกเขาทำเพราะทำเช่นนั้นเพื่อหลีกเลี่ยงปัญหาอื่นมุม เมื่อคุณเริ่มวาดแต่ละส่วนของเส้นคุณจะเริ่มเห็นว่าส่วนของสองบรรทัดนั้นมารวมกันและรวมกันเป็นรูปน่าเกลียด มีวิธีจัดการกับสิ่งนี้โดยการคำนวณปกติที่ใช้ร่วมกันระหว่างทั้งสองบรรทัดและอัปเดตจุดยอดของพวกเขาเป็นปกติที่ใช้ร่วมกัน แต่นี่เป็นเพียงการแก้ปัญหาเพียงบางส่วนเนื่องจากคุณยังสามารถจบลงด้วยเส้น pinched ทางออกที่แข็งแกร่งที่สุดคือการสร้างจุดยอดเพิ่มเติมที่ข้อต่อเพื่อทำหน้าที่เป็นมุม


1
นอกจากนี้คุณยังสามารถหลีกเลี่ยงการใช้ตัวแสดงเส้นร่วมและแทรกจุดเพิ่มเติมเพื่อสร้างตุ้มปี่ขนาดเล็ก เพียงแค่ใส่จุดเล็ก ๆ น้อย ๆ เข้าหาจุดต่อไปจากจุดก่อนหน้า
mklingen

คำอธิบายที่ดี Byte ขอบคุณ ฉันอาจลองดูว่าฉันไม่สามารถสร้างคะแนนเพิ่มเติมที่มุมแต่ละมุมได้ไหมถ้านั่นไม่ได้ผลดีฉันจะทำต่อไปและลองทำตาข่ายแบบไดนามิก ขอบคุณ.
Douglas Gaskell

1

ฉันมีปัญหาเดียวกันและฉันแก้ไขมันเพิ่มจุดมากขึ้นเพื่อให้ขอบเรียบมันไม่ใช่วิธีการแก้ปัญหาที่สง่างาม แต่มันง่ายและใช้งานได้ อย่างน้อยสำหรับฉัน ฉันเขียนฟังก์ชันเพื่อทำสิ่งนี้:

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

วิธีหนึ่งในการแก้ปัญหานี้สำหรับเส้นทึบแสงคือการสร้างวงกลมที่ข้อต่อแต่ละอัน วงกลมต้องมีเส้นผ่านศูนย์กลางเท่ากับความกว้างของเส้น ต้องใช้จุดยอดพิเศษสองสามแห่งในการแสดงผล แต่ดูดีจริงๆ นอกจากนี้คุณยังสามารถกำจัดบรรทัดฐานที่ใช้ร่วมกันระหว่างข้อต่อ

สิ่งนี้ยังต้องการให้คุณเขียนรหัสการเรนเดอร์ของคุณเองแทนที่จะใช้ Unity Line Renderer

ฉันสร้างสินทรัพย์ที่ทำได้เพียงแค่นี้ที่http://u3d.as/nFE


0

วิธีที่ฉันหลีกเลี่ยงสิ่งนี้คือฉันตั้งค่าตำแหน่ง z เป็น 0 เสมอในเมธอด LineRenderer.SetPosition () ดังนั้นแทนที่จะเขียน

LineRenderer.SetPosition(i, myVector3);

ฉันเขียน

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

แต่นั่นไม่ใช่ทางออกที่ดีที่สุดเพราะคุณจะยังได้รับสายแปลก ๆ เหล่านั้น ทางออกที่ดีที่สุดที่ฉันคิดได้ก็คือการสร้างบรรทัดแยก ที่ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน หวังว่านี่จะช่วยคุณได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.