Цитата номер 1:
Оказывается все не не совсем так. Тот цилиндр персонажа, который отвечает за коллизию (столкновению, попадание) с другими объектами действительно не крутится.
А вот голова "крутится"! Если точнее, то меняются её относительные координаты (видимо, относительно центра цилиндра?).
Синия сфера - это как бы голова. Но её там нет. Все выстрелы по прежнему засчитываются только в цилиндр.
К сожалению понять, как определяется был ли хедшот, слишком эпичный код мой мозг не осилил (но что-то похожее на определение расстояния от чего-то до того-то в 3-х мерном пространстве).
А вот как выглядит "голова" с синей сферой от 1-го лица : )
Эти относительные "координаты головы" (при разных финтах, при разных персонажах) ведут себя по разному. Ну а то что хэдшот "как-то" зависит от этих относительных "координат головы" - это однозначно.
Цитата номер 2: (Код расчета Хэдшота)
C = GetBoneCoords(HeadBone); // GetBoneCoords - нативная функция, получает какие-то (arbitrary coordinate system) координаты какой-то части тела
HeadLoc = C.Origin + (HeadHeight * HeadScale * AdditionalScale * C.XAxis);
// Express snipe trace line in terms of B + tM
B = loc;
M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); // апроксимируем единичный вектор ray, до максимально возможного в цилиндре (наискосок), причем эпики похоже забыли извлечь корень (лол), вобщем, потенциально можно словить лулзов
// Find Point-Line Squared Distance
diff = HeadLoc - B; // получаем вектор связывающий точку попадания в цилиндре и центр головы
t = M Dot diff; // получаем скалярное произведение апроксимированного вектора от выстрела и вектора направленного из точки попадания в центр головы
if (t > 0) // угол между векторами должен быть <90 градусов.
{
DotMM = M dot M; // умножаем вектор M на самого себя
if (t < DotMM) // рассматриваем случай когда вектор diff короче вектора M и/или находится под углом к нему (угол < pi/2)
{
t = t / DotMM;
dist = dist - (t * M); // Здесь мы хитрожопным способом нашли ортогональное дополнение проекции вектора diff на вектор M, то есть перпендикуляр от центра сферы на вектор M
}
else
{
t = 1; // нахрена это присваивание?
dist -= M;
}
}
else
t = 0;
Distance = Sqrt(dist Dot dist); // получаем длину вектора dist
return (Distance < (HeadRadius * HeadScale * AdditionalScale)); // соответственно если длина вектора dist меньше радиуса сферы - возвращаем True - был хедшот.
Т.к. никаких проверок на то, с какой стороны пришел выстрел, проверка на хш осуществляется всегда, даже если мы попали в пятку
Если верить картинке ниже, стрельба снизу/сверху/под углом дает больше шансов на попадание в голову т.к. отношение углов общего попадания и попадания в голову в таких условиях меньше.