Wasabi Posted May 16 Share Posted May 16 Добрый день! Почему-то не получается сблендить анимацию. Очень долго пытался разобраться в чем дело, так и не обнаружил проблемы. Вроде все по гайдам делал, но все равно анимации не смешиваются: всегда воспроизводится только одна. Подскажите, что не так делаю? Вот мой код: #include "AnimationState.h" REGISTER_COMPONENT(AnimationState); void AnimationState::Init() { const char *Idle = Unigine::FileSystem::getGUID(IdleAnim.getRaw()).getFileSystemString(); const char *Walk = Unigine::FileSystem::getGUID(WalkAnim.getRaw()).getFileSystemString(); // const char *RWalk = Unigine::FileSystem::getGUID(R_WalkAnim.getRaw()).getFileSystemString(); // const char* Run = Unigine::FileSystem::getGUID(RunAnim.getRaw()).getFileSystemString(); MainCharacter = Unigine::checked_ptr_cast<Unigine::ObjectMeshSkinned>(node); MainCharacter->setNumLayers(2); int IdleNum = MainCharacter->addAnimation(Idle); int WalkNum = MainCharacter->addAnimation(Walk); // int R_WalkNum = MainCharacter->addAnimation(RWalk); // int RunNum = MainCharacter->addAnimation(Run); MainCharacter->setAnimation(0, IdleNum); MainCharacter->setAnimation(1, WalkNum); // MainCharacter->setAnimation(2, WalkNum); // MainCharacter->setAnimation(3, R_WalkNum); // MainCharacter->setAnimation(4, RunNum); } void AnimationState::Update() { MainCharacter->setFrame(0, Unigine::Game::getTime() * 25.0f); MainCharacter->setFrame(1, Unigine::Game::getTime() * 25.0f); // MainCharacter->setFrame(2, Unigine::Game::getTime() * 30); // MainCharacter->setFrame(3, Unigine::Game::getTime() * 30); // MainCharacter->setFrame(4, Unigine::Game::getTime() * 30); if (Unigine::Input::isKeyPressed(Unigine::Input::KEY_V)) { Weight = Unigine::Math::clamp(Weight + Unigine::Game::getIFps(), 0.0f, 1.0f); } if (Unigine::Input::isKeyPressed(Unigine::Input::KEY_C)) { Weight = Unigine::Math::clamp(Weight - Unigine::Game::getIFps(), 0.0f, 1.0f); } MainCharacter->lerpLayer(0,0,1,Weight); Unigine::Console::message("Weight is: %f \n", Weight); } Link to comment
Wasabi Posted May 16 Author Share Posted May 16 15 minutes ago, Wasabi said: Добрый день! Почему-то не получается сблендить анимацию. Очень долго пытался разобраться в чем дело, так и не обнаружил проблемы. Вроде все по гайдам делал, но все равно анимации не смешиваются: всегда воспроизводится только одна. Подскажите, что не так делаю? Вот мой код: #include "AnimationState.h" REGISTER_COMPONENT(AnimationState); void AnimationState::Init() { const char *Idle = Unigine::FileSystem::getGUID(IdleAnim.getRaw()).getFileSystemString(); const char *Walk = Unigine::FileSystem::getGUID(WalkAnim.getRaw()).getFileSystemString(); // const char *RWalk = Unigine::FileSystem::getGUID(R_WalkAnim.getRaw()).getFileSystemString(); // const char* Run = Unigine::FileSystem::getGUID(RunAnim.getRaw()).getFileSystemString(); MainCharacter = Unigine::checked_ptr_cast<Unigine::ObjectMeshSkinned>(node); MainCharacter->setNumLayers(2); int IdleNum = MainCharacter->addAnimation(Idle); int WalkNum = MainCharacter->addAnimation(Walk); // int R_WalkNum = MainCharacter->addAnimation(RWalk); // int RunNum = MainCharacter->addAnimation(Run); MainCharacter->setAnimation(0, IdleNum); MainCharacter->setAnimation(1, WalkNum); // MainCharacter->setAnimation(2, WalkNum); // MainCharacter->setAnimation(3, R_WalkNum); // MainCharacter->setAnimation(4, RunNum); } void AnimationState::Update() { MainCharacter->setFrame(0, Unigine::Game::getTime() * 25.0f); MainCharacter->setFrame(1, Unigine::Game::getTime() * 25.0f); // MainCharacter->setFrame(2, Unigine::Game::getTime() * 30); // MainCharacter->setFrame(3, Unigine::Game::getTime() * 30); // MainCharacter->setFrame(4, Unigine::Game::getTime() * 30); if (Unigine::Input::isKeyPressed(Unigine::Input::KEY_V)) { Weight = Unigine::Math::clamp(Weight + Unigine::Game::getIFps(), 0.0f, 1.0f); } if (Unigine::Input::isKeyPressed(Unigine::Input::KEY_C)) { Weight = Unigine::Math::clamp(Weight - Unigine::Game::getIFps(), 0.0f, 1.0f); } MainCharacter->lerpLayer(0,0,1,Weight); Unigine::Console::message("Weight is: %f \n", Weight); } Вот h файл: #pragma once #include <Unigine.h> class AnimationState : public Unigine::ComponentBase { public: COMPONENT_DEFINE(AnimationState, ComponentBase) COMPONENT_INIT(Init) COMPONENT_UPDATE(Update) PROP_PARAM(File, IdleAnim) PROP_PARAM(File, WalkAnim) PROP_PARAM(File, R_WalkAnim) PROP_PARAM(File, RunAnim) protected: void Init(); void Update(); private: Unigine::ObjectMeshSkinnedPtr MainCharacter; float Weight = 0; bool isWeightChanged = false; }; Вот что в редакторе (прикрепил фото): Link to comment
silent Posted May 17 Share Posted May 17 Wasabi А что значит не работает и как вы проверяли? Вроде бы всё работает как и ожидается: Desktop 2024.05.17 - 12.15.36.04.mp4 У вас не такой результат? В редакторе С++ код приложения не выполняется, поэтому нужно после компиляции исполняемого файла запускать его вручную из папки <Project>/bin. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Wasabi Posted May 17 Author Share Posted May 17 4 hours ago, silent said: Wasabi А что значит не работает и как вы проверяли? Вроде бы всё работает как и ожидается: Desktop 2024.05.17 - 12.15.36.04.mp4 24.31 MB · 0 downloads У вас не такой результат? В редакторе С++ код приложения не выполняется, поэтому нужно после компиляции исполняемого файла запускать его вручную из папки <Project>/bin. Спасибо большое, что проверили у себя и продемонстрировали результат! Но у меня почему-то не получается подобного результата. К сожалению, не так отрабатывает. Запускаю через ./launch_release.sh , предварително сбилдив. (Если точнее, то запускаю через мой скрипт, который предварительно билдит проект. Запускаю, из папки проекта /UNIGINE Projects/<MyProjectName>) cd source/build && cmake .. make cd ../.. && ./launch_release.sh Но не думаю, что дело в нем. До этого норамально отрабатывал. У меня вот такой результат: Screencast from 17.05.2024 12:56:51.webm Link to comment
Wasabi Posted May 17 Author Share Posted May 17 27 minutes ago, Wasabi said: Спасибо большое, что проверили у себя и продемонстрировали результат! Но у меня почему-то не получается подобного результата. К сожалению, не так отрабатывает. Запускаю через ./launch_release.sh , предварително сбилдив. (Если точнее, то запускаю через мой скрипт, который предварительно билдит проект. Запускаю, из папки проекта /UNIGINE Projects/<MyProjectName>) cd source/build && cmake .. make cd ../.. && ./launch_release.sh Но не думаю, что дело в нем. До этого норамально отрабатывал. У меня вот такой результат: Screencast from 17.05.2024 12:56:51.webm фпс чутка скачут, но у меня картинка стабильно бегущего человечка, не меняющаяся при нажатии на клавиши. Link to comment
silent Posted May 17 Share Posted May 17 Точно собираете релиз? Возможно надо переключить конфигурацию. Можете показать весь лог сборки и сами сборочные скрипты? How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Wasabi Posted May 17 Author Share Posted May 17 57 minutes ago, silent said: Точно собираете релиз? Возможно надо переключить конфигурацию. Можете показать весь лог сборки и сами сборочные скрипты? Вот такой лог получается при запуске скрипта. Сначала билд, затем запуск релиза. Вот сам Лог с дополнительным запуском релизной сборки и ее выключением. -- Configuring done -- Generating done -- Build files have been written to: /home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/source/build Consolidate compiler generated dependencies of target unigine_project__rrr [100%] Built target unigine_project__rrr System info initialization (Time: 101.8ms, Memory: 0B) ---- Engine ---- Version: 2.18.0.1 ver-2.18.0.0-bf5143a Feb 6 2024 Binary: Linux 64-bit GCC 6.3.0 Release Engine features: OpenGL4.5 Vulkan OpenAL VR OpenVR Microprofile DoubleCoords HalfTexCoords Development Third-Party Notices: https://developer.unigine.com/docs/2.18/third_party ---- Configs ---- Loading boot config "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/data/configs/default.boot"... Loading user config "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/data/configs/default.user"... Using config file "configs/default.config" Using boot config file "configs/default.boot" Using user config file "configs/default.user" Using controls config file "configs/default.controls" ---- Engine Microprofile ---- Microprofile initialization (Time: 0.4ms, Memory: 1.5KB) MicroProfile: Web server started on 127.0.0.1:1338 MicroProfile: Web server started on 192.168.1.112:1338 MicroProfile: Web server started on 172.17.0.1:1338 ---- System ---- OS: Linux 6.5.0-35-generic x86_64 CPU: AMD Ryzen 5 5600 6-Core Processor Frequency: 3499MHz Extensions: MMX+ SSE SSE2 SSE3 SSSE3 SSE41 SSE42 SSE4A AVX HTT Cores:12 Threads:12 System memory: 15903 MB CPUShaders threads: 12 GPU: GPU Unknown Video memory: 0 MB ---- Application ---- ---- System Proxy ---- SystemProxy initialization (Time: 56.4ms, Memory: 10.4KB) ---- VR ---- VR initialization (Time: 0.2ms, Memory: 672B) ---- Render ---- Loading "libGL.so.1"... OpenGL 4.5 initialization ------------- MESA Video memory: 0MB NVX Video memory: 8188MB ------------- Renderer: NVidia 8188MB Renderer API: OpenGL 4.5.0 OpenGL vendor: NVIDIA Corporation OpenGL renderer: NVIDIA GeForce RTX 4060 Ti/PCIe/SSE2 OpenGL version: 4.5.0 NVIDIA 535.171.04 OpenGL flags: Core Profile Found required GL_ARB_gpu_shader5 Found required GL_ARB_geometry_shader4 Found required GL_ARB_shader_bit_encoding Found required GL_ARB_tessellation_shader Found required GL_ARB_texture_storage Found required GL_ARB_shader_image_load_store Found required GL_ARB_shader_storage_buffer_object Found required GL_ARB_copy_image Found required GL_ARB_compute_shader Found required GL_ARB_buffer_storage Found required GL_ARB_clip_control Found required GL_ARB_direct_state_access Found required GL_ARB_shader_implicit_conversions Found optional GL_ARB_gpu_shader_fp64 Found optional GL_ARB_pipeline_statistics_query Found optional GL_ARB_timer_query Shading language: 4.50 NVIDIA Maximum texture size: 32768 Maximum texture units: 192 Render initialization (Time: 125.2ms, Memory: 20.6MB) ---- VR Subsystems ---- VR Subsystems initialization (Time: 0.0ms, Memory: 3.1KB) ---- Filesystem ---- App path: /home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/ Data path: /home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/data/ Save path: /home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/ Runtimes loaded: 991 (Time: 24.2ms, Memory: 3.0MB) Filesystem initialization (Time: 125.5ms, Memory: 13.6MB) ---- Sound ---- Loading "libopenal.so"... Renderer: Starship/Matisse HD Audio Controller Analog Stereo OpenAL vendor: OpenAL Community OpenAL renderer: OpenAL Soft OpenAL version: 1.1 ALSOFT 1.22.2 Found AL_EXT_LINEAR_DISTANCE Found AL_EXT_OFFSET Found ALC_EXT_EFX Found ALC_SOFT_HRTF Found EFX Filter Found EFX Reverb Found EAX Reverb Found QUAD16 format Found 51CHN16 format Found 61CHN16 format Found 71CHN16 format Device enumeration supported Maximum sources: 256 Maximum effect slots: 16 Maximum auxiliary sends: 2 Output sampling frequency: 44100hz HRTF not enabled! Sound: openal Sound initialization (Time: 32.0ms, Memory: 8.1KB) ---- Physics ---- ---- PathFind ---- Loading controls "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/data/configs/default.controls"... Loading config "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/data/configs/default.config"... GLParticles::createBuffers (Time: 25.5ms, Memory: 14.1KB) ---- Materials ---- Load Abstract Materials (Time: 2.2ms, Memory: 986.1KB) Base materials loaded: 184/184 (Time: 67.5ms, Memory: 5.4MB) Materials loaded: 240/240 (Time: 45.8ms, Memory: 4.6MB) Total materials: 424 Load Materials (Time: 113.7ms, Memory: 9.6MB) ---- Properties ---- Properties loaded: 22/22 (Time: 1.0ms, Memory: 119.0KB) Properties without parent: ".runtimes/bb/bbb72b9d0271b858ac405fd7fde27b4a6848b221.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/0d/0d37cd3d2effad786f409277eab0cd6aa89b9dc1.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/1b/1b0fc5af3316b742c70c8db92f9adbc4d1003453.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/fd/fd5ed8930ae584d635e9f63d3d61c2784b99a377.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/99/99c186143ea2ba6374a0dc66c660c88d75065088.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/2d/2d8c6ea54ec34fc0d7e0801f28e8cef24857e1a9.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/10/100716360aea981d1dc93ad8ac310057898da1ca.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/d7/d798d617fcbdfc8a6e2dc2610bad784cb198573b.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/e0/e07687971a39000a4851efe1fb24c7cc27d460bb.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/37/370da2d85e1a48578d1649ca7cb12ea1b7bb778c.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/8b/8b32b5082feb54c7b6988b7ae8aaa4911cd414bc.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ".runtimes/07/07d6012903c458744bf9a94319183dc6339cfa6d.prop" can't find parent property: "657ecdbbfc83135a26777f86012da3587b67be0c" ---- Animations ---- Total objects: 0 Total tracks: 0 Total playbacks: 0 Load Animations (Time: 1.2ms, Memory: 0B) ---- MeshStaticManager ---- Initialization meshes (Time: 18.5ms, Memory: 1.3MB) Total resources: 307 Engine initialization (Time: 1.1s, Memory: 184.2MB) ---- Plugins ---- Plugins path: "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/plugins" Loading "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/plugins/Unigine/FbxImporter/libUnigineFbxImporter_plugin_double_x64.so"... Loading "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/plugins/Unigine/GLTFImporter/libUnigineGLTFImporter_plugin_double_x64.so"... Loading "/home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/bin/plugins/Unigine/FbxExporter/libUnigineFbxExporter_plugin_double_x64.so"... EnginePlugins: "UnigineFbxImporter" plugin is initialized EnginePlugins: "UnigineGLTFImporter" plugin is initialized EnginePlugins: "UnigineFbxExporter" plugin is initialized Plugins initialization (Time: 1.9ms, Memory: 5.8KB) ---- Interpreter ---- Version: 2.90 Unigine~# config_autosave 0 && world_load "unigine_project__rrr" Interpreter::restore_state(): different number of libraries Script loading "core/unigine.usc" 6ms World loading "worlds/unigine_project__rrr.world" (Time: 22.8ms, Memory: 1.6MB) World loading "worlds/check.world" (Time: 23.9ms, Memory: 3.2MB) Close "libopenal.so.1" Fast shutdown 2.4ms Link to comment
silent Posted May 17 Share Posted May 17 Quote Build files have been written to: /home/wasabi/Documents/UNIGINE Projects/unigine_project__rrr/source/build А как запускаете приложение? Какие там пути? Если ваши скрипты запускают приложение из <Project>/bin/your_app, а собирается оно в <Project>/source/build/your_app, то ничего удивительного нет :) How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Wasabi Posted May 17 Author Share Posted May 17 2 hours ago, silent said: А как запускаете приложение? Какие там пути? Если ваши скрипты запускают приложение из <Project>/bin/your_app, а собирается оно в <Project>/source/build/your_app, то ничего удивительного нет :) Вероятно, сказывается моя неопытность в плюсах, так как я только начал их постигать + cmake, но я попытаюсь описать алгоритм сборки и запуска поподробнее (просто мне кажется, что с путями в данном случае все нормально, так как другие проперти я цеплял уже на ноды и в мире и они корректно отрабатывали). Скрипт - это громко сказано: я просто билджу и потом запускаю проект. Делаю это примерно так: 1) Нахожусь в <my_path_to_unigine_projects>/<Project> 2) Спускаюсь в /source/build и делаю: cmake .. 3) Делаю make 4) После этого поднимаю в папку проекта (<my_path_to_unigine_projects>/<Project>) в и запускаю приложение через ./launch_release.sh После этого приложение запускается и раньше там висели свойства, который отрабатывали (попробовал процедурно работать с кубами и их материалами + двигать в пространстве) и прикреплялись и к main_player и к рандомным обьектам в сцене. Когда попытался сделать что-то с анимацией, то саму анимацию у меня получалось запускать: бег, медленный бег, беш назад и тд., но когда дохожу до смешивания, то почему-то не получается их блендить. Вероятно, я опускаю какую-то элементарную ошибку, но пока не пойму какую, уже три для не пойму. Если что, файл запуска выглядит так (который я запускаю из <my_path_to_unigine_projects>/<Project>): cd source/build && cmake .. make cd ../.. && ./launch_release.sh Может ли быть дело в модели персонажа? В редактре вешал анимаци на него - все предарительно отрабатывали. Или может надо сделать анимацию в loop и сохранить в редакторе (вроде делал так)? Если сходу тяжело понять где у меня ошибка, то могли бы Вы прислать мне материалы (ссылки на уроки/документацию), чтобы я воспроизвел нужные действия и получил правильный результат? На фото показал структуру проекта. Link to comment
silent Posted May 21 Share Posted May 21 А можете запаковать весь ваш проект и залить его на любой файлообменник? Всё еще непонятно что вы собираете и как запускаете и где проблема в принципе. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Nehuhry Posted June 17 Share Posted June 17 Всем добрый вечер! У меня ситуация обратная, если запускаю debug сборку, то все ок, если запускаю release, то проигрывается только последний layer, смешивания не происходит никакого, соответственно. 2024-06-17 23-08-06.mp4 2024-06-17 23-08-27.mp4 Link to comment
arizmenda Posted June 18 Share Posted June 18 Здравствуйте, Nehuhry! Проверьте, пожалуйста, что у вас включены остальные слои для смешивания. По умолчанию есть только один включенный слой. Для остальных после добавления нужно вызвать setLayerEnabled(layer, true), а потом задавать ненулевой вес setLayerWeight(layer, w). Link to comment
Nehuhry Posted June 18 Share Posted June 18 11 hours ago, arizmenda said: Добрый вечер! А как на это должна влиять разница между сборками debug и release? Не совсем понимаю, если честно. setLayerEnabled вызывается для каждого слоя, веса задаются в Update через lerpLayer: m_weight = Unigine::Math::clamp(m_weight + Unigine::Game::getIFps(), 0.0f, 1.0f); m_actor->lerpLayer(AnimState_e::Procedural, AnimState_e::Idle, AnimState_e::Walk, m_weight); Link to comment
arizmenda Posted June 19 Share Posted June 19 Это одна из типовых проблем при работе с анимациями, было не лишним убедиться :) Да, разница между сборками debug и release не должна влиять на работу слоев. Однако, иногда в release сборке могут быть включены дополнительные оптимизации, которые могут повлиять на работу кода, поэтому мало ли. Чтобы разобраться, нам понадобится воспроизвести проблему. Не могли бы вы предоставить семпл с описанием минимальных шагов? Link to comment
Nehuhry Posted June 19 Share Posted June 19 Да, были мысли по поводу оптимизации компилятором, но с ходу в глаза не бросается, что такого могло произойти) По поводу сэмпла: Загружается набор анимаций в персонажа (ObjectMeshSkinned), с учетом того что есть нулевой слой для destination в lerpLayer. Далее в Update с изменением позиции персонажа проигрывается анимация ходьбы или простаивания на месте. AnimationsController.cpp AnimationsController.h Link to comment
arizmenda Posted June 19 Share Posted June 19 Скорее всего, проблема с хранением путей анимаций в виде строк. Мы сами должны хранить строку, т.к. указатель будет смотреть на временный объект. Попробуйте сделать такую замену: Unigine::Vector<const char *> vectAnimsPath; -> Unigine::Vector<Unigine::String> vectAnimsPath; 1 Link to comment
Nehuhry Posted June 19 Share Posted June 19 Да, каверзная ошибка получилась из серии c++ - std::map iteration - order differences between Debug and Release builds - Stack Overflow (turbopages.org) Теперь все как надо работает Спасибо Вам огромное за помощь! :) 2 Link to comment
Recommended Posts