Replicate local movement between objects
Hi, I'm trying to write a script to be added to a game object A that replicates the deltas (between frames) of local position and local rotation of another game object B. For example when B moves to its right by say 1 unit, A moves to its right by 1 unit. The same thing for rotation: when B rotates by 10 degrees on its left, A rotates by 10 degrees on its left.
In the script I keep the local position and rotation of the object in the previous frame and calculate the deltas in the current frame, I managed to make the rotation work, but I'm struggling with replicating the position.
 public class MirrorLocalMovement : MonoBehaviour
 {
     public Transform target;
         
     private Vector3 prevLocalPos;
     private Quaternion prevLocalRot;
     private bool firstUpdate = true;
 
     private void Update()
     {
         if (firstUpdate)
         {
             firstUpdate = false;
         }
         else
         {
             transform.Rotate((target.localRotation * Quaternion.Inverse(prevLocalRot)).eulerAngles);
             
     // Translation?
 
         }
 
         prevLocalPos = target.localPosition;
         prevLocalRot = target.localRotation;
     }
 }
I tried with transform.Translate and transform.InverseTransformDirection but with no success. How can I replicate the translation in local space between the two objects?
Thank you in advance
Answer by Nebula_9283 · Mar 04, 2019 at 07:36 AM
Here a possible solution (tempTransform is a temporary empty transform to be set in inspector, used to maintain the previous rotation and call InverseTransformDirection):
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 
 public class MirrorBehaviour : MonoBehaviour
 {
     public Transform target;
     public Transform tempTransform;
 
     private Vector3 prevPos;
     private Quaternion prevRot;
     private bool firstUpdate;
 
 
     private void Update()
     {
         if (firstUpdate)
         {
             firstUpdate = false;
         }
         else
         {
             Vector3 deltaPos = target.localPosition - prevPos;
             tempTransform.rotation = prevRot;
             Vector3 localDir = tempTransform.InverseTransformDirection(deltaPos);
             transform.Translate(localDir.x, localDir.y, localDir.z);
 
             Quaternion deltaRot = target.localRotation * Quaternion.Inverse(prevRot);
             Vector3 eulerDeltaRot = deltaRot.eulerAngles;
             transform.Rotate(eulerDeltaRot.x, eulerDeltaRot.y, eulerDeltaRot.z);
         }
 
         prevPos = target.localPosition;
         prevRot = target.localRotation;
     }
 }
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                