- Home /
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);
}
Answer by JinJin · May 08, 2015 at 08:11 AM
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 )
Your answer
Follow this Question
Related Questions
transform RotateAround 1 Answer
smooth fps movements using joystick 1 Answer
Mesh does not rotate around custom Pivot 1 Answer
unknown axis of rotation 1 Answer
Getting an object to rotate back to zero after key is released 2 Answers