"Плавающая" анимация одежды и волос модели

28
2
7
Не знаю, как правильно сформулировать вопрос, но уверен, что вы все видели в различных играх такую особенность в моделях существ и предметов, как шарф, который плавно тянется за предметом, повторяя траекторию движения.

Обычно это одна простая настройка в редакторе моделей, позволяющая сделать так, чтобы кость «болталась», чаще всего это применяется к длинным волосам, одежде персонажа и всяким другим декоративным элементам, висящим на модели.

Я не уверен, возможно ли это в Майнкрафте, но в этом видео на 2:44 видно как Трицератопс делает резкий поворот, в это время его хвост не поворачивается вместе с ним, как часть модели, а выравнивается плавно, с небольшим опозданием и даже «заносом».

Я искренне сомневаюсь, что хвост - это отдельная сущность, поэтому жду мнения знающих моддеров.
 
Более конкретный пример - шея и хвост дракона края. Как это сделано?
 
Я не уверен, возможно ли это в Майнкрафте, но в этом видео на 2:44 видно как Трицератопс делает резкий поворот, в это время его хвост не поворачивается вместе с ним, как часть модели, а выравнивается плавно, с небольшим опозданием и даже «заносом».
Ничего такого не увидел. Там просто моб махает хвостом вправо и влево, и при повороте может так казаться.
Более конкретный пример - шея и хвост дракона края. Как это сделано?
Посмотри исходники. Это всё делается кодом. По крайней мере, раньше так было (не трогал анимации из Blockbench).
 
Аналогично, в Blockbench ничего никогда не делал, поэтому не подскажу.
Сам лично всё прописываю ручками через код. То есть, считай, модель в блокноте )))
В любой кодовой модели так или иначе есть метод рендера со своим таймером, и параметрами движения головы и поворотами тела.
Обычно, когда приходит команда повернут тело, никто не парится и просто поворачивает его нужные градусы.
Но никто тебе не мешает добавить в моба свой таймер и отражать повороты на хвосте или других частях тела, двигая их чуть с запозданием. Но, для этого, тебе нужно разобраться в базе. С этим я вряд ли помогу, так как времени нет. Советую просто удалить Blockbench и создать какого-нибудь моба чисто кодом. Ну, и заанимировать его так же. Тогда и большинство вопросов отпадёт само.
 
Не знаю, как правильно сформулировать вопрос, но уверен, что вы все видели в различных играх такую особенность в моделях существ и предметов, как шарф, который плавно тянется за предметом, повторяя траекторию движения.

Обычно это одна простая настройка в редакторе моделей, позволяющая сделать так, чтобы кость «болталась», чаще всего это применяется к длинным волосам, одежде персонажа и всяким другим декоративным элементам, висящим на модели.

Я не уверен, возможно ли это в Майнкрафте, но в этом видео на 2:44 видно как Трицератопс делает резкий поворот, в это время его хвост не поворачивается вместе с ним, как часть модели, а выравнивается плавно, с небольшим опозданием и даже «заносом».

Я искренне сомневаюсь, что хвост - это отдельная сущность, поэтому жду мнения знающих моддеров.
Это часть гораздо более обширной темы - процедурная анимация. Там есть несколько техник (вроде разделения модели на группы и поворот групп, а не всей модели разом), которые и позволят добиться нужного эффекта.

Но на видео просто оно так совпало, да.
 
процедурная анимация
процедурная анимация
Какая ещё процедурная анимация? Это же более связано с взаимодействие объектов с физикой в игре. Можно просто использовать всякие там таймеры, энерцию, синусы и т.д.
 
Это же более связано с взаимодействие объектов с физикой в игре. Можно просто использовать всякие там таймеры, энерцию, синусы и т.д.
Ну так человек буквально хочет физику хвосту прикрутить. Это как раз и дело процедурной анимации, нет?

А вообще понятие достаточно расплывчатое - по сути, любая анимация, воспроизводимая кодом в реальном времени. Тип, если каким-то чудом функция синуса станет работать иначе - процедурка это учтёт, а не будет по заданному шаблону фигачить.
Да даже та же интерполяция из анимации А в анимацию Б тоже, по сути, процедурная анимация.
 
Ну так человек буквально хочет физику хвосту прикрутить. Это как раз и дело процедурной анимации, нет?
Это эмитация физики. Для того чтобы угол хвоста правно изменялся с некоторой задержкой (и с учётом абсолютного угла существа), процедурная анимация не нужна.
А вообще понятие достаточно расплывчатое - по сути, любая анимация, воспроизводимая кодом в реальном времени
Не любая.
 
Это скорее всего эмитация физики. Для того чтобы угол хвоста правно изменялся с некоторой задержкой (и с учётом абсолютного угла существа)
Это всё ещё процедурная анимация. Типа, мы сейчас говорим о той же ситуации, что и с ИИ и нейронками - процедурная анимация включает в себя "эмитацию" физики.
Т.е. рэгдолл, повороты и пр. < (мод с процедурными анимациями паука) < процедурная анимация в целом.

Спросил у англо-вики:

1736363583956.png

Действительно, не любая. Однако, та, про которую мы говорим, всё же процедурная. На вики даже приводится пример - поворот головы игрока в сторону камеры.
 
Дай наводку где рыть, чтобы я нашел решение, прошу
Посмотри в концепции интерполяции кадров Ease In - Ease Out, там же bouncing анимации для того же After Effects - даст понимание.
Далее просто кодом это всё выразить, не должно быть сложно (для bouncing анимации достаточно того же lerp).

Что касается того "как и куда поворачивать" - помни, что группа хвоста сцеплена с позицией тела, но не с его вращением. А вращение всего Entity != вращение модельки (точнее, групп моделей) Entity. Тогда анимацию будет достаточно легко написать в коде.
UPD. wtf, куда пропала "сцепка" нескольких подряд идущих сообщений от одного пользователя, была же?
 
Вот зачем спорить? Очень продуктивно считать любое вычисление поворота объекта за процедурную анимацию. Давай ещё считать что "f(x, k) = x * k" - это нейронка.
 
Очень продуктивно считать любое вычисление поворота объекта за процедурную анимацию.
Процедурная анимация потому и процедурная, что она вычисляется на ходу, а не заранее задана в том же Blockbench. Нашёл даже статью на хабре (перевод), где просто повороты, по сути.
А вообще можно много что свести к "просто вычисление x". Важно не то, что это просто вычисление, а что к этому привело и почему именно так. Те же нейронки могут привести к f(x, k), но каким образом это достигается? Сможем ли мы тогда назвать нейронку просто линейной функцией?
 
@MaximPixel, ты переусложняешь. @_SupCM_ правильно говорит. Любая незапечёная анимация, вычисляющаяся на лету - процедурная.
Те же движения конечностей по синусу нигде не записаны заранее, они производные от времени и скорости перемещения.
Поверх этого уже можно накрутить и физику и чего ещё душа пожелает, но в майне ограничились простейшим.
 
Имеются ввиду вычисления положения модели в пространстве. Не обобщай. Если оно где-то изначально записано, например в файле, то это уже не процедерка. По крайней мере, тот её фрагмент, который записан.
 
Если оно где-то изначально записано, например в файле, то это уже не процедерка
Чтение - одна процедура, установка - вторая процедура. Почему нет?

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

Смотри:
1) Рассчитываем текущий вектор направления каждой группы моделей.
2) Находим разницу при помощи той же разности между векторами.
3) Применяем силу, равную по направлениями разностей векторов, к группам.
4) Повторяем шаг 3 до тех пор, пока некий threshold не будет достигнут.

В результате получим примерно такую картину:
tail.png

По сути, мы "эмитируем" физику движения хвоста. Однако вычислять это всё в реальном времени (т.е. каждый кадр) может быть затруднительно, банально если таких товарищей будет 20-30 штук, - делаем более оптимальные алгоритмы (да здраствует lerp и упомянутые мной ранее интерполяции), и о чудо, анимация та же, но при этом это почему-то вдруг становится не-процедурной анимацией.
UPD. Почему это нужно оптимизировать: векторные вычисления сильно проще тригонометрических, проще векторных только линейные вычисления. Потому, если есть возможность избежать синусов и косинусов, лучше их избегать. Если мы можем упростить векторы, почему бы их не упростить? Но это в анимации и тиковых вычислениях. Если что-то вычисляется один раз (усл. генерация мира) - можно и забить.
 
Последнее редактирование:
Сделал хвост примерно так:
TestLayer:
public class TestLayer<T extends LivingEntity, M extends EntityModel<T>> extends RenderLayer<T, M> {
    public TestLayer(RenderLayerParent<T, M> renderer) {
        super(renderer);
    }

    private float tailRotation = 0F;
    private float tailRotationSpeed = 0F;

    @Override
    public void render(
            PoseStack poseStack,
            MultiBufferSource multiBufferSource,
            int light,
            T entity,
            float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch
    ) {
        if (Float.isNaN(tailRotation)) {
            tailRotation = 0F;
        }
        if (Float.isNaN(tailRotationSpeed)) {
            tailRotationSpeed = 0F;
        }

        float yBodyRot = Mth.rotLerp(partialTicks, entity.yBodyRotO, entity.yBodyRot);
        float diff = yBodyRot - tailRotation;

        tailRotationSpeed += diff * 0.02F; // 0.02 - ускорение
        tailRotationSpeed *= 0.9F; // 0.9 - "трение"

        tailRotation += tailRotationSpeed;

        poseStack.pushPose();
        poseStack.mulPose(Axis.YP.rotationDegrees(180F - yBodyRot + tailRotation + 90F + 45F));
        DebugRenderer.renderFilledBox(poseStack, multiBufferSource, 0D, 0D, 0D, 1D, 1D, 1D, 1F, 1F, 1F, 1F);
        poseStack.popPose();
    }
}
Вот демонстрация
 
Назад
Сверху