§ Уравнение сферы
Сегодня рассмотрю как вычислить пересечение шара и линии, заданной параметрически.Известно, что уравнение сферы задается как . Здесь r - радиус сферы. Также, уравнение линии задается как . Здесь A - начальная позиция, а вектор - это вектор направления прямой.
Чтобы найти точку пересечения, надо x, y, z вставить в уравнение шара:
§ Раскрытие скобок
Теперь необходимо раскрыть скобки:Приведем общие множители, и получится:
Теперь известны следующие коэффициенты:
Коэффициент С можно вычислить только один раз на фрейм.
Итого, получается квадратное уравнение:
§ Решение квадратного уравнения
Чтобы решить квадратное уравнение, необходимо сначала найти дискриминант:В зависимости от того, какой будет дискриминант, такое будет количество решений:
- D < 0, решений нет, линия не имеет точки пересечения со сферой
- D = 0, решение только одно
- D > 0, решений два
§ Код
P - точка камеры, org - центр сферы, r - радиус.1void render_sphere(vec3 P, vec3 org, float r) { 2 3 vec3 A = {P.x - org.x, P.y - org.y, P.z - org.z}; 4 float c = A.x*A.x + A.y*A.y + A.z*A.z - r*r; 5 6 for (int y = -100; y < 100; y++) 7 for (int x = -160; x < 160; x++) { 8 9 vec3 AB = { (float)x/160, (float)y/160, 1.0 }; 10 11 float a = AB.x*AB.x + AB.y*AB.y + AB.z*AB.z; 12 float b = 2*(A.x*AB.x + A.y*AB.y + A.z*AB.z); 13 float D = b*b - 4*a*c; 14 15 pset(160 + x, 100 - y, D > 0 ? 0xffffff : 0); 16 } 17}