Контроллеры стандартной sentry.mdl

Сообщения
499
Реакции
271
Помог
6 раз(а)
У sentry.mdl есть 2 контроллера. Первый отвечает за вращение верхней части турели вокруг своей оси, второй за подъём и опускание самого пулемёта. Смотрел оригинальную логику half-life, смотрел различные реализации в плагинах, но так и не понял принцип их работы. Пробовал подставлять туда angles, полученные из вектора направления выстрела (не знаю, правильно делал или нет), направление вращающихся элементов модели было неверным. Пробовал копировать логику из другого плагина, вращающиеся элементы дёргались в разные стороны.

Собственно, хочу понять принцип работы контроллеров и способы получения для них нужных чисел.
 

Вложения

Сообщения
270
Реакции
282
Помог
2 раз(а)
принцип работы контроллеров
Контроллеры в amxx ограничены 1 байтом (8 битами), то есть... от 0 до 255. Стоит понимать, что плавного поворота с ними не сделать. Вращение будет дерганным. Учитывая, что градусная шкала - 360 (-180 / +180). Поэтому, чьтобы разобраться, как работать с поворотами, стоит узнать, какое значение установлено для оси вращение через контроллеры, а после конвертировать его в 8 битовую. Если шкала от 0 до 360, то мы должны сделать из него 0 255, где 360(180) = 255, а 0(-180) = 0. По вертикали можно находить позицию игрока и дула пушкии, а тем самым искать разницу угла. Можно находить позицию кости дула и работать с ним. Решений множество...

Параметры контроллера следующие:
Код:
$controller
    Индекс=0 // 0-4, движок поддерживает до 5 контроллеров на модель. могу ошибиться на +1
    Название="Имя кости" //
    Ось=X // X, Y, Z или R для вращения
    Диапазон значений (от/до) = 0 100 //

// Примеры
$controller 0 "Bone1" X 0 100
$controller 1 "BoneRotate" R -180 180
Поиграй:
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
Не грузит сайт
22 Май 2024
Ось=X // X, Y, Z или R для вращения
Код:
// 2 bone controller(s)
$controller 0 "Dummy02" YR 0.000000 360.000000
$controller 1 "Dummy04" YR -60.000000 60.000000
Оба YR в модели, это как понять? А вот диапазон значений уже даёт понимание некоторое, почему ничего не получалось
 
Последнее редактирование:
Сообщения
270
Реакции
282
Помог
2 раз(а)
Не грузит сайт
Используй VPN
22 Май 2024
Оба YR в модели, это как понять? А вот диапазон значений уже даёт понимание некоторое, почему ничего не получалось
Вращение по оси. Еще важный момент, надо контроллировать положение и вращение костей п остандарту. Кривые моделлеры на авось их ставят, а потом происходит недопонимание, почему та или иная кость работает криво. Обнулять надо вращение костей перед компилом, если нужны правильные вращения строго по осям.
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
конвертировать его в 8 битовую
Для этого, насколько я понимаю, нужно умножить на 255.0 и разделить на 360.0

По вертикали можно находить позицию игрока и дула пушкии, а тем самым искать разницу угла.
А вот тут я не знаю нужного стока или натива.

Можно находить позицию кости дула и работать с ним.
Тоже не понял. Дуло же ещё не направлено никуда, как его можно использовать?
 
Последнее редактирование:
Сообщения
270
Реакции
282
Помог
2 раз(а)
А вот тут я не знаю нужного стока или натива.
Напиши свой:
1. Найди тангенс угла, отношения высоту на расстояние (высота/расстояние)
2. Определи арктангенс угла на основе результата тангенса.
3. Конвертируй в нужный формат

По итогу
height - высота
dist - расстояние

arctan(height/dist) и переведи в нужную меру

22 Май 2024
1716359098676.png
22 Май 2024
Ddd.png
 

Download all Attachments

Сообщения
499
Реакции
271
Помог
6 раз(а)
Сейчас поковырялся, продебажил и понял, что там даже не нужно конвертаций. Главной проблемой, которая заводила меня в тупик было то, что основу турели я устанавливаю под углом, задаваемым направлением взгляда игрока. Угол контроллера вращателя из-за этого не совпадал с углом выстрела, так что это тоже пришлось учесть. Вот код, который у меня получился, с пояснениями:
Код:
// Получение вектора направления выстрела от координат дула до координат цели
new Float:fDirection[XYZ]
fDirection[X] = fTargetOrigin[X] - fSentryOrigin[X]
fDirection[Y] = fTargetOrigin[Y] - fSentryOrigin[Y]
fDirection[Z] = fTargetOrigin[Z] - fSentryOrigin[Z]

// Преобразование вектора в углы
new Float:fShootAngles[3]
vector_to_angle(fDirection, fShootAngles)

// Получение углов самой турели
new Float:fTurretAngles[3]
get_entvar(pSentry, var_angles, fTurretAngles)

// Вычисление и установка нужного угла для вращателя
new Float:fRotatorAngle = fShootAngles[1] - fTurretAngles[1]

if(fRotatorAngle < 0.0) {
    fRotatorAngle += 360.0
}

set_controller(pSentry, 0, fRotatorAngle)

// Вычисление и установка нужного угла для дула
set_controller(pSentry, 1, -fShootAngles[0] + 360.0)
Огромное спасибо fl0wer и Arni за полезную информацию
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу