BRDF และการประสานงานทรงกลมในการติดตามเรย์
ฉันพัฒนาเครื่องติดตามรังสีที่ใช้โมเดลไฟพงษ์ / บลินมาตรฐาน ตอนนี้ฉันกำลังแก้ไขเพื่อสนับสนุนการเรนเดอร์ตามร่างกายดังนั้นฉันจึงใช้โมเดล BRDF ต่างๆ ในขณะนี้ฉันมุ่งเน้นโมเดลของ Oren-Nayar และ Torrance-Sparrow แต่ละอันขึ้นอยู่กับพิกัดทรงกลมที่ใช้ในการแสดงเหตุการณ์ที่เกิดขึ้นและทิศทางแสง wo ขาออก คำถามของฉันคือวิธีใดที่เหมาะสมที่จะแปลง wi และ wo จากพิกัดคาร์ทีเซียนไปเป็นพิกัดกลม ฉันกำลังใช้สูตรมาตรฐานที่รายงานที่นี่https://en.wikipedia.org/wiki/Spherical_coordinate_system#Coordinate_system_conversionsแต่ฉันไม่แน่ใจว่าฉันทำสิ่งที่ถูกต้องเพราะเวกเตอร์ของฉันไม่ได้อยู่ที่ต้นกำเนิดของ ระบบพิกัดคาร์ทีเซียน แต่มีศูนย์กลางอยู่ที่จุดตัดของรังสีกับวัตถุ ที่นี่คุณสามารถค้นหาการใช้งานปัจจุบันของฉัน: https://github.com/chicio/Multispectral-Ray-tracing/tree/brdf/RayTracing/RayTracer/Objects/BRDF https://github.com/chicio/Multispectral-Ray-tracing/blob/brdf/RayTracing/RayTracer/Math/Vector3D.cpp ใครสามารถช่วยฉันอธิบายวิธีที่ถูกต้องในการแปลงเวกเตอร์ wi และ wo จากคาร์ทีเซียนไปเป็นพิกัดกลม UPDATE ฉันคัดลอกส่วนที่เกี่ยวข้องของรหัสที่นี่: การคำนวณพิกัดทรงกลม float Vector3D::sphericalTheta() const { float sphericalTheta = acosf(Utils::clamp(y, -1.f, 1.f)); return sphericalTheta; } float Vector3D::sphericalPhi() const { float …