Rotate GameObject based on RigidBody Velocity
Hello,
Just wondering if someone would be kind enough to help me work something out (in C# preferably).
Basically I have a cube with a little propeller on the top of it. The cube has a Rigidbody and is controlled by keys (for forwards/backwards motion). I am trying to work out how to make the propeller rotate (clockwise/anti-clockwise on Y axis) based on the RigidBody’s Velocity.
Ideally I am wanting to be able to drag the object with the RigidBody component and the propellor GameObject onto the script in the inspector.
I have a ‘faked’ solution where it rotates the propellor based on key input and a float for rotation speed but as soon as I am not holding down a key it stops rotating so it looks a bit silly to see the cube slowing down and the propellor has already stopped rotating.
Any help would be very much appreciated.
Problem Solved! Didn't need to use velocity at all. $$anonymous$$uch thanks to RuneFire Studio for their assistance.
Answer by MudPuppet · Feb 11, 2017 at 09:25 AM
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerRotObject : MonoBehaviour
{
// SPEED = DISTANCE / TIME
public Vector3 localV;
public float RBVelo;
public float WheelRadius=2.35f;
public GameObject thisObject; // Object with Rigidbody
public GameObject leftProp; // Left Propellor Object
public GameObject rightProp; // Right Propellor Object
private Rigidbody thisRB;
Vector3 currentPosition;
// Use this for initialization
void Start ()
{
thisRB = thisObject.GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update ()
{
RBVelo = thisRB.velocity.magnitude;
Vector3 localVelocity = transform.InverseTransformDirection( thisRB.velocity );
// Just to visualize in the inspector
localV = localVelocity;
float dir_mult = 1; // Determine direction to "spin" the wheel; 1 is forward, -1 is backward
if(localVelocity.z < 0) dir_mult = -1;
// Magnitude * time.deltaTime is basically the "distance" the rb traveled
// So, we need to figure out how much to "spin" the wheels...
// this ONLY takes into account SPEED, not DIRECTION. So, if hte car is moving backwards,
// we'd need to actually multiply by -1
float degRot = ( (RBVelo * Time.deltaTime) / WheelRadius) * Mathf.Rad2Deg * dir_mult;
leftProp.transform.Rotate( degRot, 0, 0 );
rightProp.transform.Rotate( degRot, 0, 0 );
}
}
Your answer
Follow this Question
Related Questions
Storing instantaneous velocity 0 Answers
How to get rigidbody velocity? 3 Answers
Rigid body velocity rotation,Rotate instead of Velocity? 1 Answer
Torque rigidbody toward desired rotation on two axes ignoring Y axes? 0 Answers
Error CS1612 1 Answer