2016-03-11 3 views
0

Я пытаюсь написать функцию, которая возвращает истину, если луч пересекает сферу и код я ссылающийся идет что-то вроде этого:Ray-Sphere Пересечение Выведение

// given Sphere and Ray as arguments 
invert the Sphere matrix 
make new Ray object 
    origin of this object = old Ray origin * inverted Sphere matrix 
    direction = old Ray direction * inverted Sphere matrix 
a = |new direction|^2 
b = dot product of new origin and new direction 
c = |new origin|^2 - 1 

det = b*b - a*c 
if det > 0 there is an intersection 

Я застрял на понимании почему нам нужно сначала инвертировать матрицу Сферы, а затем умножить ее на начало и направление Рэя. Также я смущен, как получить квадратичные переменные уравнения a, b, c и конец. Я знаю, что мне нужно совместить параметрические уравнения для луча (p + td) и для круга (x dot x - 1 = 0), но я не могу понять, как это сделать.

+0

см [луч и эллипсоид улучшение точности пересечения] (http://stackoverflow.com/q/25470493/ 2521214), если у вас есть сфера, тогда нет необходимости в преобразованиях ... – Spektre

ответ

1

Вам необходимо инвертировать сферическую матрицу, чтобы луч находился в кадре координат сферы, который, если сфера не масштабируется, является такой же, как просто установка new_origin = origin - sphere_center (и с использованием исходного направления) уравнение формируется по формуле:

|new_dir*t + new_origin|^2 = r^2 (presumably r is 1) 

Если развернуть его, вы получите:

|new_dir|^2*t^2 + 2*(new_origin·new_dir)*t + |new_origin|^2-r^2 = 0 
+0

Знаете ли вы, почему код решает для b^2 - ac, а не b^2 - 4ac? И почему c | origin |^2 - 1? –

+0

это просто потому, что b является 2 * (bew_origin * new_dir), поэтому b^2 имеет 4 в нем, и он учитывается вместе с 4 из 4 * a * c. Я предполагаю, что код ожидает, что r будет одним, поэтому r^2 равно 1 –

 Смежные вопросы

  • Нет связанных вопросов^_^