Jump to content

Не получается сблендить анимацию


photo

Recommended Posts

Добрый день!
Почему-то не получается сблендить анимацию.
Очень долго пытался разобраться в чем дело, так и не обнаружил проблемы. Вроде все по гайдам делал, но все равно анимации не смешиваются: всегда воспроизводится только одна.
Подскажите, что не так делаю?

Вот мой код:

#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
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;

};

Вот что в редакторе (прикрепил фото):
 

Screenshot from 2024-05-16 23-53-41.png

Link to comment

Wasabi

А что значит не работает и как вы проверяли? Вроде бы всё работает как и ожидается: У вас не такой результат?

В редакторе С++ код приложения не выполняется, поэтому нужно после компиляции исполняемого файла запускать его вручную из папки <Project>/bin.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
4 hours ago, silent said:

Wasabi

А что значит не работает и как вы проверяли? Вроде бы всё работает как и ожидается:

У вас не такой результат?

В редакторе С++ код приложения не выполняется, поэтому нужно после компиляции исполняемого файла запускать его вручную из папки <Project>/bin.

Спасибо большое, что проверили у себя и продемонстрировали результат! Но у меня почему-то не получается подобного результата.

 

К сожалению, не так отрабатывает.
Запускаю через

./launch_release.sh

, предварително сбилдив.

 

(Если точнее, то запускаю через мой скрипт, который предварительно билдит проект. Запускаю, из папки проекта /UNIGINE Projects/<MyProjectName>)

cd source/build && cmake ..
make 
cd ../.. && ./launch_release.sh

Но не думаю, что дело в нем. До этого норамально отрабатывал.

 

У меня вот такой результат:

Link to comment
27 minutes ago, Wasabi said:

Спасибо большое, что проверили у себя и продемонстрировали результат! Но у меня почему-то не получается подобного результата.

 

К сожалению, не так отрабатывает.
Запускаю через

./launch_release.sh

, предварително сбилдив.

 

(Если точнее, то запускаю через мой скрипт, который предварительно билдит проект. Запускаю, из папки проекта /UNIGINE Projects/<MyProjectName>)

cd source/build && cmake ..
make 
cd ../.. && ./launch_release.sh

Но не думаю, что дело в нем. До этого норамально отрабатывал.

 

У меня вот такой результат:

фпс чутка скачут, но у меня картинка стабильно бегущего человечка, не меняющаяся при нажатии на клавиши.

Link to comment

Точно собираете релиз? Возможно надо переключить конфигурацию.

Можете показать весь лог сборки и сами сборочные скрипты?

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
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
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:

Link to comment
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 и сохранить в редакторе (вроде делал так)?

Если сходу тяжело понять где у меня ошибка, то могли бы Вы прислать мне материалы (ссылки на уроки/документацию), чтобы я воспроизвел нужные действия и получил правильный результат?

На фото показал структуру проекта.

Screenshot from 2024-05-17 21-16-23.png

Screenshot from 2024-05-17 21-16-37.png

Link to comment

А можете запаковать весь ваш проект и залить его на любой файлообменник?

Всё еще непонятно что вы собираете и как запускаете и где проблема в принципе.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
  • 4 weeks later...

Всем добрый вечер! 
У меня ситуация обратная, если запускаю debug сборку, то все ок, если запускаю release, то проигрывается только последний layer, смешивания не происходит никакого, соответственно.

 

 

 

Link to comment

Здравствуйте, Nehuhry!

Проверьте, пожалуйста, что у вас включены остальные слои для смешивания. По умолчанию есть только один включенный слой. Для остальных после добавления нужно вызвать setLayerEnabled(layer, true), а потом задавать ненулевой вес setLayerWeight(layer, w).

 

Link to comment
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

Это одна из типовых проблем при работе с анимациями, было не лишним убедиться :) Да, разница между сборками debug и release не должна влиять на работу слоев. Однако, иногда в release сборке могут быть включены дополнительные оптимизации, которые могут повлиять на работу кода, поэтому мало ли.

Чтобы разобраться, нам понадобится воспроизвести проблему. Не могли бы вы предоставить семпл с описанием минимальных шагов?

Link to comment

Да, были мысли по поводу оптимизации компилятором, но с ходу в глаза не бросается, что такого могло произойти)
По поводу сэмпла: Загружается набор анимаций в персонажа (ObjectMeshSkinned), с учетом того что есть нулевой слой для destination в lerpLayer.
Далее в Update с изменением позиции персонажа проигрывается анимация ходьбы или простаивания на месте.

AnimationsController.cpp AnimationsController.h

Link to comment

Скорее всего, проблема с хранением путей анимаций в виде строк. Мы сами должны хранить строку, т.к. указатель будет смотреть на временный объект. Попробуйте сделать такую замену:

Unigine::Vector<const char *> vectAnimsPath; -> Unigine::Vector<Unigine::String> vectAnimsPath;

 

  • Thanks 1
Link to comment
×
×
  • Create New...