Answers for "Shooting a cannonball."
http://answers.unity.com/questions/148399/shooting-a-cannonball.html
The latest answers for the question "Shooting a cannonball."Answer by hacky4
http://answers.unity.com/answers/1812741/view.html
@LeleUnity so I just figured out that I was initializing the cannonball such that it was something coming inside the bounds of the object. Just make sure that the cannonball never instantiated or collides with the collider of the cannon itself and the code works for all angles.Tue, 09 Feb 2021 11:03:25 GMThacky4Answer by LeleUnity
http://answers.unity.com/answers/1777394/view.html
@aldonaletto Your code returns error: **"rigidbody.velocity assign attempt for 'Shell(Clone)' is not valid. Input velocity is { NaN, NaN, NaN }. UnityEngine.Rigidbody:set_velocity (UnityEngine.Vector3)"**
----------
maybe because of the angle? Could you show how to get the angle of transform instead your fixed float of 30degrees ? I have done transform.localEulerAngles.x in order to get 60 degree, the inclination af the cannon tip and have done :
ball.GetComponent<Rigidbody>().velocity = BallisticVelocity(target, cannonTip.localEulerAngles.x);
but doesnt work at all... **your code works only on 0 to 90 degrees angles.**
It seems a problem of the square root and angle.. Could you fix it to make it universal ?
Thank you!Sun, 04 Oct 2020 10:39:31 GMTLeleUnityAnswer by Dschonny2000
http://answers.unity.com/answers/582731/view.html
Well, stumbled upon this thread and asked myself same question as Mozes - how can I rearrange this to calc the angle with given velocity?
Tried it with
float angle = ( Mathf.Asin((distance * Physics.gravity.magnitude) / (velocity * velocity)) ) / 2
but that doesn't do the trick. Also, when thinking about it, when velocity is fixed there must be a distance-range (min and max distance) in which there is a valid angle, and in that range there will probably be two angles that do the job.. but I'm just too bad at math to get it..
In case anybody still needs the original Velocity-calculation (thanks for this to aldonaletto!) in c#, here's my translation:
Vector3 calcBallisticVelocityVector(Transform source, Transform target, float angle)
{
Vector3 direction = target.position - source.position; // get target direction
float h = direction.y; // get height difference
direction.y = 0; // remove height
float distance = direction.magnitude; // get horizontal distance
float a = angle * Mathf.Deg2Rad; // Convert angle to radians
direction.y = distance * Mathf.Tan(a); // Set direction to elevation angle
distance += h/Mathf.Tan(a); // Correction for small height differences
// calculate velocity
float velocity = Mathf.Sqrt(distance * Physics.gravity.magnitude / Mathf.Sin(2*a));
return velocity * direction.normalized;
}Mon, 25 Nov 2013 05:05:25 GMTDschonny2000Answer by Kergal
http://answers.unity.com/answers/296905/view.html
Hey guys I stumbled over this nice thread - which covers exactly what I need, unfortunately everybody is coding in unity script...
i tried to translate the code to c# , but I must have made a mistake.
this is my translation:
public Vector3 BallisticVel(Transform target, float angle){
Vector3 dir = target.position - mySelf.transform.position;
float h = dir.y;
dir.y =0f;
float dist = dir.magnitude;
float a = angle * Mathf.Deg2Rad;
dir.y = dist * Mathf.Tan(a);
dist += h / Mathf.Tan(a);
float vel = Mathf.Sqrt(dist*Physics.gravity.magnitude / Mathf.Sin(2 * a));
return vel*dir.normalized;
}
here I "call" the function :
GameObject ball = Instantiate(ArrowObject,_ArrowObjectPos.position,Quaternion.identity)as GameObject;
ball.rigidbody.velocity = BallisticVel(enemyObject, shootangle);
mySelf is the gameobject the script is attached to ;)
and this is the errormessage I get :
rigidbody.velocity assign attempt for 'Sphere(Clone)' is not valid. Input position is { NaN, NaN, NaN }.
UnityEngine.Rigidbody:set_velocity(Vector3)
I am terrible with all those Mathf. stuff. I was able to use the script like this :
public Vector3 BallisticVel(Transform target){
Vector3 dir = target.position - mySelf.transform.position;
float h = dir.y;
dir.y =0;
float dist = dir.magnitude;
dir.y = dist;
dist += h;
float vel = Mathf.Sqrt(dist*Physics.gravity.magnitude);
return vel*dir.normalized;
}
but like this - i shoot the cannon way too slow and a bit too far.
Any suggestions?Sun, 05 Aug 2012 22:45:42 GMTKergalAnswer by aldonaletto
http://answers.unity.com/answers/148899/view.html
You must lower the elevation angle. The greatest distance is reached with a 45 degrees elevation, but the ball takes a lot to fall. You can experiment with 30, 20, 15 degrees - but the lower the angle, the higher the force you must apply for the cannon ball to reach the target. It may be easier to set the cannon ball velocity instead of the force applied.
The function BallisticVel in the script below calculates the velocity vector necessary to reach the object **target** when shooting at **angle** elevation. It assumes the target and the cannon are at the same height, but provides some correction for small differences (small when compared to the distance):
function BallisticVel(target: Transform, angle: float): Vector3 {
var dir = target.position - transform.position; // get target direction
var h = dir.y; // get height difference
dir.y = 0; // retain only the horizontal direction
var dist = dir.magnitude ; // get horizontal distance
var a = angle * Mathf.Deg2Rad; // convert angle to radians
dir.y = dist * Mathf.Tan(a); // set dir to the elevation angle
dist += h / Mathf.Tan(a); // correct for small height differences
// calculate the velocity magnitude
var vel = Mathf.Sqrt(dist * Physics.gravity.magnitude / Mathf.Sin(2 * a));
return vel * dir.normalized;
}
var myTarget: Transform; // drag the target here
var cannonball: GameObject; // drag the cannonball prefab here
var shootAngle: float = 30; // elevation angle
function Update(){
if (Input.GetKeyDown("b")){ // press b to shoot
var ball: GameObject = Instantiate(cannonball, transform.position, Quaternion.identity);
ball.rigidbody.velocity = BallisticVel(myTarget, shootAngle);
Destroy(ball, 10);
}
}
To test it, create an empty object about 2 units above the ground and attach this script. Make sure the cannonball don't touch any collider when instantiated, or it will not reach the target. Drag the target and the cannonball prefab to the corresponding variables and press b to shoot.Wed, 27 Jul 2011 02:44:25 GMTaldonalettoAnswer by Kith
http://answers.unity.com/answers/148404/view.html
You can add a script to the cannon ball prefabs that adds a constant downward force. By adjusting the amount of the downward force, you should be able to adjust the arc that the cannon ball makes.Tue, 26 Jul 2011 03:05:04 GMTKith