วิธีการ raytrace Bezier พื้นผิว?


18

ฉันลองคำถามนี้ในวิชาคณิตศาสตร์ SEและที่น่าประหลาดใจคำตอบคือ "สมการที่น่ารังเกียจเกินไปเพียงแค่ป้อนฟังก์ชั่นให้กับเครื่องมือค้นหารากตัวเลข" แต่ถ้าคุณพิจารณาตัวเองว่า "ผู้ชายกราฟิก" อย่างฉันและเล่นอย่างกว้างขวางกับ Bezier curves สำหรับงานออกแบบฉันต้องเชื่อว่าสามารถทำได้ดีกว่า มีอัลกอริทึมที่เผยแพร่โดย Kajiya ที่ฉันไม่มีพื้นหลังที่จะเข้าใจ (ซิลเวสเตอร์เมทริกซ์) แต่คำแนะนำที่เกี่ยวข้องกับคณิตศาสตร์คือว่าผลที่ได้คือพหุนาม -18 องศาใน t และคุณยังต้องแก้ ตัวเลข ฉันมีความคิดอื่นที่มีผลที่คล้ายกัน

ดังนั้นมันเป็นความฝันที่เต็มไปด้วยท่อหรือเปล่าที่หวังว่าจะสามารถแก้จุดตัดของเรย์ / เบซิเยร์พีชคณิตได้ดังนั้นจึงเป็นไปได้ที่จะเขียนโค้ดอย่างชัดเจนและราบรื่นที่สุด

นอกจากนี้วิธีที่เร็วที่สุดในการคำนวณนี้คืออะไร คุณสามารถ "ค้นหา wiggles" เพื่อรับขอบเขตที่แน่นหนา (และเป้าหมาย) สำหรับการจัดสรรซ้ำหรือไม่? หากคุณต้องใช้เครื่องมือค้นหารูทแบบตัวเลข (ถอนหายใจ) จำเป็นต้องใช้คุณสมบัติใดและมีตัวเลือกที่ดีที่สุดสำหรับความเร็วหรือไม่

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


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

1
โปรดทราบว่าคุณสามารถ raymarch bezier พื้นผิวได้ง่ายกว่า raytracing นอกจากนี้คุณยังสามารถ raytrace หรือ raymarch univariate พื้นผิวได้ง่ายกว่าชนิดอื่น ๆ ! blog.demofox.org/2015/07/28/rectangular-bezier-patches
Alan Wolfe

คำตอบ:


14

ก่อนอื่นนี่คือวิธี Kajiya ที่ฉันคิดว่าคุณกำลังคิด: Kajiya, Ray Tracing Parametric patches , SIGGRAPH 82. เวอร์ชันรายงานเทคโนโลยีอาจให้ข้อมูลมากกว่านี้

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

เครื่องมือติดตามรังสีแบบ "ของจริง" มีแนวโน้มที่จะรวมสองสิ่งเข้าด้วยกัน:

  • การวางลำดับชั้นของขอบเขต (เช่น AABBs) บนแพตช์เพื่อรับ "ค่าเริ่มต้น" ที่ดีสำหรับตัวค้นหารูตแบบตัวเลข หากคุณทำได้ดีคุณสามารถหลีกเลี่ยงปัญหา "ริ้วรอย" ได้
  • Tesselating แพทช์ลงในเปลือกหอย DDGและรังสีติดตามพวกเขาเช่นตาข่ายรูปหลายเหลี่ยม

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

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


9

มันเป็นความฝันที่เต็มไปด้วยท่อหรือเปล่าที่หวังว่าจะแก้จุดตัดของเรย์ / เบเซเยร์บนพีชคณิตได้

ใช่มันเป็นความฝันที่ไพเราะ แผ่นแปะ bicubic Bezier เป็นพื้นผิวพีชคณิตขององศา 18 เพื่อตัดกันรังสีกับพื้นผิวนี้คุณต้องหารากของพหุนามที่มีองศา 18 ไม่มีสูตรสำหรับรากเหล่านี้ - คุณต้องค้นหามันด้วยวิธีตัวเลข . ในความเป็นจริงมีผลลัพธ์ทางคณิตศาสตร์ ( ทฤษฎี Abel-Ruffini ) บอกเราว่าไม่สามารถมีสูตรสำหรับรากของสมการเกินกว่าระดับ 4 คณิตศาสตร์ไม่เพียงบอกว่าสูตรยังไม่ได้พบ; มันบอกว่าพวกเขาจะไม่ถูกพบเพราะพวกเขาไม่สามารถอยู่ได้

ถ้าคุณอยากจะทำวิเคราะห์ (พีชคณิต) ray ติดตามของรูปทรง curvaceous คุณอาจลองใช้แพทช์สทิ สิ่งเหล่านี้มีระดับ 4 ดังนั้นการแยกเรย์แพทช์สามารถคำนวณได้โดยการหารากของควอร์ทิค (เช่นพหุนามของระดับ 4) มีสูตรสำหรับค้นหารากของควอร์ติค แต่มันค่อนข้างน่ารังเกียจและมันยากที่จะเขียนโค้ดที่ใช้สูตรได้อย่างน่าเชื่อถือ


5

อีกทางเลือกหนึ่งซึ่งฉันใช้สองสามทศวรรษที่ผ่านมา (yikes!) คือการใช้ รูปแบบของ Toth จากปี 1985ที่ใช้เลขคณิตช่วงเวลาเพื่อ จำกัด พื้นที่การค้นหา IIRC ในที่สุดมันจะหันไปใช้ Newton-Rhapson แต่อีกครั้ง IIRC ฉันคิดว่ามันไม่ค่อยต้องการมากกว่าหนึ่งหรือสองขั้นตอนในการหาทางออกที่ดี

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

(ฉันควรจะเพิ่มว่าถ้าคุณทำพื้นผิว Bezier เท่านั้นวิธีการช่วงเวลาอาจเป็นบิต "overkill" เนื่องจากคุณสามารถใช้เทคนิคต่าง ๆ เช่นการบานเพื่อให้ได้ขอบเขตและอนุพันธ์หากคุณรวม Bezier curves เข้ากับฟังก์ชันอื่น เช่นการหมุนรอบแกนจากนั้นแกนจะมีประโยชน์มากกว่า)


1

https://www.shadertoy.com/results?query=bezier จัดเรียงตามอายุในกรณีที่ปัญหาความเข้ากันได้:

, ... แสดงวิธีแก้ปัญหามากมายของ spline-subsets ไม่ว่าจะเป็นการส่งคืนระยะทางไปยัง spline 2d หรือการติดตามแพทช์ 3d เส้นโค้งและแพทช์มาหลายรูปแบบ สวรรค์บนสวรรค์เรียบง่ายที่สุด, เรียบง่ายกว่า, อยู่เหนือความซับซ้อนมากเกินไป ยิ่งคุณเพิ่มข้อ จำกัด มากขึ้นเท่าไหร่ก็จะยิ่งง่ายขึ้นเท่านั้น NURBS เป็นส่วนขยายที่มากเกินไป - Non-Uniform-ness of weights ("NU") ลดประสิทธิภาพเมื่อเปรียบเทียบกับ splines สมมาตรมากกว่า - Ration-al-ness (the R) ยังเพิ่มความซับซ้อนบางอย่างสำหรับการแบ่งส่วน (ปันส่วน) และผสมกับส่วนที่อยู่ใกล้เคียง (แก้ไขซ้ำ)

bezier-patch-tracing เป็นการแก้ปัญหาด้วยการจัดลำดับความสำคัญตามบริบทบนความแม่นยำ เพื่อที่จะแก้สมการกำลังสอง สิ่งนี้จะไม่สามารถใช้ได้กับเลขชี้กำลังสูงกว่าลูกบาศก์เนื่องจากความซับซ้อนเชิงเลขชี้กำลังและการสูญเสียความแม่นยำ

ray-marching == sphere-tracking เป็นวิธีการแก้ปัญหาแบบฮิวริสติกที่ง่ายกว่าในการแก้ปัญหารากซึ่งดูเหมือนจะเป็นวิธีที่ง่ายและมีประสิทธิภาพที่สุดในการเรนเดอร์ splines ส่วนใหญ่

การแทนค่าลากรองจ์ช่วยลดความยุ่งยากในการติดตาม / เดินขบวน (เนื่องจากจุด L อยู่บนเส้นโค้งในขณะที่จุดควบคุมเวกเตอร์

กรณีพิเศษของสวรรค์ - เส้นโค้งซึ่งอนุพันธ์อันดับแรกของสถิติและจุดสิ้นสุดคือ == 0 ลดความซับซ้อนของความต่อเนื่องและเกี่ยวข้องกับความแตกต่างน้อยลง (การลบน้อยลง) สามารถตรวจสอบแพตช์สวรรค์ได้อย่างมีประสิทธิภาพในการส่งผ่านครั้งเดียว: https://www.shadertoy.com/view/4djfW3 ในขณะที่ลูกบาศก์ลูกบาศก์อื่น ๆ (หรือสูงกว่า) ทำให้การติดตามฮิวริสติกทรงกลม / เรย์มาร์ชมีประสิทธิภาพมากขึ้น (และ " แม่นยำเพียงพอ ") มากกว่าความกล้าที่จะวิเคราะห์รากทั้งหมดเพื่อรักษารากบวกที่เล็กที่สุด (พร้อมข้อผิดพลาดความแม่นยำสะสมแบบทวีคูณสำหรับแต่ละรูต)


ในคอมพิวเตอร์กราฟิกส์เส้นโค้งและแพทช์ได้ถูกแทนที่เกือบทั้งหมดด้วยการแปรง z ในปี 2549 การแปรง z ใช้แผนที่การเคลื่อนที่ด้วยพิกัดที่เป็นเนื้อเดียวกันหรือแม้กระทั่งการใช้ "ประเภท" ที่ทำให้เราเป็นหนึ่งในทรงกลมและลายเส้น 0, ทรงกลมมีความยาว 0, สหภาพง่ายและมีประโยชน์) สำหรับการสูญเสียความแม่นยำเล็กน้อยเพื่อประสิทธิภาพที่เพิ่มขึ้นในราคาหน่วยความจำที่ค่อนข้างต่ำสำหรับตารางการค้นหาที่ทำให้ไดนามิกได้ง่ายบน gpu


ไม่เป็นไร. โซลูชันการแก้ไข 3d ทั้งหมดทำโดยการติดตามทรงกลม
ollj

มันเพียงเพิ่มประสิทธิภาพและความแม่นยำอย่างมากเมื่อแพทช์นั้นง่ายขึ้น ไปยังจุดที่แพทช์ของสวรรค์ seamess ทำให้คุณได้ไกลมากในการทำซ้ำไม่กี่:
ollj

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