Страница 1 из 3123»
Форум - Russian Tournament » Игры » Unreal Tournament 2004 » Расчет хэдшота by Epic Games (sml[thread]Вынос мозга)
Расчет хэдшота by Epic Games
UnShame
Копипаста, которая съест ваш мозг:
Цитата номер 1:
Quote
А возник у мну тут такой вопросег. Наверняка все лицезрели те финты которые выделывает моделька игрока в воллдодже. Дык вот и стало мне интересно, когда моделька кувыркается как просчитывается попадание? То есть модель на самом деле кувыркается (вместе с хитбоксами), или это только такая анимация? И чтобы влепить ей хш не нужно совершать финты мышкой следуя за головой, а просто достаточно стрельнуть чуть выше пятой точки?

Quote
эээ а поподробней? Раньше ты писал что моделька в додже не крутится, то есть надо шмалять в пятку чтобы попасть в голову -_-

Quote
так и есть,голова всегда сверху и "целиндр" не движется

Оказывается все не не совсем так. Тот цилиндр персонажа, который отвечает за коллизию (столкновению, попадание) с другими объектами действительно не крутится.

А вот голова "крутится"! Если точнее, то меняются её относительные координаты (видимо, относительно центра цилиндра?).


Синия сфера - это как бы голова. Но её там нет. Все выстрелы по прежнему засчитываются только в цилиндр.
К сожалению понять, как определяется был ли хедшот, слишком эпичный код мой мозг не осилил (но что-то похожее на определение расстояния от чего-то до того-то в 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 - был хедшот.

Т.к. никаких проверок на то, с какой стороны пришел выстрел, проверка на хш осуществляется всегда, даже если мы попали в пятку
Если верить картинке ниже, стрельба снизу/сверху/под углом дает больше шансов на попадание в голову т.к. отношение углов общего попадания и попадания в голову в таких условиях меньше.


http://rusut.ru/_fr/14/links.txt
https://www.mediafire.com/folder/1ww9zpl63q2pc/RT
http://rusut.ru/files/dump/filesDump.html
PsymoN
как видно из картинок, то синий шарик, именуемым зоны головы, тоже перемещается вместе с анимацией персонажа.
отсюда следует:
Quote (UnShame)
эээ а поподробней? Раньше ты писал что моделька в додже не крутится, то есть надо шмалять в пятку чтобы попасть в голову -_-
не работает)

Quote (UnShame)
И чтобы влепить ей хш не нужно совершать финты мышкой следуя за головой

нужно)) только на опереждение..
Quote (UnShame)
t = 1; // нахрена это присваивание?
dist -= M;
}
}
else
t = 0;

это защитывается попадание, если попал то t=1 и снимают больше хп)
а если t=0 знач ты косой))
UnShame
Quote
Синия сфера - это как бы голова. Но её там нет. Все выстрелы по прежнему засчитываются только в цилиндр.

так что фиг

Добавлено (31 Декабрь 10, 13:14)
---------------------------------------------
а хэдшот рассчитывается по той мозго-выносной формуле-коду

Добавлено (31 Декабрь 10, 13:14)
---------------------------------------------
и там все относительно центра цилиндра, а не относительно шарика. шарика вообще нету


http://rusut.ru/_fr/14/links.txt
https://www.mediafire.com/folder/1ww9zpl63q2pc/RT
http://rusut.ru/files/dump/filesDump.html
PsymoN
у цилиндра(коллизия) есть координаты..
когда ты пуляешь по телу, то попадаешь в область массива именуемой как body...
если по вектору ты попадаешь в область координат -90 -90 то это и есть хш..
теоритески можно стреять даже в шею)
UnShame
PsymoN
неа, в пятку не сделаешь хш..)
разброс координат)
UnShame
PsymoN
а попробоать на деле?)
UnShame
PsymoN
лол) баг хороший)
UnShame
PsymoN
да баг это) вектор криво посчитался
UnShame
Vendetta
Никакой не тролль он)
Пс. А где скрин с доказательством хедшота из под скорпа?)

My dreams, they never come true
And if they ever, ever do
It's never you
(Phantogram – Running From The Cops)
UnShame
RayLoko
Quote (PsymoN)
это защитывается попадание,
ничего подобного
Quote (UnShame)
я сквозь дно скорпа хэд сделал
Quote (PsymoN)
лол) баг хороший)
ниче не баг. из текста выше ясно - достаточно попасть в цилиндр "по направлению к голове" - готово хш) а чтоб через дно скорпа - цилиндру достаточно торчать наружу немножко (и я почти уверен что он торчит), так что все возможно)
DragonFlyPilot
Случайно сюда заглянул.

Развею пару мифов=)

Автор статьи во многом прав. Респект ему за статейку.

Quote
}
else
{
t = 1; // нахрена это присваивание?
dist -= M;
}
}
else
t = 0;

Согласен, я бы вообще эти t здесь убрал, а return с сравнением внес бы во внешний if=) Но каждый пишет как может.

Quote (UnShame)
скорп перевернуло плюшкой, а я стрельнул ему в дно - хэдшот))

пример:

Интересный факт: Если мы попали в сферу (голову) сквозь транспорт и он открытый (манта или скорпион), то засчитываются повреждения игроку и транспорту, иначе, только вихлу. Да, можно сквозь вихл выстрелить в голову водителю манты или скорпа. Способ, конечно, убийственный, но попасть почти невозможно (особенно, когда не видишь самой головы).

Quote
M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); // апроксимируем единичный вектор ray, до максимально возможного в цилиндре (наискосок), причем эпики похоже забыли извлечь корень (лол), вобщем, потенциально можно словить лулзов

Наверное, хотели написать:
Code
M = ray * 2.0 * Sqrt(CollisionHeight * CollisionHeight + CollisionRadius * CollisionRadius)

Да и вообще, все что левее вектора "ray" константа, какой смысл ее каждый считать?

Оформление листинга из сырца оставляет желать лучшего=)

Данный код работает так:

Попали в цилиндр?
Если да, по проверяем на попадание в голову (Этот кусок кода и был здесь опубликован)

Т.е. для того, что-бы сделать хед, нужно попасть в цилиндр и в сферу=)

P.S. Я говорил, что буду изредка заглядывать. А так, меня тут не было.

Прикрепления: 2611324.jpg(69Kb) · 1845159.jpg(82Kb) · 4791895.jpg(82Kb)

RT - это Rammstein=)
UnShame
PsymoN
так же я замечал что если пулять слегка выше головы, когда противник находится в скорпе, то вероятность хеда большая,
работает только взади скорпа.
UnShame
Форум - Russian Tournament » Игры » Unreal Tournament 2004 » Расчет хэдшота by Epic Games (sml[thread]Вынос мозга)
Страница 1 из 3123»
Поиск: