Войти
ПрограммированиеФорумГрафика

столкновение луча и плоскости

#0
15:52, 30 янв. 2014

Подскажите пожалуйста простой способ проверить столкновение луча и плоскости. Искал разные статьи через поиск, но большинство из них мне непонятно. Всякие формулы, например:

луч
x = x1 + (x2 - x1)*t = x1 + i*t 
y = y1 + (y2 - y1)*t = y1 + j*t 
z = z1 + (z2 - z1)*t = z1 + k*t

плоскость
a*x + b*y + c*z + d = 0

Что вообще за i и t, а еще какие-то j и k.. и почему плоскость = 0 ? И почему так много сторон? Можно же проще, указав длину и ширину плоскости (прямоугольника).

Мне не надо находить точку столкновения, мне достаточно знать есть ли вообще столкновение или нет, полагаю это еще проще. Подскажите пожалуйста, что и как вычислять?


#1
16:33, 30 янв. 2014

Задан луч:

x = x1 + (x2 - x1)*t = x1 + i*t

y = y1 + (y2 - y1)*t = y1 + j*t

z = z1 + (z2 - z1)*t = z1 + k*t

Задана плоскость:

a*x + b*y + c*z + d = 0

После подстановки в уравнение плоскости получаем:

t = - (a*x1 + b*y1 + c*z1 + d)/(a*i + b*j + c*k)

Подставив t в уравнение луча получим искомую точку пересечения.

Если знаменатель равен нулю, линия лежит в плоскости, только если числитель тоже равен нулю (t=0 удовлетворяет уравнению плоскости), в ином случае при знаменателе равном нулю линия параллельна плоскости.

#2
16:34, 30 янв. 2014

хм....

а есть возможность НЕ заниматься задачей ?

#3
16:39, 30 янв. 2014

THE_MASTER
Смешно. Хотя нет, не смешно :)

#4
16:39, 30 янв. 2014

Vec3 Pos(x1,y1,z1);
Vec3 Dir(i,j,k);
Vec4 Plane(A,B,C,D);

float Dot = Vec3Dot( Plane.xyz, Dir );
float t = -( Plane.w + Vec3Dot( Plane.xyz, Pos ) ) / Dot;

return (t>0);

#5
16:41, 30 янв. 2014

Потому что плоскость бесконечна.
Если нужно с прямоугольником, нужна точка пересечения, и потом со сторонами прямоугольника.

#6
16:57, 30 янв. 2014

Т.е. сделать скалярное произведение plane и dir, но там у Вас xyz, 3 единицы, а не 4.. т.е. это те самые A B C ? А plane.w - это D ?

#7
17:15, 30 янв. 2014

Vec3Dot( Plane.xyz, Dir ).
Да.

ПрограммированиеФорумГрафика

Тема в архиве.