0

そこで、光線が平らな円盤と交差するかどうかを確認するコードを書き込もうとしています。ここで確認したいと思っていました。私のディスクは常に負の 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));
}
4

2 に答える 2

1

"私の円盤は常に負の z 軸を中心にしているので、その法線ベクトルは (0,0, -1) でなければなりません。 "

この事実は計算を単純化します。

縮退したケース: ray->dz = 0 -> ray->oz = d の場合、光線はディスク面にあり、2Dd としてチェックします。そうでない場合、光線は平行で交差はありません

一般的なケース:t = (d - ray->o.z) / ray->d.z

t が正の値の場合、この t の x と y を見つけ、x^2+y^2 <= disk_radius^2 を確認します

于 2013-05-20T11:57:30.433 に答える
0

tの計算が間違っています。

レイ上のポイントは次のとおりです。

ray->o + t * ray->d

特に、光線上の点の座標zは次のとおりです。

ray->o.z() + t * ray->d.z()

これはdと等しくなければなりません。それが出てくる

t = ( d - ray->o.z() ) / ray->d.z()
于 2014-06-10T13:54:45.823 に答える