2013-05-20 1 views
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)); 
} 
+0

Вы протестировали его? Это работает? Какой у Вас вопрос? – Beta

+0

Мой вопрос в том, что это правильный путь для вычисления пересечения. Я получаю некоторые цифры, которые отключены, и я не уверен, находится ли ошибка в этой части моего кода или если она, возможно, находится в другом месте. Поэтому, если я могу получить обратную связь, что это правильно или неправильно, то это поможет мне отлаживать. – user1782677

+0

Вы получаете некоторые цифры, которые выключены; Вы должны были сказать это в первую очередь. Было бы очень полезно, если бы вы теперь предоставили нам достаточную информацию для воспроизведения ошибки (т.е. минимального полного примера) или, по крайней мере, деталей случая, в котором результаты неактивны (т. Е. Числа, которые вы вводите, числа, которые вы получаете , номера, которые вы получаете по пути, и кто из них кажется и почему). – Beta

ответ

1

"Мой диск всегда сосредоточены на отрицательной оси г поэтому его нормальный вектор должен быть (0,0, -1)"

Этот факт упрощает вычисления.

Выродившиеся случай: ray-> дг = 0 -> если ray-> унций = д, то луч лежит в плоскости диска, проверьте, как 2DD, то луч параллелен, и нет никакого пересечения

Общий случай: t = (d - ray->o.z)/ray->d.z

Если т имеет положительное значение, найти х и у для этого т и проверить х^2 + у^2 = < disk_radius^2

0

Расчет т неправильно.

Точки на луче являются:

ray->o + t * ray->d 

, в частности, координировать г точки на луче является:

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

Какой должна быть равна г. Это выходит

t = (d - ray->o.z())/ray->d.z()