Многие писали что это не возможно, но оказались не правы. K.A.I.N. написал от нашего имени для всех, кто захочет то же поучаствовать в этом интересном деле.
Итак, поразмыслив я решил немного оформить тему и написать больше информации о движении объектов с коллизией.
;===============================================================================
Итак, вопрос в том как двигать объект с коллизией? Ответ простой, нужен скрипт и коллизия с возможностью взаимодействия с игровой физикой (возможностью движения).
История:
Привет всем!
E pur si muove «И всё-таки она вертится!»
1633 год - Галилео ГалилейКОМПАНИЯ GRAF and KAIN48 ПРЕДСТАВЛЯЕТ ДВИЖЕНИЕ ОБЪЕКТА С КОЛЛИЗИЕЙ!
Ты помнишь, как всё начиналось, Всё было впервые и вновь… (Машина Времени)
Мне понадобился скрипт движения объекта с одного места до другого, и я обратился к GRAF за помощью.
Он помимо самого скрипта сделал для меня готовую сцену, взяв для объекта движения мотоцикл, который я потом мог заменить - на свой объект. И в описании добавил:
- Тебя ждёт большой сюрприз!
Я скачал esp, подключил и запустил игру. Включил выключатель, мотоцикл двинулся в заданном скриптом направлении, к точке остановки – отмеченной маркером. Я хоть и мало понимаю в скриптах, но видел, что в нём нет отключения "поддёргивания" и включения коллизии (enable, disable).
И уже было хотел возвращаться на сайт к Graf , что бы написать, что это не то что нужно.
Но решил походить в игре.
Поэтому направился на то место, где стоял мотоцикл до начала движения и удивился, не обнаружив там не видимого препятствия в виде оставшейся на месте коллизии.
Загрузил сохранение, запустил движение и отправился к мотоциклу, решив пройти через него насквозь. Но не тут то было! Мотоцикл двигался с коллизией.
Я «кинулся» к нему на сайт в тему, где мы обсуждали этот скрипт и написал: Ты заметил! Коллизия движется вместе с объектом!
- Ага!
Ответил GRAF .
- Выше почитай! Ты пропустил мои замечания, я его из-за этого и взял, что он имеет синию коллизию.
Я почитал.
Оказалось, что Graf заметил разницу в цвете коллизий: красный, синий , зелёный, белый и тп. Почти все цвета радуги.
Возник вопрос: - «А зачем ?»
В ходе небольшого обсуждения, которого мы определили разницу во взаимодействии персонажа со объектами из категорий статика, оружие, посуда и тп. То есть с такими, на которые персонаж мог воздействовать сдвигая их с места.
Это вы все прекрасно знаете и это ни для кого не новость.Получалось так, что объект не имея «мировой модели» GO, как в случае с бронёй двигался с коллизией, не имея на себе скриптов «поддёргивания», или включения отключения коллизии.
- Пороем!
Спросил я.
- Пороем!
Ответил GrafПОЛТОРА ЗЕМЛЕКОПА ИЛИ «КАЗНИТЬ НЕЛЬЗЯ – ПОМИЛОВАТЬ»
Делая параллельно - занесли в игру два своих новых объекта, он через Blender, а я через MAX с нужными настройками niftools
Дальше я пошёл по простому пути – просто заменил (Copy –Paste) нужное в модели мотоцикла (motorcycle01.nif.)
и получил плиту, которая движется с коллизией. В игре на неё можно было запрыгнуть и двигаться вместе с ней.
1. Но только нужно было постоянно двигаться со скорость движения плиты.
В случае остановки, персонаж падал, когда плита уезжала из под ног.
2. Плита двигалась, реагируя на встречные препятствия – ящики, столбы и тп. То есть двигаясь по прямой, опускала или поднимала нос, начинала вращение вокруг своей оси и тп.
Получалось, что коллизия, сталкиваясь с коллизией не останавливалась, а проходила через другую коллизию, но всё таки не совсем без сопротивления и взаимодействия.
Тут то же интересно - при изменении настроек плита могла двигаться строго по прямой, не меняя направления после столкновений.
3. И обнаружилось, что если стрелять по плите, после взрыва она становилась горевшим мотоциклом.Понятно, что превращение плиты в мотоцикл после выстрела и взрыва и движение коллизии, было задано, какими то настройками модели.
Нужно было понять какими!
Решили разделиться – Graf продолжает «Рыть» в nifskope, сравнивая и меняя значения, а я пытаюсь найти нужное в интернете, переводить .
Вот тут и выяснилось, что землекоп из меня плохой! Так скажем половина землекопа.
Найти ничего не удалось, кроме того, что у всех на виду в виде интерактивной помощи
NIF File Format Documentation
Расшифровку или описание всех имеющихся флагов найти не удалось.
Перевод , на наш взгляд, нужного из:
Collision Response
Motion System
Deactivator Type
SolverDeactivation
Quality Type
Почти ничего не дал! Всё таки тексты в описании в основном состоят из спец названий и терминов.
Как в прочем, почти ничего не дало изменение типов в этих пунктах. Разница в поведении объекта при движении почти не заметна. Да и нудное это дело, менять значение и смотреть за поведением объекта в игре!
*Так что тут, скорее всего придётся разбираться длительное время.
Но удалось проверить основные типы коллизии, а именно то как персонаж взаимодействует с ними.
Выяснилось следующее:При типе коллизии OL_STATIC (красная)коллизия остаётся на месте, персонаж не взаимодействует с объектом, проходя или проваливаясь в него.
При типе коллизии OL_PROPS (синяя) коллизия движется с объектом, но персонаж медленно проваливается сквозь неё, если не будет двигаться, или подпрыгивать.
При типе коллизии OL_CLUTTER (синяя) коллизия движется вместе с объектом, персонаж движется вместе с коллизией, стоя на месте, или двигаясь в пределах объекта (при движении по Z)
Или передвигаясь по объекту (при движении по Y,X)- стоять нельзя, объект уезжает из под ног.
При типе коллизии OL_TRANSPARENT (белая) коллизия движется вместе с объектом, персонаж движется вместе с коллизией вверх, но должен двигаться при движении по горизонтали. При этом если прыгать на плите, она начинает поворачиваться меняя своё положение, в зависимости от того в каком месте персонаж воздействует на плиту. (так скажем небольшой отклик)
OL_TREES (красная) – тут интересно! Персонаж толкает объект вместе с коллизией– сдвигая с места, не проваливаясь в него. (так скажем большой отклик)
Это основные типы взаимодействия. А это картинки!
Хотели сделать ролик, да потом решили – зачем, кто захочет проверить поставит esp и сам всё увидит.Теперь про стрельбу и замена объекта после взрыва.
Как я написал выше в случае с плитой, которая была «сделана» заменой nif мотоцикла, она взрывалась и становилась горевшим мотоциклом (меняла модель)
А вторая плита (лифт) сделанная из телефона на выстрелы, никак не реагировала.
Получается что одна модель плиты Platform.nif из папки Data нашего мода, заменяя nif мотоцикла и телефона – в игре ведёт себя по разному.
Почему!?
Первоначальная версия, что на это влияют флаги из нодов модели отпала.
Наверное, мы что то важное пропустили, или не заметили. Поэтому тоже надо думать и экспериментировать.===========
Ответ оказался прост. Мы просто изменили оригинальный мотоцикл, и его настройки взрыва сохранились вместе с новым объектом (в id).
Подсказку дал Spalny_Vagon
Мувебле-статика. Add destruction data, какжется так эта вкладка называется. Там задаются: прочность объекта; стадии разрушения; скорость разрушения; будут ли взрывы, а если будут, то сколько и какие; какие детали будут разлетаться и на что в конечном итоге будет заменена первоначальная модель. Т.е. там можно указать, что радиоприемник после разрушения будет заменен, например, на пылесос. Очевидно, что плита в свое время была сделана из взрывающегося мотоцикла. Разрушать можно как с помощью оружия, так и скриптом (команда DamageObject). Посмотрите, как устроены взрывающиеся машины, короче говоря.Я МОГУ ЛИШЬ УКАЗАТЬ ДВЕРЬ. ТЫ САМ ДОЛЖЕН ВЫЙТИ НА...(Матрица)
Как использовать!
Хоть как.
Строите новые уровни с движущими объектами, по которым игрок должен передвигать к цели.
Стройте лифты и подъёмники, «летающие» станции и дирижабли, спускаемые капсулы и тп.
(Пример – поднимающаяся вверх кабина с иллюминаторами, в которые игрок видит удаляющуюся землю, свободно перемещаясь внутри.)
Даже если учитывать минус, что при горизонтальном движении объекта игрок вынужден «подрабатывать» ногами, что бы не упасть с объекта. Всё равно можно делать интересные моменты.
Не говоря уж про движение вверх или вниз, когда всё работает полностью. Игрок может стоять, двигаться, стрелять и тп.
Неписи то же могут стоять и стрелять, могут передвигаться в пределах объекта и падать вниз.
Понятно, что пакеты AI скорее всего будут работать не все. Sand Box скорее всего точно не будет – сетки navmesh нет. Хотя кто его знает как игра отслеживает расстояние до сетки и есть ли ограничения по высоте – возможно, что непись двигаясь на высоте 10 метров от земли, будет точно так же двигаться по объекту, как если бы был на поверхности. (Надо пробовать).
В общем пробуйте - вот esp http://narod.ru/disk/46125629001.bf8219 … n.zip.html
В нём две плиты и скрипт движения (движение безконечное) по X в одном случае и по Z в другомПишите если натолкнётесь, на что-нибудь интересное.
Пока.
Итак вот тестовый скрипт:
Float YAchsePosition ;делаем для установки траэктории
Float YAchse ;делаем для установки скорости по траэкторииBegin GameMode
Set YAchsePosition to GetPos Y ;устанавливаем траэкторию по Y
Set YAchse to YachsePosition -2 ;устанавливаем движение по трактории минус Y, со скорость две координаты в секунду
SetPos Y YAchse ;устанавливаем движение Y с установленой скоростью (-2)
End
Скрипт можно вешать на активатор, триггер, и т.д.
И теперь главное о коллизии. Какая же коллизия движется а какая нет?
Вот такие настройки обычно делаю я, при движущемся объекте:
Ниже написано как создать коллизию, но если она есть у объекта, её не нужно заново делать и старую удалять. Просто поменяйте настройки.
У вас может возникнуть вопрос "А как создать коллизию?", у нас есть ответ "Как создать коллизию в nifskop."
Преобразование объекта в коллизию с помощью nifskop.
Так как мне написали, что моё видео пособие не как не туториал, я решил немного исправить это. Итак:
Collision – это “столкновение” способность объектов ударятся друг о друга.
Расшифровки слов, которые я буду использовать в этом гайде:
ПКМ – правая клавиша мыши
ЛКМ – левая клавиша мыши
Корпус – это-то из чего состоит коллизия.
Преобразование в коллизию:
Что бы из вашего блока NiTriStrips сделать коллизию, нужно для начала открыть две модели, свою и на примере возьмём telephone01, теперь копируем NiTriStrips своей модели, ПКМ на NiTriStrips -> Block -> Copy Branch:
Откроем вторую модель телефона и удалим модель:
Нажимаем на блок модели телефона NiTriStrips и нажимаем ПКМ -> Block -> Remove Branch (Ctrl+Del).
Теперь вставим в модель телефона свою модель:
ПКМ на BSFadeNode -> Block -> Paste Branch.
Теперь копируем NiTriStripsData своей модели, ПКМ на NiTriStripsData -> Block -> Copy:
Далее удалим старую коллизию:
ПКМ на bhkConvexVerticesShape –> Block -> Remove. После этого вы заметите, что появились белые линии по краям модели. Обратите внимание на белый контур, вокруг вашей модели это означает, что мы успешно удалили старую коллизию.
Чтобы создать новый блок данных коллизии выполните следующие действия:
ПКМ на BSFadeNode -> Block -> Insert:
Далее появится такое окно:
Выберите Havok -> bhkNiTriStripsShape чтобы создать новый блок коллизии.
Далее появится bhkNiTriStripsShape который мы будем использовать для столкновения мешей. Далее нужно сделать выбор материала коллизии, это важно, так как коллизия модели реагирует на повреждения от оружия и другие события, которые изменяют поверхность (например, пулевые отверстия выглядят по-разному в камне металле или стекле):
Далее в Num Strips Data поставим 1, и ниже в Strips Data жмём ПКМ -> Array -> Update:
После этого нажимаем на “+”, во вкладке Strips Data жмём в выпадающем блоке ПКМ -> Block -> Paste:
Теперь нам нужно вставить в данные, которые мы скопировали в нашей модели:
ПКМ на bhkNiTriStripsShape –> Havok -> Pack Strips. Это позволит реорганизовать новый объект Havok, и переименовать его.
И последние шаги, ПКМ на bhkPackedNiTriStripsShape -> Block -> Copy Branch (Ctrl+C):
Открываем bhkCollisionObject и ЛКМ на bhkRigidBody. Теперь ПКМ на Shape (В Block Details смотрите скрин) -> Block -> Paste Branch (Ctrl+V).
Далее удаляем не нужный блок bhkPackedNiTriStripsShare:
ПКМ на bhkPackedNiTriStripsShare -> Block -> Remove Branch (Ctrl+Del).
Теперь сохраним модель File -> Save As… Пишем имя, и указываем путь сохранения файла.
Все коллизия для модели готова теперь можете смотреть модель в игре.
Дополнение:
KAIN и Wulf сказали мне:
Для тех у кого нет 3D редактора, как выход из положения - такой способ создания коллизии вполне подойдёт. Но чайник это чайник - на нём полигонов немного, а если модель сложная, то прирост объёма к весу модели при таком способе - от коллизии 25-30 процентов, плюс, как правильно сказал Wulf "Не надо без нужды издеваться над Gamebryo иму итак плохо! Он может и упасть"
Для этого, можно делать “облегчённую” коллизию объекту. Жмём на блоке модели NiTriStrips:
ПКМ на NiTriStrips -> Havok -> Create Convex Shape и в выпадающем окне (Перевод: введите максимальные округления, использованные по величине, значения будут даваться менее точные, но более лучшей):
Далее появится выпадающее окно, в котором написано “создал корпус с * вершин, * нормалей”:
Теперь у нашей модели есть коллизия:
Надеюсь, суть передать смог. Спасибо Miaximus с форума Bethesda, за его способ преобразования модели в коллизию. Я лишь перевёл и дополнил то, что посчитал нужным.
Дополнение (о движении объекта с коллизией):
Если вы делали коллизию по этому способу (гайду), и собираетесь двигать объект с коллизией в роли лифта вместе с объектами или гг, тогда вам нужно поставить такие настройки коллизии:
С такими настройками, коллизия двигает даже гг (тестил такие настройки коллизии в роли лифта), все работает нормально. Но увы гг может провалиться через коллизию.
И расскажем о типах коллизий:
При типе коллизии OL_STATIC (красная)коллизия остаётся на месте, персонаж не взаимодействует с объектом, проходя или проваливаясь в него.
При типе коллизии OL_PROPS (синяя) коллизия движется с объектом, но персонаж медленно проваливается сквозь неё, если не будет двигаться, или подпрыгивать.
При типе коллизии OL_CLUTTER (синяя) коллизия движется вместе с объектом, персонаж движется вместе с коллизией, стоя на месте, или двигаясь в пределах объекта (при движении по Z), но тоже проваливается.
Или передвигаясь по объекту (при движении по Y,X)- стоять нельзя, объект уезжает из под ног.
При типе коллизии OL_TRANSPARENT (белая) коллизия движется вместе с объектом, персонаж движется вместе с коллизией вверх, но должен двигаться при движении по горизонтали. При этом если прыгать на плите, она начинает поворачиваться меняя своё положение, в зависимости от того в каком месте персонаж воздействует на плиту. (так скажем небольшой отклик).
OL_TREES (красная) – тут интересно! Персонаж толкает объект вместе с коллизией– сдвигая с места, не проваливаясь в него. (так скажем большой отклик).
Это основные типы взаимодействия. А это картинки!
Как использовать!
Хоть как.
Строите новые уровни с движущими объектами, по которым игрок должен передвигать к цели.
Стройте лифты и подъёмники, «летающие» станции и дирижабли, спускаемые капсулы и тп.
(Пример – поднимающаяся вверх кабина с иллюминаторами, в которые игрок видит удаляющуюся землю, свободно перемещаясь внутри.)
Не говоря уж про движение вверх или вниз, когда всё работает полностью. Игрок может стоять, двигаться, стрелять и тп.
Неписи то же могут стоять и стрелять, могут передвигаться в пределах объекта и падать вниз.
Понятно, что пакеты AI скорее всего будут работать не все. Sand Box скорее всего точно не будет – сетки navmesh нет.
В общем пробуйте - вот esp http://narod.ru/disk/46125629001.bf8219 … n.zip.html
В нём две плиты и скрипт движения (движение безконечное) по X в одном случае, и по Z в другом.
Так же мы сделали тест плагин с рабочим лифтом. Лифт возле Гоморры, кому интересно вот ссылка. Переместиться к Гоморре можно набрав в консоли coc TheStripWorldNew.
Ранее спрашивали о движении по диагонали, да возможно. Нужно двигать объект по двум координатам, например Z и Y. Вот скрипт:
Short State
Float YPos
Float YAchseFloat ZPos
Float ZAchseBegin OnActivate
if State == 0
; disableplayercontrols 1 1 0 1 0 1 ; если требуется
Set State to 1
endif
EndBegin GameMode
if (State == 1)
Set ZPos to objectRef.GetPos Z
Set ZAchse to ZPos +2
objectRef.SetPos Z ZAchse
endifif (State == 1)
Set YPos to objectRef.GetPos Y
Set YAchse to YPos +2
objectRef.SetPos Y YAchse
endifif (State == 1) && (Marker01Ref.getdistance, objectRef <= 10)
Set State to 2
endif
End
Объяснение к скрипту:
Если гг активировал объект, objectRef начинает движение по диагонали, если нашему объекту "ObjectRef" осталось до маркера "Marker01Ref" меньше или равно 10 единиц дистанции, тогда движение "ObjectRef" прекращается.
Надеюсь мы вам помогли делать ваши моды ещё лучше, эффектней и оригинальнее.
С вами были KAIN48 и GRAF.
Удачи, и пока!
Отредактировано Graf (2012-08-24 21:09:47)