Render.ru
Поддержать

Масштабирование анимированной модели

Почемучкин

Активный участник
Рейтинг
7
Здравствуйте, жители форума Render.ru!
Подскажите, пожалуйста, как правильно отмасштабировать анимированную модель (например, уменьшить масштаб на 35%), а потом обнулить всю историю о трансформациях с помощью утилиты ResetXForm. Я пробовал применять эту утилиту на одну из моделей и получил следующее:

После применения утилиты масштаб меша возвращается к исходному (на видео я не стал уменьшать масштаб), а его местоположение изменяется. Почему? Насколько я понимаю, утилита ResetXForm должна была обнулить всю историю о трансформациях. Что я делаю не правильно и как это делается правильно? Еще читал в интернете, что ResrtXForm рекомендуют использовать в паре с модификатором XForm. Если так, то как их правильно использовать, чтобы меш не смещался?

Заранее благодарен за помощь.

PS: Достаточно недавно начал пользоваться 3ds max 2011 и многого пока еще не знаю.

Почемучкин

Активный участник
Рейтинг
7
Андрей ШаймардановЕсли попробовать не масштабировать, а проанимировать модификатор FFD 2x2x2 ?
Честно, я не особо понимаю, как мне поможет модификатор свободной деформации. Можете объяснить более развернуто?

Почемучкин

Активный участник
Рейтинг
7
Anton ChernovМожно попробовать Rescale World Units в утилитах.
Спасибо за подсказку. Утилита весьма полезная конечно, но меня больше интересует работа с утилитой ResetXForm. Как ей правильно пользоваться (без смещения меша), чтобы обнулить информацию о трансформациях модели? Мне это нужно для того, чтобы импортировать модель в игру в виде модификации без ненужной информации о ее трансформациях (вращениях, масштабировании, перемещения и т.п.).

Тессеракт

Активный участник
Рейтинг
15
В доте не смотрел модели, но обычно в компьютерных моделях есть root кость, которая и отвечает за трансформы меша. Может у нее и нужно сбрасывать трансформы?

Почемучкин

Активный участник
Рейтинг
7
ТессерактВ доте не смотрел модели, но обычно в компьютерных моделях есть root кость, которая и отвечает за трансформы меша. Может у нее и нужно сбрасывать трансформы?
Да, кость root имеется. Через нее я и изменяю масштаб модели, но если потом использовать на меш или кость root утилиту ResetXForm, то происходит тоже самое, что и на видео.
Модель из доты 2 взята для примера. Подобная проблема проявляется и у некоторых моделей из других игр.

PS: Кстати, вот сама модель и анимация покоя. Может так будет проще помочь?

Тессеракт

Активный участник
Рейтинг
15
А для каких целей сбрасывать трансформ на кости? Ну и пусть у нее будет скейл не правильный. Это на что-то влияет разве? Если я чего-то не понимаю и очень сильно нужно, то можно воспользоваться Skin Wrap'ом. (в теории, я не проверял)

Почемучкин

Активный участник
Рейтинг
7
ТессерактА для каких целей сбрасывать трансформ на кости? Ну и пусть у нее будет скейл не правильный. Это на что-то влияет разве? Если я чего-то не понимаю и очень сильно нужно, то можно воспользоваться Skin Wrap'ом. (в теории, я не проверял)
Просто я читал в интернете, что перед импортом модели из 3ds max рекомендуется сбрасывать всю информацию о трансформациях, поскольку уменьшение масштаба модели чисто визуальные, а реальные размеры остаются неизменными. Если импортировать модель в игру, то выглядеть она будет нормального размера, но движок будет считать ее реальные размеры, которые куда больше, что может приводить к некоторым проблемам. Например, снаряды будут попадать в модель, хотя визуально они должны были пролететь мимо.
Плюс я надеялся, что мне это поможет подгружать другие анимации без изменения масштаба. Сейчас если я подгружаю анимацию (например, ходьбы) на модель с уже уменьшенным масштабом, то ее масштаб вновь возвращается к исходному. Мне вновь приходится уменьшать масштаб, но вместе с этим уменьшаются и кости эффектов (необходимые для игры), из-за чего уменьшается масштаб проигрываемых на этой модели визуальных эффектов в игре.
Рейтинг
33
Анимацию изначально надо делать в реальном размере. Сохиани анимацию в файл, сохрани скининг в файл. Потом сделай тот размер что тебе нужен у скелета и модели примени резетиксформ. Затем привяжи модельк скелету используя файл скина и назначь анимацию.
Теоретически должно работать...

Почемучкин

Активный участник
Рейтинг
7
Andrey _BelskiyАнимацию изначально надо делать в реальном размере. Сохиани анимацию в файл, сохрани скининг в файл. Потом сделай тот размер что тебе нужен у скелета и модели примени резетиксформ. Затем привяжи модельк скелету используя файл скина и назначь анимацию.
Теоретически должно работать...
Так у меня по сути так оно и есть изначально. Модель со скелетом в одном FBX файле, а каждая анимация в отдельном FBX файле. Сейчас загрузил модель со скелетом, уменьшил масштаб, применил ResetXForm и... произошло то же, что и на видео. Я так и не пойму, как правильно пользоваться этой утилитой.

GoodMan

Мастер
Рейтинг
275
Я думаю что ресетить трансформации на анимированном объекте это не очень правильно, а ещё более неправильно делать это на скалированных костях. Но утверждать не буду - не специалист 🙂

Накатал небольшой скриптик который по идее должен обходить проблему. Т.е. он изменяет маштаб заскиненных объектов до модификатора skin, но не уверен что это решит проблему.

sliderTime = 0f

sel_ = for i in $ collect i
obj_arr = #()

-- Make snapshotrs of the objects:
for i in sel_ do
(
    append obj_arr (snapshot i)  
)

-- Add "morpher" modifier before "skin" modifier and insert snapshooted mesh into it.
setCommandPanelTaskMode #modify
for i = 1 to sel_.count do
(
    select sel_[i]
    addModifier sel_[i] (morpher()) before:1
    WM3_MC_BuildFromNode sel_[i].morpher 1 obj_arr[i]
    WM3_MC_SetValue sel_[i].morpher 1 100.0
    sel_[i].skin.alwaysDeform = false
    sel_[i].skin.alwaysDeform = true
    maxOps.CollapseNodeTo sel_[i] 2 off
)

-- Delete temprorary data
for i in obj_arr do
(
    delete i
)
Для работы выделить объекты для изменения маштаба. Скрипт запустить через MaxScript->New Script: вставить в окно текст скрипта и Tools->Evaluate all
Рейтинг
33
Яж написал, сохрани скин в файл. Затем отскалируй скелет и геометрию. На геометрию ресетхформ и колапс. На костях ресет скейл через утилиту bones tools. Потом опять скинишь геометрию используя сохраненые данные. Волшебства не будет, руами придется поработать много.

Почемучкин

Активный участник
Рейтинг
7
Изменено: 2 #14
GoodManНакатал небольшой скриптик который по идее должен обходить проблему. Т.е. он изменяет маштаб заскиненных объектов до модификатора skin, но не уверен что это решит проблему.
Я что-то не пойму, что именно делает ваш скрипт? Это своего рода замена утилиты RestXForm или что? Его применять до масштабирования или уже после? Выделять нужно кости (например, root кость) или меш?

PS: А вы скрипты на заказ не пишите?

Andrey _BelskiyЯж написал, сохрани скин в файл. Затем отскалируй скелет и геометрию. На геометрию ресетхформ и колапс. На костях ресет скейл через утилиту bones tools. Потом опять скинишь геометрию используя сохраненые данные. Волшебства не будет, руами придется поработать много.
Простите, просто я не все понимаю из сказанного. Как я уже писал, я недавно начал осваивать 3ds max и многого просто не знаю. На днях почитаю о сохранении скина в файл и использовании утилиты bones tools. Спасибо вам за помощь.

GoodMan

Мастер
Рейтинг
275
ПочемучкинЯ что-то не пойму, что именно делает ваш скрипт? Это своего рода замена утилиты RestXForm или что? Его применять до масштабирования или уже после? Выделять нужно кости (например, root кость) или меш?

PS: А вы скрипты на заказ не пишите?

Простите, просто я не все понимаю из сказанного. Как я уже писал, я недавно начал осваивать 3ds max и многого просто не знаю. На днях почитаю о сохранении скина в файл и использовании утилиты bones tools. Спасибо вам за помощь.
Скрипт применять на том-же этапе (судя по видео), где собирались применять ResetXForm.
Т.е. импортировали модель, затем импортировали анимацию - потом выделили объекты (не кости) и применили скрипт.

P.S. Скрипты на заказ не пишу, скорее балуюсь по мере необходимости. 🙂
P.P.S. Думаю способ, предложенный "Andrey _Belskiy" будет более правильный с технической точки зрения 😉