そこで、光線が平らな円盤と交差するかどうかを確認するコードを書き込もうとしています。ここで確認したいと思っていました。私のディスクは常に負の z 軸の中心にあるため、その法線ベクトルは (0,0, -1) である必要があります。
私がやっている方法は、最初に光線と平面の交点を計算し、次にその交点がディスクの「スコープ」内にあるかどうかを判断することです。
私のコードでは、問題がこのメソッドにあるのか、それとも他の場所にあるのかわかりません。したがって、このコードに問題がある場合は、フィードバックをいただければ幸いです。=)
これが私のコードです:
float d = z_intercept; //This is where disk intersects z-axis. Can be + or -.
ray->d = Normalize(ray->d);
Point p(0, 0, d); //This is the center point of the disk
Point p0(0, 1, d);
Point p1(1, 0, d);
Vector n = Normalize(Cross(p0-p, p1-p));//Calculate normal
float diameter = DISK_DIAMETER; //Constant value
float t = (-d-Dot(p-ray->o, n))/Dot(ray->d, n); //Calculate the plane intersection
Point intersection = ray->o + t*ray->d;
return (Distance(p, intersection) <= diameter/2.0f); //See if within disk
//This is my code to calculate distance
float RealisticCamera::Distance(Point p, Point i)
{
return sqrt((p.x-i.x)*(p.x-i.x) + (p.y-i.y)*(p.y-i.y) + (p.z-i.z)*(p.z-i.z));
}