Jump to content

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


photo

Recommended Posts

Posted

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

Вот мой код:

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


 

Posted
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

Posted

Wasabi

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

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

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

Posted
4 hours ago, silent said:

Wasabi

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

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

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

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

 

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

./launch_release.sh

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

 

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

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

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

 

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

Posted
27 minutes ago, Wasabi said:

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

 

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

./launch_release.sh

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

 

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

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

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

 

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

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

Posted

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

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

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

Posted
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

 

Posted
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:

Posted
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

Posted

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

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

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

  • 4 weeks later...
Posted

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

 

 

 

Posted

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

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

 

Posted
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);

 

 

Posted

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

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

Posted

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

AnimationsController.cpp AnimationsController.h

Posted

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

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

 

  • Thanks 1
×
×
  • Create New...