# How to Correct Angle when throwing a projectile at/towards a different objects LOCATION?

Hi all,

I have a simple setup of two players in a 3D world view, facing across from each other. They can move back and forth (up/down?) but not side to side. the movement of each player is on the Z axis. If each player is DIRECTLY across from each other and I throw a projectile at the other player, the projectile rotates/spins correctly. Now, if player1 is throwing the projectile at player2 and player2 is NOT DIRECTLY sitting across from player1 (e.g. player1 z location = 1 and player2 z location = 10), my projectile seems to “spin” on the wrong axis, I want the projectile to rotate like a throwing knife that only spins end to end, but no rotation left or right say… I am not using velocity to move my object, I’m just moving it “manually”, Is Kinematic is ON, gravity off, I have a rigidbody also for collision later on. See my code below and example picture of what is happening when both players are NOT directly across from each other and a projectile is thrown. Anyone have a rotation solution?

Thanks
King

projectile.cs

``````    // Update is called once per frame
public float projectileSpeed;
public float projectileRotationSpeed;
private Transform projectileTransform;

// Use this for initialization

void Start ()
{
projectileTransform = transform;
}

void Update ()
{
float amtToMove = projectileSpeed * Time.deltaTime;
float amtToRotate = projectileRotationSpeed * Time.deltaTime;
// Projectile speed is set in the INSPECTOR: to 4
Vector3 v = Player2.player2Pos - projectileTransform.localPosition;
//Move the projectile
projectileTransform.localPosition += v.normalized*amtToMove;
//Rotate the projectile (i.e. Knife spinning)
projectileTransform.Rotate(Vector3.back, amtToRotate);
//Check for boundry, if projectile is past a certain point, destroy it
if (projectileTransform.localPosition.x > 15.84f)
{
Destroy(gameObject);//destroy game object we are attatched too...
}

}
``````

Player.cs

``````	//Spacebar to throw a projectile
if (Input.GetKeyDown("space"))
{
player1Pos = player1.transform.localPosition;

Instantiate(KnifePrefab,transform.position,Quaternion.identity);
}
``````

this is wrong:

projectileTransform.Rotate(Vector3.back, amtToRotate);

because it rotates your object around Vector3.back in the world coordinates. you should rotate it in the object’s own local coordinates (google “world vs local coordinates”)

you can do this:

transform.RotateAround( point, axis, angle );

point - the knife center

axis - an axis that is perpendicular to the direction from player 1 to player 2

direction = player1.position - player2.position

axis = Vector3.Cross( direction, Vector3.up )