จะหลีกเลี่ยงการตัดกันตนเองอย่างไรเมื่อใช้การลากเส้นกับเส้นโค้ง


11

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

โครงร่าง: http://twitpic.com/2zplw1/full
Filled: http://twitpic.com/2zpmnt/full

อย่างที่คุณเห็นในส่วนโค้งที่สองส่วนด้านในตัดกันซึ่งเป็นสาเหตุของสิ่งประดิษฐ์ที่น่าเกลียด มีอัลกอริธึมที่ดี / วิธีการในการเส้นโค้งจังหวะโดยไม่ทำให้เกิดการแยกตนเองหรือไม่

แก้ไข : ตัวอย่างสุดขีดเพิ่มเติมรวมถึงการจำลองในสิ่งที่ฉันต้องการบรรลุ:

Wireframe: http://twitpic.com/2ztwzi/full
Filled: http://twitpic.com/2ztwkt/full
ผลในอุดมคติ (จำลอง): http://twitpic.com/2ztxa8/full


ว้าวฉันไม่ได้ตระหนักถึงความหมายของชื่อเมื่อฉันเขียนมัน :)
ThatsGobbles

คำตอบ:


3

หากคุณแสดงผลเหล่านี้ด้วย GPU และ 3D api สมัยใหม่ (เช่น OpenGL / D3D) ดูเหมือนว่าฉันจะสามารถกำจัดสิ่งนี้ได้ด้วยการทดสอบเชิงลึก หากคุณกำหนด verts ภายนอกให้เป็น z = FAR และ verts ภายในของคุณเป็น z = NEAR การทดสอบเชิงลึกควรป้องกันการซ้อนทับจากการแสดง ด้วย OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Caveat emptor: สิ่งนี้จะไม่ทำงานหากคุณต้องการจังหวะโปร่งแสง


1
คำตอบที่ยอดเยี่ยมสิ่งที่ฉันคิด แต่คุณผิดเกี่ยวกับมันไม่ทำงานสำหรับจังหวะโปร่งแสงถ้าคุณอนุญาตให้เขียน zbuffer ในครั้งเดียวแล้วทำสีในวินาที
Richard Fabian

ขอบคุณลายเส้นของฉันทึบแสงดังนั้นสิ่งนี้ทำงานได้อย่างเรียบง่ายและเยี่ยมยอด!
ThatsGobbles

1

"การแก้ไข" จะขึ้นอยู่กับสิ่งที่คุณต้องการผลลัพธ์ผลลัพธ์ที่จะมีลักษณะ ปัญหายังไม่ได้รับการกำหนดให้ดีพอที่นี่: มันหมายถึงอะไร

ฉันขอแนะนำให้คุณลองสร้างตัวอย่างที่ผิดพลาดยิ่งขึ้นจากนั้นใช้ Photoshop / สีเพื่อแก้ไขปัญหาคุณอาจพบแรงบันดาลใจในการแก้ปัญหา

คุณต้องการให้พับขึ้นหรือไม่ ทับซ้อนกับขอบ? ดึงเข้าไปจนกว่าจะไม่ทับซ้อนกันใช่ไหม


จุดดีฉันจะยัดเส้นโค้งที่คมชัดยิ่งขึ้นและเป็นเส้นโค้ง "อุดมคติ" ใน Illustrator หรือ Inkscape ในวันนี้
ThatsGobbles

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