Skocz do zawartości

Blender / Unity. Animacja szkieletowa plus shapekeys.


Rekomendowane odpowiedzi

Napisano

Pytanie do ludzi którzy dłubią w Unity.

 

W jednej scenie mam 4 meshe postaci i do nich prawie takie same szkielety (minimalne przesunięcie paru kostek). Animki takie same dla wszystkich postaci, mam je w akcjach. Eksportuje wybrany szkielet z meshem jako FBX z zaznaczonym "All Actions", Unity widzi to jako osobne klipy, good.

Teraz pytanie. Będę robił dla tych meshy animacje Blendshapeów zsynchronizowaną z animacją szkieletową i chciałbym to przenieść do Unity. Macie pomysł jak to zrobić? Jest na to jakiś sposób eksportu z blendka czy trzeba to będzie składać w unity, jeśli tak to gdzie?

  • Odpowiedzi 1
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Napisano

Wydaje mi się, że animacje blendshape'ów trzeba oskryptować, bo działają niezależnie od akcji szkieletu (chociaż chciałbym się mylić).

Możesz pobierać informację, która akcja jest akurat odgrywana i ustawiać wartości blendshapów w zależności od np. AnimationState.normalizedTime.

 

Poniżej napisałem prosty przykład. Dla akcji o nazwie "Armature|ArmatureAction" pierwszy blendShape będzie wzrastał wprost proporcjonalnie do postępu animacji tej akcji (to można łatwo rozwinąć). Każda akcja powinna mieć osobnego case'a. W przypadku odgrywania kilku akcji na raz, trzeba będzie interpolować wartości dla blendshape'ów (to jest wersja uproszczona).

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class testMonioBlend : MonoBehaviour {

   // skrypt przypisany do nadrzędnego obiektu, który ma komponent "Animation"

   private Animation anim;
   private GameObject mesh;
   private SkinnedMeshRenderer meshRenderer;
   private Mesh skinnedMesh;
   float[] blendShapeValues;
   int blendShapeCount;

   void Start () {
       anim = gameObject.GetComponent();
       // przypisanie mesza, który ma blendshape'y (można to zrobić ładniej)
       mesh = GameObject.Find ("Cube");
       meshRenderer = mesh.GetComponent ();
       skinnedMesh = mesh.GetComponent ().sharedMesh;
       blendShapeCount = skinnedMesh.blendShapeCount;
       blendShapeValues = new float[blendShapeCount];

       meshRenderer.SetBlendShapeWeight (0, 50);
   }

   void LateUpdate () {

       foreach (AnimationState state in anim) {
           switch (state.name){
           case "Armature|ArmatureAction":
               blendShapeValues[0] = state.normalizedTime*100; //bo blenshape'y przybierają 0-100
               break;
           }
       }

       for (int i = 0; i             meshRenderer.SetBlendShapeWeight (i, blendShapeValues[i]);
       }
   }
}

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności