Главная » Графика » Вычисление пересечения сферы и линии
§ Уравнение сферы
Сегодня рассмотрю как вычислить пересечение шара и линии, заданной параметрически. Известно, что уравнение сферы задается как . Здесь r - радиус сферы. Также, уравнение линии задается как . Здесь A - начальная позиция, а вектор - это вектор направления прямой. Чтобы найти точку пересечения, надо x, y, z вставить в уравнение шара:
§ Раскрытие скобок
Теперь необходимо раскрыть скобки: Приведем общие множители, и получится: Теперь известны следующие коэффициенты: Коэффициент С можно вычислить только один раз на фрейм. Итого, получается квадратное уравнение:
§ Решение квадратного уравнения
Чтобы решить квадратное уравнение, необходимо сначала найти дискриминант: В зависимости от того, какой будет дискриминант, такое будет количество решений:
D < 0, решений нет, линия не имеет точки пересечения со сферой
D = 0, решение только одно
D > 0, решений два
Если есть либо одно решение, либо два, то находятся они так:
§ Код
P - точка камеры, org - центр сферы, r - радиус.
void render_sphere(vec3P, vec3 org, float r) {
vec3A = {P.x - org.x, P.y - org.y, P.z - org.z};
float c = A.x*A.x + A.y*A.y + A.z*A.z - r*r;
for (int y = -100; y < 100; y++)
for (int x = -160; x < 160; x++) {
vec3AB = { (float)x/160, (float)y/160, 1.0 };
float a = AB.x*AB.x + AB.y*AB.y + AB.z*AB.z;
float b = 2*(A.x*AB.x + A.y*AB.y + A.z*AB.z);
floatD = b*b - 4*a*c;
pset(160 + x, 100 - y, D > 0 ? 0xffffff : 0);
}
}