เอาล่ะ ฉันกำลังสร้างเครื่องติดตามรังสีโดยใช้การแรเงาแบบฟอง จนถึงตอนนี้ทุกอย่างดี ฉันใช้รังสีที่กระทบทรงกลมในฉากของฉัน ใช้การแรเงาด้วยฟอง และมันก็ดูปกติ
ตอนนี้ ฉันกำลังคำนวณรังสีเงา ซึ่งจะยิงรังสีจากจุดตัดจากรังสีปฐมภูมิไปยังแหล่งกำเนิดแสง และดูว่ารังสีดังกล่าวกระทบกับวัตถุใดๆ ที่ขวางทางหรือไม่ หากเป็นเช่นนั้นแสดงว่าอยู่ในเงามืด
อย่างไรก็ตาม เมื่อคำนวณว่ารังสีเงากระทบกับทรงกลมใดๆ หรือไม่ ดูเหมือนว่าจะมีข้อผิดพลาดกับการแบ่งแยกของฉันที่คำนวณไว้ ซึ่งเป็นเรื่องแปลกเนื่องจากจนถึงขณะนี้รังสีปฐมภูมิถูกต้องแล้ว
นี่คือการตั้งค่า:
// Origin of ray (x,y,z)
origin: -1.9865333, 1.0925934, -9.8653316
// Direction of ray (x,y,z), already normalized
ray: -0.99069530, -0.13507602, -0.016648887
// Center of sphere (x,y,z)
cCenter: 1.0, 1.0, -10.0
// Radius of the sphere (x,y,z)
cRadius: 1.0
และนี่คือโค้ดสำหรับค้นหาผู้จำแนก:
// A = d DOT d
float a = dotProd(ray, ray);
// B = 2 * (o - c) DOT d
Point temp (2.0*(origin.getX() - cCenter.getX()), 2.0*(origin.getY() - cCenter.getY()), 2.0*(origin.getZ() - cCenter.getZ()));
float b = dotProd(temp, ray);
// C = (o - c) DOT (o - c) - r^2
temp.setAll(origin.getX() - cCenter.getX(), origin.getY() - cCenter.getY(), origin.getZ() - cCenter.getZ());
float c = dotProd(temp, temp);
c -= (cRadius * cRadius);
// Find the discriminant (B^2 - 4AC)
float discrim = (b*b) - 4*a*c;
เห็นได้ชัดเจนว่ารังสีกำลังชี้ออกจากทรงกลม แต่ค่าจำแนกตรงนี้เป็นบวก (2.88) บ่งชี้ว่ารังสีกระทบทรงกลม และโค้ดนี้ใช้ได้ผลดีกับรังสีปฐมภูมิ เนื่องจากตัวจำแนกรังสีจะต้องถูกต้อง แต่ไม่ใช่สำหรับรังสีทุติยภูมิเหล่านี้
ฉันพลาดอะไรบางอย่างที่นี่หรือเปล่า?