ScriptSpot

Forum topic · General Scripting

Rotation of one object relative to another

By freemanpro · 2022-08-23

Description

Hello . I'm trying to rotate one object relative to another. But it's not like it doesn't work so that when the slider changes, it's smooth.

In 1 case, I managed to make it rotate, but there it constantly adds value when the slider changes.
In 2 cases, I managed to make a smooth rotation, but for some reason it rotates relative to 0 coordinates.

Help solve the problem.

try (destroydialog Transformer) catch()

rollout Transformer "Transformer" width:200
(
local nodeRoot
local originTM = #()
local nodeArray = #()

group "Position: "
(
dotNetControl pos_x "System.Windows.Forms.TrackBar" pos:[6,26] width:188 height:25
dotNetControl pos_y "System.Windows.Forms.TrackBar" pos:[6,53] width:188 height:25
dotNetControl pos_z "System.Windows.Forms.TrackBar" pos:[6,80] width:188 height:25
)
group "Position: "
(
dotNetControl rot_x "System.Windows.Forms.TrackBar" pos:[6,138] width:188 height:25
dotNetControl rot_y "System.Windows.Forms.TrackBar" pos:[6,165] width:188 height:25
dotNetControl rot_z "System.Windows.Forms.TrackBar" pos:[6,192] width:188 height:25
)

button hold_tm_bt "Hold Transform" width:190
button reset_tm_bt "Zero Offset" width:190

fn transform_Relatively nodeArray node_root rot_x:0 rot_y:0 rot_z:0 =
(
local obj_Trans = #()

if nodeArr.count > 0 do
(
for i = 1 to nodeArr.count do
(
offset_rot = (eulerangles rot_x rot_y rot_z)
node_trans = nodeArray[i].transform
in coordsys (transmatrix node_root.transform.pos) nodeArray[i].rotation *= offset_rot
)
)
)

on rot_z MouseUp do
(
print "UP"
)

on rot_z ValueChanged val do
(
nodeArray = selection as array
Transform_Relatively nodeArray nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_z.value
)

on hold_tm_bt pressed do if isvalidnode (node = selection[1]) do
(
nodeArray = selection as array
Transform_Relatively nodeArray nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_y.value
)
on reset_tm_bt pressed do
(
nodeRoot = selection[1]
)

)
createdialog Transformer

try (destroydialog Transformer) catch()

struct ANIM_DATA (bone_name, bone_transform)

rollout Transformer "Transformer" width:200
(
local nodeRoot
local originTM = #()
local nodeArray = #()

group "Position: "
(
dotNetControl pos_x "System.Windows.Forms.TrackBar" pos:[6,26] width:188 height:25
dotNetControl pos_y "System.Windows.Forms.TrackBar" pos:[6,53] width:188 height:25
dotNetControl pos_z "System.Windows.Forms.TrackBar" pos:[6,80] width:188 height:25
)
group "Position: "
(
dotNetControl rot_x "System.Windows.Forms.TrackBar" pos:[6,138] width:188 height:25
dotNetControl rot_y "System.Windows.Forms.TrackBar" pos:[6,165] width:188 height:25
dotNetControl rot_z "System.Windows.Forms.TrackBar" pos:[6,192] width:188 height:25
)

button hold_tm_bt "Hold Transform" width:190
button reset_tm_bt "Zero Offset" width:190

fn transform_Relatively nodeArray originTM node_root rot_x:0 rot_y:0 rot_z:0 =
(
local obj_Trans = #()

if nodeArray.count > 0 do
(
for i = 1 to nodeArray.count do
(
offset_rot = (eulerangles rot_x rot_y rot_z) as matrix3
node_trans = originTM[i]

in coordsys (transmatrix node_root.transform.pos) node_trans *= offset_rot
--in coordsys node_root ( node_trans *= offset_rot )

append obj_Trans ( ANIM_DATA nodeArray[i].name node_trans )
)

)
for data in obj_Trans do
(
obj = getNodeByName data.bone_name
if obj == undefined do continue
--add world transform
obj.transform = data.bone_transform
)

)

on rot_z MouseDown do
(
originTM = #()

if isvalidnode (node = selection[1]) do
(
nodeArray = mcBiped.sort_NodeByHeirarchy()

for i = 1 to nodeArr.count do
(
append originTM nodeArray[i].transform
)
)
)

on rot_z MouseUp do
(
originTM = #()
nodeArray = mcBiped.sort_NodeByHeirarchy()

for i = 1 to nodeArr.count do
(
append originTM nodeArray[i].transform
)
rot_z.value = 0
)

on rot_z ValueChanged val do
(
Transform_Relatively nodeArray originTM nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_z.value
)

on hold_tm_bt pressed do if isvalidnode (node = selection[1]) do
(
nodeArray = mcBiped.sort_NodeByHeirarchy()

originTM = #()
nodeArray = mcBiped.sort_NodeByHeirarchy()

for i = 1 to nodeArr.count do
(
append originTM nodeArray[i].transform
)

Transform_Relatively nodeArray originTM nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:45
)
on reset_tm_bt pressed do
(
nodeRoot = selection[1]
)

)
createdialog Transformer

[code]