Skip to content

Blender / Unity. Animacja szkieletowa plus shapekeys.

Featured Replies

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?

  • Replies 1
  • Views 2.9k
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

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

Create an account or sign in to comment

Important Information

We are using cookies. Read about our Privacy Policy We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.