 # Parameter Wireing with Expressions - Rotation scales different boxes

#1

I become crazy… since a couple of day´s (or better week´s) I try to get this work.
on 4:20 on this video you see some arrows:

The arrows are linked with the rotor of the induction motor.
The Length of the arrows depend´s on the magnetic N and S field.
Every time N or S hit the arrow it should became 150% on N and -150% on S
Between the pole´s I need the scale value 0
My animation is a simple out of range animation controlled by an ease curve.

At first glance, it seemed easy to write an expression for it, even as a beginner.
But as an neeby in scripting I struggle with the syntax und much more with formula´s.
My first stumbling block was that the value of X_Rotation is in Rad, so it take some time to find out, I have to multiplicate with 57,295779513 to get Grad. But now I use
MyPfeil = getNodeByName “Pfeil007”
MyDummy = getNodeByName “Dummy001”
X_Rotation = coordsys gimbal MyDummy.rotation.x
RotAngle = atan2 (coordsys world MyPfeil.pos.Z - MyDummy.Pos.Z) (MyPfeil.Pos.Y - MyDummy.Pos.Y)
to get the Grad Value and to find out the angle between my Dummy and the Arrow(´s).

Because of the “out of range” rotation I get very high rotation angles, which i clean up by integer:
DrehA = int (X_Rotation/360)
DrehB = X_Rotation - (DrehA*360)

As you can see in the video from 4:20 the arrows length depend on the angle of the magnetic field (N/S) but the rotation is linked at the rotor.

I made two scripts to play around, but often I get unexpected results.
Most I find out, so like RotAngle was 90° ((150/90)*RotAngle)/100 where I expect 1.5
and get 0.9, because of an integer data type…
Typical beginner error I guess
Whenever I’m close to it and think “now I’ve got it” it slips back into the distance

Josef

Script1
MyPfeil = getNodeByName “Pfeil006” --Scale object
MyDummy = getNodeByName “Dummy001”
MyRotorDummy = getNodeByName “Dummy002” --Rotation of the rotor
X_Rotation = coordsys gimbal MyRotorDummy.rotation.x
DrehA = int (X_Rotation/360)
DrehB = X_Rotation - (DrehA*360)
RotAngle = atan2 (coordsys world MyPfeil.pos.Z - MyDummy.Pos.Z) (MyPfeil.Pos.Y - MyDummy.Pos.Y)-- get vector
Dreh = RotAngle --+ DrehB
if (Dreh == 0 or Dreh == 180 or Dreh == -180) then ScaleA = 0 else
if (Dreh == 45) or (Dreh == 135) then ScaleA = 0.75 else
if (Dreh == -45) or (Dreh == -135) then ScaleA = -0.75 else
if (Dreh == 90) then ScaleA = 1.5 else
if (Dreh == -90) then ScaleA = -1.5
print ScaleA

Script2
MyPfeil = getNodeByName “Pfeil006” --Scale object
MyDummy = getNodeByName “Dummy001” --Rotate dummy to get vectors (probably not necessary)
MyRotorDummy = getNodeByName “Dummy002” --Rotation of the rotor
X_Rotation = coordsys gimbal MyDummy.rotation.x
DrehA = int (X_Rotation/360) --the integer cut decimal
DrehB = X_Rotation - (DrehA*360) --cleaned angle, because of the out of range
RotAngle = atan2 (coordsys world MyPfeil.pos.Z - MyDummy.Pos.Z) (MyPfeil.Pos.Y - MyDummy.Pos.Y) --get vector
Dreh = RotAngle + DrehB --not used in this first step
if (RotAngle > 0) and (RotAngle <= 90) then ScaleA = ((150.0/90.0)RotAngle)/100.0 else
if (RotAngle > 90) and (RotAngle <= 180) then ScaleA = (150.0/90.0)
(RotAngle-90.0)/100.0 else
if (RotAngle <= 0) and (RotAngle >= -90) then ScaleA = ((150.0/90.0)RotAngle)/100.0 else
if (RotAngle < -90) and (RotAngle > -179.9) then ScaleA = (150.0/90.0)
(RotAngle+90.0)/100.0

Test file
test02.max (944 KB)