Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public float CalculateAngle() { Transform exit = transform.FindChild("Exit"); Transform muzzle = transform.FindChild("Muzzle"); Vector3 pos = exit.position; target.y = pos.y; transform.LookAt(target); Vector3 dist = target - pos; dist = exit.transform.InverseTransformDirection(dist); float x = dist.z; float y = dist.y; float v = 100; //speed float g = 9.8f; float v2 = v * v; float v4 = v2 * v2; float x2 = x * x; float theta = Mathf.Atan2(v2 - Mathf.Sqrt(v4 - g * (g * x2 + 2 * y * v2)), g * x); muzzle.transform.Rotate(new Vector3(-theta * Mathf.Rad2Deg, 0, 0)); Debug.Log( "Range X = " + x + " Range Y = " + y + " theta = " + theta * Mathf.Rad2Deg); return theta; } |
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void FireCannon() { Vector3 pos = transform.FindChild("Exit").position; float bulletSpeed = 1000; float dist = Vector3.Distance(pos, target); angle = CalculateAngle(); float Vi = Mathf.Sqrt(dist * -Physics.gravity.y / (Mathf.Sin(Mathf.Deg2Rad * angle * 2))); float Vy, Vz; Vy = Vi * Mathf.Sin(Mathf.Deg2Rad * angle); Vz = Vi * Mathf.Cos(Mathf.Deg2Rad * angle); Vector3 localVelocity = new Vector3(0f, Vy, Vz); Vector3 globalVelocity = transform.TransformVector(localVelocity); Rigidbody clone = Instantiate(projektil, pos, transform.rotation) as Rigidbody; clone.AddForce(globalVelocity * bulletSpeed); canFire = false; } |
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »techtreedev« (11.12.2016, 15:12)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Wie ekligAbschisswinkels
Du hast doch eine ganz andere Formel programmiert, als du oben aufgeschrieben hast. Und da kommt jetzt was anderes raus? Na woran kann das wohl liegen...
C#-Quelltext |
|
1 |
Mathf.Atan2(v2 - Mathf.Sqrt(v4 - g * (g * x2 + 2 * y * v2)), g * x); |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »techtreedev« (12.12.2016, 17:29)
Ja aber die Werte haben doch ganz andere Bedeutungen? Und wie shcon jemand sagte laesst du auch einfach die Haelfte der Loesungen weg. Nur weil du die gleiche Rechenoperationen auf irgendwelche Zahlen anwendest ist das doch nicht die gleiche Formel. Schau dir dein Beispiel an im Vergleich zur Originalbedeutung "hit a target at range x and altitude y". Das waere dann ein Ziel das sehr hoch ist aber bei sehr geringer Reichweite. Da macht es sehr viel Sinn das man quasi senkrecht nach oben zielt.
C#-Quelltext |
|
1 2 3 4 |
// Create an instance of the shell and store a reference to it's rigidbody. Rigidbody shellInstance = Instantiate (shellPrefab, fireTransform.position, fireTransform.rotation) as Rigidbody; // Set the shell's velocity to the launch force in the fire position's forward direction. shellInstance.velocity = launchForce * fireTransform.forward; |
//Kleine Anmerkung
Wenn man das Unity Physiksystem nutzen möcht, ist das Problem lediglich ein Zweizeiler. Dabei kann man via fireTransform die Position und Rotation bestimmen, sowie mittels launchForce auch die Kraft variieren. Das Snippet stammt im Übrigen aus der Tanks! Demo von Unity, siehe Lektion 6: Firing Shells.
C#-Quelltext
1 2 3 4 // Create an instance of the shell and store a reference to it's rigidbody. Rigidbody shellInstance = Instantiate (shellPrefab, fireTransform.position, fireTransform.rotation) as Rigidbody; // Set the shell's velocity to the launch force in the fire position's forward direction. shellInstance.velocity = launchForce * fireTransform.forward;
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void getAngle() { float dist = Vector3.Distance(exit.position, target.transform.position); angle = (Mathf.Asin((gravitation * dist) / (velocity * velocity))) / 2; } private void FireCannon() { getAngle(); transform.LookAt(target.transform.position); Vector3 direction = new Vector3(0, Mathf.Sin(angle), Mathf.Cos(angle)); Rigidbody clone = Instantiate(projektil, exit.transform.position, transform.rotation) as Rigidbody; clone.AddForce(direction * velocity); canFire = false; } |
Werbeanzeige