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?



    // 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...


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

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 )