Показать сообщение отдельно
Старый 12.02.2009, 18:19   #66
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Обсужение учебника по PhysX Wrapper для Blitz3D

ABTOMAT, спасибо что развернул мой вопрос! +n!

Насчёт стрельбы (сразу оговорюсь что не реализовывал, но считаю это наглядно реальным и оптимальным).
Есть класс пуль, у пуль есть параметр скорости полёта, это зависит от оружия, длины дула, и калибра пули. К примеру натовские пули, из M16 (достаточно длинный ствол), имеют начальную скорость пули ~900 м/с. Тоесть она пролитает почти киллометр в секунду.

Зная скорость полёта пули в секунду, мы можем узнать сколько она пролетела за один такт, для этого нам нужно узнать продолжительность такта:
TickLenghtMS = (CurMS - LastMS)
TickLenghtMS% - длительность такта в MS
CurMS% - текущее системное время в MS (функция MilliSecs()).
LastMS% - прошлое значение CurMS, до присвоения ему нового данного текущего системного времени.
Предположим что TickLenghtMS=16.667 - это примерно 60 кадров в секунду.

Значит пройденный путь пули за один такт равен:
BulletTickLenght=BulletSpeed/float(TickLenghtMS)
BulletTickLenght# - Длина пройденного пути в метрах (как и единица указания скорости).
BulletSpeed# - скорость пули, у нас она 900.
BulletTickLenght будет примерно: 53.999, тут конечно нужна максимальная точность, чтобы где-то не оплошать.
Значит столько метров пуля пролетела за такт, делаем от прошлой позиции пули в направлении вектора полёта, RayCast пик, и если точка пересечения с динамикой не дальше чем BulletTickLenght метров, тогда пуля попала в цель.
Далее задача исходя из скорости полёта пули, точки пересечения, веса пули, и направления полёта, применить импульс к динамическому объекту, чтобы он соответствующе себя вёл при поподании в него. По моим наблюдениям, во всех играх это поведение очень отличается!
Если поподание в статику, то импульс применять не нужно, но тут есть другой моммент, этот метод просчёта, даёт хорошую возможность реализовать отскоки, т.к. есть чёткие данные для этого: вектор пика, вектор пикнутой плоскости, далее немного математики, и получим вектор отскока. И будут у вас стрелы из арбалета как в HL2!

Но тут есть один моммент, если в моммент просчёта первого такта, точка коллизии была чучуть длинее чем длина пройденного пути, а на следующий такт, тот объект двигаясь, уже ближе стал, то в слудующем пике, точка будет уже позади пули. Тут нужно чётко пересмотреть просчёт, либо делать какие-то зазоры на пиках, толи ещё чего. Но естественно такой шанс совпадения Очень невелик, но он есть, и с ним можно иногда сталкиваться, особенно если стреляешь по большому колличеству в тебя летящих объектов.

Такая сложноватая система по сути себя не сильно оправдывает, и я рекомендую обойтись вообще без скорости, и делать мгновенные пики. Но если кто-то хочет по задротничеть - почему бы и нет Это хорошая фича в игре, темболее с ней можно приятно визуализировать полёт пули! Простым отрезком от прошлой до текущей точки полёта пули, такой прозрачненький шлейфик - и будет реальный полёт пули, а если ночью, так вообще как на роликах с ютуба.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (12.02.2009)