Vehicle keep on floor?

Hi people, I’m stuck at work with a project I’m developing.
It consists of a car which has to move around pushing boxes to desired locations.

Because of the movement of the vehicle (It steers with the back wheels) and some other stuff, I decided not to make it a physics car.

So, I have a piece of code which moves the vehicle and steers it nice, but the problem is when my terrain is not flat. I’ve been reading around and found that you have to cast a ray, get the objects orientation and normals, and etc, but the trught is I’m not that good at maths and all my attempts to reproduce this, failed.

Could anyone give me a little hand here, enlightening me of how to do this? This is my actual code:


private var speed : float = 2; // Speed of the car
private var turnSpeed : float = 150; // Turn speed.

var hit : RaycastHit;

function Update()
{
    var steer=Input.GetAxis("Horizontal");
    var gas=Input.GetAxis("Vertical");
    
    if (gas!=0)
    {
        var moveDist=gas*speed*Time.deltaTime;
        var turnAngle=steer * turnSpeed * Time.deltaTime * gas;

        transform.rotation.eulerAngles.y+=turnAngle;
        transform.Translate(Vector3.forward*moveDist);   
    }
    
    if(Physics.Raycast(transform.position, -Vector3.up, hit)) {
    	Debug.Log(hit.distance + " -- " + hit.normal);
    }
}

Thanks very much!

I recently tried something similar with a hoverboard. I had 4 raycasts to determine the ground rotation, but then I was advised to use the RaycastHit.normal.

I should point out both answers are by Aldo Naletto , not myself.

private var curNormal: Vector3 = Vector3.up; // smoothed terrain normal
private var iniRot: Quaternion; // initial rotation

function Start(){
    iniRot = transform.rotation;
}

function Update(){
	var hit:RaycastHit;
	if (Physics.Raycast(transform.position, -curNormal, hit)){
		// curNormal smoothly follow the terrain normal:
		curNormal = Vector3.Lerp(curNormal, hit.normal, 4*Time.deltaTime);
		// calculate rotation to follow curNormal:
		var rot = Quaternion.FromToRotation(Vector3.up, curNormal);
		// combine with the initial rotation:
		transform.rotation = rot * iniRot;
		}
}

Link to answer in my question (in JavaScript) : http://answers.unity3d.com/questions/230216/why-am-i-getting-a-flipped-out-effect-from-my-transform.rotate.html

Link to original question/answer (in C#) : http://answers.unity3d.com/questions/168097/orient-vehicle-to-ground-normal.html