ERC (Enhanced Remote Control)

by JanGiGo

ERC klingt Cooool... aber was ist das?


Unter 'ERC' versteht man die automatische Bedienung mehrerer Parameter einer Figur. Am Anfang stand die Idee, mehrere Morphs einer Figur zentral an einer Stelle einstellen zu können. Die Methode wurde ausgedehnt und jetzt ist sie an allen Parametern einer Figur anwendbar. Die Grundlagen dieser Methode möchte ich in diesem Tutorial beschreiben. Mein Tutorial basiert auf Arbeiten von Rob Whisenant (aka "rbtwhiz") und Charles Taylor (AKA"nerd").

Zuerst möchte ich Euch Erich vorstellen. Diese Marionette wird mir helfen, das grundlegende Vorgehen zu demonstrieren:




Erich hat in seinen Körperteilen rShldr, lShldr, rThigh und lThigh eingebaute Morphs für Muskeln. Wenn ich sie einstellen möchte, muss ich der Reihe nach die entsprechenden Körperteile auswählen und die Morphs einstellen.




Es liegt nahe, alle 4 Morphs auf einmal, mit einem Rädchen, zu bedienen. Und genau das machen wir jetzt. Als Erstes erstellen wir in der BODY Abteilung unserer Figur das Master-Rädchen, das die Steuerung übernehmen soll. Dazu öffnen wir eine Kopie unserer CR2 Datei mit einem Editor und fügen bei actor BODY:1 in der channels Sektion eine valueParm Sektion ein.

channels (Kanäle)

• die Sektion in der CR2 Datei, die die Bewegung kontrolliert. In Poser erscheinen die channels als Rädchen (Dials).

valueParm Sektion

• definiert einen Master Dial, das die anderen Rädchen kontrolliert


channels
{
valueParm Arnie
{
name Muskeln
initValue 0
hidden 0
forceLimits 1
min 0
max 40
trackingScale 0.5
keys
{
static 0
k 0 0
}
interpStyleLocked 0
}




Die jeweilige Anweisung aus der valueParm Sektion hat ihre Entsprechung in dem Dialog „Parameter Settings“. Ich habe dieser Sektion den internen Namen Arnie gegeben. Die Sektion erscheint in Poser im Body Teil unserer Figur als ein Rädchen mit dem Namen Muskeln. Das ist unser Master Dial. Die Anweisung hidden 0 bewirkt, dass das Rädchen sichtbar ist. Wenn wir jetzt an dem Rädchen drehen passiert nichts. Es ist noch keine Funktionalität eingebaut. Als nächstes müssen wir die Kanäle definieren, die vom Master Arnie gesteuert werden sollen.

Im meinem Beispiel heißen die Muskel-Morphs intern bizepsL, bizepsR, TricepsL und TricepsR. Ich habe hier die Namen nicht geändert und deswegen erscheinen die Rädchen unter dem gleichen Namen auch auf dem Bildschirm. Das Master Rädchen Arnie soll die Bizeps und die Triceps Morphs der Körperteile lShldr, rShldr, rThigh und lThigh der Figur 1 steuern. Wir suchen in unserer CR2 Datei nach den vier Morphs. Die Morphs sind an der Anweisung targetGeom erkennbar.

Nachdem wir den ersten Morph gefunden haben fügen wir hinter der Anweisung interpStyleLocked 0 fünf neue Befehlszeilen ein:

valueOpDeltaAdd

• ist ein Befehl, der diesen Dial als Slave erklärt. Ab sofort weiß Poser, dass dieses Rädchen von einer anderen Stelle bedient wird.

figureName

• nennt die Figur die die Kontrolle hat, in unserem Beispiel Figure 1

partName

• nennt den Teil der Figur, in dem sich das Master Rädchen befindet - in unserem Beispiel ist das BODY:1

morphName

• das ist der interne Name des Rädchens, das die Kontrolle hat, bei uns Arnie

deltaAddDelta

• definiert den Modifikator für dieses Dial.

Den Modifikator müssen wir berechnen. Wir addieren die absoluten Werte (die ohne Vorzeichen) von Max und Min zusammen und erhalten damit den Wirkungsgrad des Dials. Danach errechnet sich deltaAddDelta wie folgt:

deltaAddDelta = Wirkungsgrad Slave/Wirkungsgrad Master.

Rechenbeispiel:

Nehmen wir an Wirkungsgrad Master ist 40 und Wirkungsgrad Slave ist 1, dann ist

deltaAddDelta = 1/40 = 0.025

In meinem Beispiel sieht das so aus:

targetGeom bizepsL
{
name bizepsL
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025
indexes 1778
numbDeltas 1778
deltas {...usw.


Und genau das gleiche für den rechten Morph:

targetGeom bizepsR
{
name bizepsR
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025
indexes 1778
numbDeltas 1778
deltas { ...usw.


Dann fügen wir die gleichen fünf Zeilen an lThigh und rThigh an:

targetGeom TricepsR
{
name TricepsR
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025
indexes 689
numbDeltas 830
deltas { ...usw.


targetGeom TricepsL
{
name TricepsL
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025
indexes 689
numbDeltas 830
deltas { ...usw.


Nun werden alle vier Morphs gleichzeitig aktiviert, wenn wir an dem Arni Rädchen drehen. Die Rädchen an lSldr, rShldr, rThigh und lThigh sind nicht mehr wichtig. Sie können mit hidden 1 unsichtbar gemacht werden. Wir bleiben noch bei Erich und seinen Muskeln, versuchen uns aber an einer anderen Konstruktion.

targetGeom bizepsL
{
name bizepsL
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
lForeArm:1 # hier wird das zrot Rädchen, das für das Beugen des Unterarms
zrot # (lForeArm) zuständig ist als Master definiert
deltaAddDelta 0.025
indexes 1778
numbDeltas 1778 ...usw.


Geändert habe ich figureName auf lForeArm und partName auf zrot (entspricht Beugen). Der Master ist jetzt der Unterarm. Der Morph wird immer dann aktiviert, wenn lForeArm gebeugt wird.




Jetzt funktioniert aber Master Arnie am lShldr nicht mehr. Was machen wir jetzt? Wir fügen noch fünf zusätzliche magische Zeilen hinzu:

targetGeom bizepsL
{
name bizepsL
initValue 0
hidden 0
forceLimits 1
min -100000
max 100000
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd # damit Erklären wir lForArm und das Rädchen
Figure 1 # zrot für Master Dial
lForeArm:1
zrot
deltaAddDelta 0.025000
valueOpDeltaAdd # und damit ist der Arni auch noch der Master
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025000 ...usw.

Genauso wie ein Master Dial mehrere Slaves haben darf, gilt auch umgekehrt: ein Slave kann mehrere Master besitzen. Master und Slaves dürfen sich allerdings nicht rekursiv (rekursiv = auf sich selbst verweisend) aufrufen – das würde uns Poser übel nehmen.




Um den linken Unterarm nach oben zu beugen stellen wir an dem passenden Rädchen positive Werte ein. In der obigen Abbildung sind die Werte des linken Unterarms positiv, die des rechten Arms negativ. Wenn wir auf der rechten Seite die identischen Werte für deltaAddDelta einsetzen würden, wie auf der linken Seite, würde der Morph falsch herum funktionieren. Deshalb müssen wir in dem Fall rechts für deltaAddDelta einen negativen Wert

einsetzen: -0.025000

targetGeom bizepsR
{
.
.
valueOpDeltaAdd
Figure 1
lForeArm:1
zrot
deltaAddDelta -0.025000
valueOpDeltaAdd
Figure 1
BODY:1
Arnie
deltaAddDelta 0.025000
.
.

Wir wollen diese Methodik jetzt auch an anderen Parametern einer Figur ausprobieren. Lassen wir uns auf einige Experimente mit Victorias Augen ein. Wir laden eine Kopie der Victoria CR2 in den Texteditor und erstellen, wie im ersten Beispiel, einen Master Dial im head Teil der V3. Der Master trägt bei mir den internen Namen EyeMove und erscheint als Schielen auf dem Bildschim:

channels

{
valueParm EyeMove
{
name Schielen
initValue 0
hidden 0
forceLimits 1
min 0
max 40
trackingScale 0.5
keys
{
static 0
k 0 0
}
interpStyleLocked 0
}

Die links/rechts Bewegung der Augen wird bei der V3 durch Drehung um die Y-Achse realisiert. Diese Drehung um die Y-Achse wollen wir jetzt zum Slave erklären. Also suchen wir im rightEye und im leftEye den channel rotateY und fügen an den beiden Stellen die uns bereits bekannte Code-Zeilen ein:

rotateY yrot

{
name GetStringRes(1028,3)
initValue 0
hidden 0
forceLimits 0
min -35
max 35
trackingScale 1
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
head:1 # Master befindet sich in head
EyeMove # und heißt EyeMove
deltaAddDelta 1

usw...

Wenn wir nun in Poser an dem neu erschaffenen Rädchen drehen, bewegen sich die beiden Augen der V3 synchron nach links und rechts. Ändern wir dagegen an einem der Augen deltaAddDelta auf minus 1 dann schielt die Vicky.




Noch ein Beispiel:




Der Master heißt hier Zahnrad und ist im BODY der Figur platziert. Die zRotate Kanäle der beiden Zahnräder sind die Slaves. Eins der Zahnrädchen ist in etwa 2.5-mal kleiner als das andere und dreht sich in die entgegengesetzte Richtung. Daher habe ich den Wert für deltaAddDelta auf -2.5 gesetzt.

Das Einsatzgebiet dieser Methodik beschränkt sich nicht nur auf Poser Figuren. Genau so gut funktioniert es mit den Gegenständen (Props). Das unten stehende Beispiel demonstriert eine Schraube die sich dreht und sich dabei immer tiefer in die Unterlage einschraubt.




Hier ist der Master im Prop mit dem Namen Holzschraube platziert und heißt Drehen. Er hat 2 Slaves, die eine gleichzeitige Rotation um die Y-Achse und vertikale Verschiebung entlang der Y-Achse (translateY) bewirken. Bemerkenswert ist, dass obwohl keine Figur vorhanden ist, die Anweisung figureName nicht einfach weggelassen werden darf. Wir tragen an dieser Stelle _NO_FIG_ ein. Die beiden deltaAddDelta Werte habe ich experimentell ermittelt.




Hier findet Ihr ein Freebie für dieses Tutorial in einer zip-Datei.

Diese Seite gehört zum Angebot von www.poser-tutorials.de