Problem with turret over moving ship

Hi

I have a script to aim a turret with the mouse (in a first person view) and it works ok, the problem is that the turret is in a spaceship and this one can also rotate so when this happens, the turret’s platform starts aiming in weird directions. This is a sample of my code:

	public void AimTurret(){
		ray = turretCamera.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0.0f));
		
		//Horizontal
		targetPosition = ray.GetPoint(range);		
		targetPosition.y = 0.0f;
		
		hRotation = Quaternion.LookRotation((targetPosition - hPlatform.position).normalized);
        aux = Mathf.Min(hRotationSpeed * Time.deltaTime, 1.0f);
        hPlatform.rotation = Quaternion.Lerp(hPlatform.rotation, hRotation, aux);
	}

I’m pretty sure the problem is that I’m putting a 0 in the y axis (so the turret platform rotates in a single axis) so what I need to know is what should I put here instead of a zero if I want the platform’s turret to keep parallel/horizontal to the ship while conserving it’s axis.

I hope I was clear,
Thanks.

1 Answer

1

An approach that solves this problem is to project your target position on to a xz plane of the ship before calculating the look rotation. Here is another question with the same answer:

http://answers.unity3d.com/questions/553180/turret-lookrotation-problem.html

While I suggest in that answer that Math3D can be used, the ProjectPointOnPlane() function can be rewritten down to just two lines. Here are the two lines pulled from a different answer:

var distanceToPlane = Vector3.Dot(trans.up, target.position - trans.position);
var planePoint = target.position - trans.up * distanceToPlane;

Note that ‘trans’ here is the transform of the ship that the turret rests on.