Zum Inhalt springen
  • Dunkel
  • Hell
  • System

HR → VTube-Parameter Live-Bridge

Event: HR → VTube Bridge

Pro

Jeder HR-Pulse pusht den BPM-Wert in einen Custom Parameter in VTube. Modell kann mit der Frequenz pulsieren, glühen oder Animationen abspielen.

Steps
4
Cooldown
0s/User
Cooldown
0sglobal
Zugriff
Broadcaster

VTube Studio kennt Custom Parameters: frei benannte Float-Werte die du im Live2D-Modell mit Mesh-Deformationen, Texturwechseln oder ArtMesh-Opacities verknüpfen kannst. Der trick: SB pusht den BPM-Wert jede Sekunde in diesen Parameter, das Modell reagiert visuell: z. B. Herz-Pulsieren auf der Brust, glühende Wangen, schnellere Atmung. Das Setup hat zwei Teile: einmal im VTube-Modell, einmal in der SB-Action.

  1. VTube Studio öffnen, Modell laden
  2. Config-Pen-Icon (rechts) → Reiter mit den 3 Schiebreglern (Edit Parameters)
  3. Add new parameter unten
  4. Felder:
FeldWert
Parameter IDBodyHeart
Min Value40
Max Value220
Default70
Auto-Sleepaus
  1. Speichern
  2. Im Modell-File (Live2D Cubism) den Parameter mit einer Deformation verknüpfen: z. B. Skalierung des Herz-Mesh oder Glow-Opacity. Das ist Cubism-Arbeit, kein SB-Thema. Wer kein Cubism kennt: stattdessen einen vorhandenen Parameter wie FaceAngleX benutzen für einen schnellen Test: siehe „Quick-Test“ unten.

Trigger: Integrations > HypeRate.io > Heart Rate Pulse (oder Pulsoid > Heart Rate Pulse), ohne Range-Filter damit jeder Pulse durchkommt.

Set Parameter Value

Integrations VTube Studio Set Parameter Value

Schreibt den Live-BPM-Wert in den Custom Parameter. Weight = 1 = voller Effekt, kein Interpolieren von außen.

Parameter BodyHeart
Value %heartRate%
Weight 1

Global Set. Letzten BPM speichern

Core Globals Global (Set)

Persisted Global für Edge-Detection im nächsten Pulse (siehe unten).

Global Name lastHR
Value %heartRate%
Persisted aktiv

If/Else: Spike-Detection

Core Logic If/Else

Bei einem BPM-Sprung von >30 zum letzten Wert: zusätzlich einen Hotkey für sichtbare Reaktion auslösen.

Input $abs($sub(%heartRate%,%lastHR%))$
Operation Greater Than
Value 30
Then

Trigger Hotkey by Name. Shock

Integrations VTube Studio Trigger Hotkey by Name
Name Shock
  1. 1 Set Parameter Value: BodyHeart = %heartRate% (Weight 1)
  2. 2 Global Set: lastHR = %heartRate% (Persisted)
  3. 3 If/Else: $abs($sub(%heartRate%,%lastHR%))$ Greater Than 30
    1. Then 3a Trigger Hotkey by Name: Shock

Der HR-Trigger feuert bis zu 1×/s. Set Parameter Value ist billig (WebSocket-Frame zu VTube), das verkraftet jede Maschine. Aber:

  • Eigene Action-Queue für die HR-Bridge im Action-Editor (Settings → Queue: HR-Bridge). Sonst stehen schwere Actions hinter dem Pulse.
  • Concurrent = false in der gleichen Queue: verhindert, dass sich zwei Pulses überholen.
  • Range-Filter im Trigger weglassen: Range-Filter ist für Zone-Reaktion gedacht (HR-Zones), die Bridge will jeden Pulse.

Wenn du kein eigenes Modell modifizieren willst, nutze einen vorhandenen Default-Parameter zum Testen: z. B. FaceAngleX (Kopfneigung).

FeldTest-Wert
ParameterFaceAngleX
Value$div($sub(%heartRate%,100),5)$ (BPM 100 → 0°, BPM 150 → 10°, BPM 200 → 20°)
Weight1

Bei HR > 100 BPM neigt sich der Kopf: sichtbar in jedem Default-Modell. Test fertig, danach zurück auf BodyHeart.

Roher HR-Wert hat Spikes (Bewegung, Sensor-Glitches). Smoothing via gleitendem Mittelwert über 3 Pulse:

  1. 1 Global Get: hrSmooth1 → s1 (Persisted, default 70)
  2. 2 Global Get: hrSmooth2 → s2 (Persisted, default 70)
  3. 3 Set Argument: avg = $div($add($add(%heartRate%,%s1%),%s2%),3)$
  4. 4 Set Parameter Value: BodyHeart = %avg%
  5. 5 Global Set: hrSmooth2 = %s1% (Persisted)
  6. 6 Global Set: hrSmooth1 = %heartRate% (Persisted)

Macht das Pulsieren weicher. Trade-off: 3-Sekunden-Lag bis ein neuer Spike voll sichtbar ist.

SzenarioBPMEffekt im Modell
Chill-Stream65Herz pulsiert langsam
Spannender Moment110Pulse beschleunigt, Glow leicht an
Boss-Fight Climax175Glow voll an, Modell zittert (Shock-Hotkey aus Spike-Detection)
HR-Disconnect (0 BPM)0Parameter clipped auf Min 40 (VTube clamped automatisch)
  • Parameter-Name Tippfehler: VTube findet ihn nicht, %success% = false, keine Wirkung. Parameter-ID byte-exakt kopieren
  • Auto-Sleep zerstört Smoothing: wenn Auto-Sleep = aktiv, fällt Parameter nach kurzer Pause auf Default zurück und Sprung zurück sieht hässlich aus. Aus.
  • Weight < 1 = additiv mit Live2D-Defaults: wenn das Modell den Parameter selbst nutzt (z. B. Atmung), kann Weight 0.5 schöner aussehen. Experimentell.
  • Multi-PC mit Lag: VTube auf Streaming-PC, SB auf Gaming-PC, dazwischen ein paar ms LAN. Spürbar erst ab >50 ms. Sub-Action lokal halten wo’s geht.
  • HR-Disconnect: wenn Sensor weg ist, kommen je nach Anbieter 0 oder gar keine Pulses. 0 mappt VTube auf Parameter-Min (40), Modell zeigt „Resting“-Look. Stream-Online-Reset-Pattern aus HR-Zones verwenden um sauber zu starten.
  • HR auf zwei Parameter splitten: BodyHeart für Pulsieren, FaceGlow für Wangen-Röte ab Schwellwert (zweite If/Else-Branch)
  • Bridge nur bei Live-Stream: Trigger-Filter streamOnline == true über Persisted Global aus stream-online, spart unnötige Pushes wenn offline
  • OBS-Source-Color-Tint zusätzlich: bei HR > 170 die Webcam-Source kurz rot tinten (siehe OBS source-filter)
  • Sub-Hype-Boost: bei Sub-Event temporär einen FaceExcited-Parameter pushen, der nach 5 s zurückfällt