float vNew = (float) fabs ( operator [] ( i ) );
if ( vNew > val ) {
val = vNew; axis = i;
}
}
return axis;
}
Особенно эффективно применение данного подхода, когда нужно быстро оценить расстояние до группы объектов вдоль одного и того же вектора, - тогда по этому вектору один раз вычисляется главная ось и расстояние определяется вдоль нее.
Нахождение расстояния от точки до прямой Пусть заданы точка р(х, у, z) и прямая org + t-l и требуется найти расстояние от данной точки до этой прямой. Решение этой задачи в двухмерном случае приводится в [1]. Ниже приводится общее решение, пригодное для трехмерного пространства.
Для начала спроектируем точку р на прямую, представив ее как сумму вектора вдоль прямой и вектора, ортогонального направляющему вектору прямой:
где вектор Iі перпендикулярен вектору / (рис. 3.2).
Рис. 3.2
Для определения параметра Ґ умножим скалярно это уравнение на вектор /. Тогда мы получим Отсюда легко определяется параметр г' проекции точки р на прямую: Тогда искомым расстоянием будет расстояние между точками р и р'.
Ограничивающие тела Одной из наиболее частых операций, которые будут встречаться в графической (да и не только в ней) части игры, является проверка объектов на пересечение между собой, попадание в заданную область или выполнение каких-либо других условий, связанных в положением объектов.
Поскольку эта задача встречается очень часто, то ее правильная реализация может заметно повысить быстродействие всей системы в целом. В этой главе мы рассмотрим основные алгоритмы и структуры данных для эффективного осуществления таких проверок, а также примеры их реализации.
Одной из самых простых, но очень часто встречающихся структур, являются ограничивающие тела (bounding volumes). Их использование основывается на следующем крайне простом наблюдении: если вокруг сложного объекта описать некоторое тело, полностью содержащее его в себе, то если это тело не пересекает другой объект (или не попадает в заданную область),