change angle towards direction
I want to deflect/reflect my bulltet, so I used rays to get the incident ray , the normal and made a function that reflects the ray and returns a new vector3. I got the new vector but I don't know how to make the bullet have the same direction of the vector (blue ray). How can I do so? I tried Quaternion.FromToRotation and other functions and they didn't worked.
Here is the code to understand more what's happening:
using UnityEngine;
using System.Collections;
public class BulletBehavior2D : MonoBehaviour {
public bool isEnabled;
public float speed;
public bool bounceOff;
public float rayLength;
private Ray2D ray;
private RaycastHit2D hit;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
ray = new Ray2D (new Vector2 (transform.position.x, transform.position.y), new Vector2 (transform.right.x, transform.right.y));
RaycastHit2D hit;
Debug.DrawRay (ray.origin, ray.direction * rayLength);
hit = Physics2D.Raycast (ray.origin, ray.direction, rayLength);
if (isEnabled) {
transform.position += transform.right * Time.deltaTime * speed;
}
if (hit != null) {
Debug.DrawRay (hit.point, hit.normal * rayLength,Color.red);
Vector3 reflect = BulletBehavior2D.Reflect(transform.right,hit.normal);
Debug.DrawRay (hit.point, reflect * rayLength ,Color.blue);
}
}
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return 2.0f * (normal * -Vector3.Dot(vector, normal)) + vector;
}
void OnTriggerEnter2D(Collider2D coll) {
Vector3 reflect = BulletBehavior2D.Reflect(transform.right,hit.normal);
Vector2 rf = reflect;
/**here the reflection and change of angle should occur ! **/
}
}
Answer by Eno-Khaon · Feb 23, 2016 at 10:48 AM
Well, you have the direction vector of the bullet prior to bouncing off the surface, as well as the calculated new vector after it's deflected.
Being a little lazy and taking a note from this older question, you should be able to generate a Quaternion rotation by doing something like this:
Quaternion angleAdjustment = Quaternion.FromToRotation(currentDirection, reflectedDirection);
transform.rotation = angleAdjustment * transform.rotation;
Quaternion multiplication order always throws me off, so I apologize if I got the final line backwards; Non-commutative math is never pleasant to work through.
Anyway, with both of the directions in mind, the vectors can be run through a FromToRotation to calculate how to reach the destination vector from the current vector. Then, that value can be multiplied with the current rotation to rotate to the new orientation.
Edit: I understand if it doesn't work out for you, since you already mentioned you'd given FromToRotation a try, but I'm simply offering my perspective on it in case anything may have been overlooked.
I'm not really sure what you mean. What is "it" that is zero?