- Home /
Ricochet Trajectories C#
I'm having trouble calculating the angle of reflection for bullet trajectories in a 3rd person shooter I'm developing.
I can get the Y rotation to work fine, but when trying to implement the X rotation, it all goes a bit funny.
I'm using Vector3.reflect to calculate the angle, then using Mathf.Atan2 to turn that into a degree value.
void FixedUpdate(){
Ray ray = new Ray(transform.position,transform.forward);
RaycastHit hit;
Debug.DrawRay(transform.position,transform.forward);
if(Physics.Raycast(ray, out hit, Time.deltaTime*velocity + 0.1f)){
Vector3 reflectDirection = Vector3.Reflect(ray.direction,hit.normal);
float rotY = Mathf.Atan2(reflectDirection.x,reflectDirection.z)*Mathf.Rad2Deg;
float rotX = Mathf.Atan2(reflectDirection.y,reflectDirection.z)*Mathf.Rad2Deg;
Debug.Log ("rotX = "+rotX+", rotY = "+rotY);
transform.eulerAngles = new Vector3 (rotX,rotY,transform.rotation.z);
}
if(velocity >0){
//velocity -= drag;
}else{
Destroy(this.gameObject);
}
downForce += gravity*Time.deltaTime;
this.transform.Translate(Vector3.forward*velocity*Time.deltaTime, this.transform);
//this.transform.Translate(Vector3.down*downForce);
int materialSelect = (int)(velocity / 160);
thisRenderer.material = materials [materialSelect];
}
I can't get my head around this. Any help would be vastly apreciated.
Cheers, Alex
Answer by littleface91 · Feb 26, 2015 at 03:38 PM
Found the problem, I shouldn't have been using a Vector3 as my out value. I did this instead and it works perfectly;
void FixedUpdate(){
//bulletHit = DoHitCheck();
Ray ray = new Ray(transform.position,transform.forward);
RaycastHit hit;
//Debug.DrawRay(transform.position,transform.forward);
if(Physics.Raycast(ray, out hit, Time.deltaTime*velocity + 0.1f)){
Vector3 reflectDirection = Vector3.Reflect(ray.direction.normalized,hit.normal);
transform.rotation = Quaternion.LookRotation(reflectDirection);
}
if(velocity >0){
velocity -= drag;
}else{
Destroy(this.gameObject);
}
downForce += gravity*Time.deltaTime;
this.transform.Translate(Vector3.forward*velocity*Time.deltaTime, this.transform);
this.transform.Translate(Vector3.down*downForce);
//Debug.Log ("" + velocity);
int materialSelect = (int)(velocity / 160);
thisRenderer.material = materials [materialSelect];
}
Your answer
Follow this Question
Related Questions
Reflect bullets in 3D world space 1 Answer
Wall Running using Javascript 0 Answers
Using Lerp in a Constant Moving Object 1 Answer
Rigidbody object intersection 0 Answers