Beräkna hastigheten av vinklat objekt

Permalänk
Medlem

Beräkna hastigheten av vinklat objekt

Hej. Sitter och gör ett litet spel i Unity just nu och har fastnat på ett irriterande problem.

Först måste ni titta på denna videon för att förstå vad jag menar:

Spelet jag skapar liknar ZigZag väldigt mycket. Jag har alltså ett objekt som kan flytta sig diagonalt åt antingen vänster eller höger. Har också en kamera som jag nu vill ska åka i objektets takt uppåt. Det klurade med allt detta är att objektet egentligen inte åker diagonalt, det är bara kameran som är vänd 45 grader så att man ser spelet från sidan, alltså exakt som på ZigZag. Vill få ut hastigheten som är i mellan dem här två vinklarna och sätta på kameran så den följer objektets takt, men har ingen aning om hur jag ska göra, har till och med svårt för att förklara problemet här. Om jag tar hastigheten (vinkel1 + vinkel2) så får jag ut en snabbare hastighet än vad objektet egentligen rör sig.

Någon som vet hur man löser detta?

*EDIT*

Det är ju helt enkelt såhär, då det är längre sträcka för objektet att ta sig längst upp på skärmen när den åker diagonalt än om den skulle åka rakt upp så hinner ju kameran före om jag tar objektets hastighet och fäster det på kameran. Nu är frågan, hur gör jag nu för att räkna ut så jag får rätt hastighet på kameran?

Permalänk
Medlem

Hjälpte det?

Visa signatur

Fractal Design R4 | Cooler Master V700 | I5 4670k 4.3 Ghz | CM Hyper 212 EVO | Gigabyte GA-Z87X-D3H | Ballistix sport 1600MHz 16GB | 2x120GB ssd RAID, | GTX 770 OC | Windows 10 | Steelseries Rival | Func KB-460 MX Blue | AOC i2367Fmx2 |
AOC g2460Pg |[/B]

Permalänk
Medlem
Skrivet av Warcaith:

Hej. Sitter och gör ett litet spel i Unity just nu och har fastnat på ett irriterande problem.

Först måste ni titta på denna videon för att förstå vad jag menar:
https://www.youtube.com/watch?v=OAAxh-KNuck

Spelet jag skapar liknar ZigZag väldigt mycket. Jag har alltså ett objekt som kan flytta sig diagonalt åt antingen vänster eller höger. Har också en kamera som jag nu vill ska åka i objektets takt uppåt. Det klurade med allt detta är att objektet egentligen inte åker diagonalt, det är bara kameran som är vänd 45 grader så att man ser spelet från sidan, alltså exakt som på ZigZag. Vill få ut hastigheten som är i mellan dem här två vinklarna och sätta på kameran så den följer objektets takt, men har ingen aning om hur jag ska göra, har till och med svårt för att förklara problemet här. Om jag tar hastigheten (vinkel1 + vinkel2) så får jag ut en snabbare hastighet än vad objektet egentligen rör sig.

Någon som vet hur man löser detta?

*EDIT*

Det är ju helt enkelt såhär, då det är längre sträcka för objektet att ta sig längst upp på skärmen när den åker diagonalt än om den skulle åka rakt upp så hinner ju kameran före om jag tar objektets hastighet och fäster det på kameran. Nu är frågan, hur gör jag nu för att räkna ut så jag får rätt hastighet på kameran?

Simpelt, använd Pythagoras Sats (A^2 + B^2 = C^2)Här finns en beskrivning

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

Och det jag antar att du vill räkna ut är
C/2
vilket är avståndet mellan hörnet AB och mitten på C...

Visa signatur

Mamma är bäst!

Sur o Deppig?
Läs lite goda nyheter!
https://www.goodnewsmagazine.se/

Permalänk
Medlem

Vad gör jag för fel?

float a = target.position.x; float b = target.position.z; float c = (a * a + b * b); transform.position = new Vector3(transform.position.x, transform.position.y + c / 2, transform.position.z);

Nu går det alldeles, alldeles för snabbt. Jag ser heller inte vart jag gjort för fel i Pythagoras satsen. Känns ju mest logiskt att använda den formeln men på något sätt inte, får ut ett allt för stort värde liksom.

Permalänk
Medlem
Skrivet av Warcaith:

Vad gör jag för fel?

a = target.position.x; b = target.position.z; c = (a * a + b * b); transform.position = new Vector3(transform.position.x, transform.position.y + c / 2, transform.position.z);

Nu går det alldeles, alldeles för snabbt. Jag ser heller inte vart jag gjort för fel i Pythagoras satsen. Känns ju mest logiskt att använda den formeln men på något sätt inte, får ut ett allt för stort värde liksom.

Roten ur? Kan inte Unity men det borde finnas någon funktion som heter typ sqrt eller liknande...

c*c = (a * a + b * b)
c = sqrt(a * a + b * b)

EDIT1: Google is your friend: http://docs.unity3d.com/ScriptReference/Mathf.Sqrt.html

Visa signatur

|| ASrock Z77E-itx || MSI HD6950 Twin Froster III Power Edition || i5 3570K @ 4,2 GHz || Corsair VENGEANCE LP 8GB (2x4096MB) 1600Mhz || 128 Gb Samsung 830-serie SSD || be quiet! Pure Power L8 530W || Inklämt i Cooler Master Elite 120 advanced

Permalänk
Medlem
Skrivet av Criuzer:

Roten ur? Kan inte Unity men det borde finnas någon funktion som heter typ sqrt eller liknande...

c*c = (a * a + b * b)
c = sqrt(a * a + b * b)

EDIT1: Google is your friend: http://docs.unity3d.com/ScriptReference/Mathf.Sqrt.html

Hmm, går fortfarande för snabbt. Ser koden rätt ut?

float a = target.position.x; float b = target.position.z; float c = Mathf.Sqrt(a * a + b * b); transform.position = new Vector3(transform.position.x, transform.position.y + c / 2, transform.position.z); Debug.Log("Pythagoras: " + c.ToString());

Det är något annat som är fel nu. Pythagoras sats ger ett värde som jag anser vara rätt nu. Tror det är något med denna biten av kod som är fel nu:

transform.position = new Vector3(transform.position.x, transform.position.y + c / 2, transform.position.z);

*EDIT*

Okej, känner mig rätt så dum nu. Klart jag inte kan skriva "transform.position.y + c / 2", det kommer ju göra så det ökas med hur mycket som helst då detta körs i Update loopen.

Permalänk
Medlem

Sådär, klurade ut det sista själv. Jag var som sagt lite dum och ökade min position med Pythagoras sats värdet för varje frame som gick, vilket resulterade i att kameran bara flög iväg. Nu sparar jag istället gamla värdet av Pythagoras från förra framen i "lastPosition" och tar sedan det nya värdet minus det gamla så jag får ut det exakta värdet jag ska öka min riktiga position med.

Tack för all hjälp!

private float a, b, c, lastPosition, finalPosition; void Start () { finalPosition = transform.position.y; } void Update () { a = target.position.x; b = target.position.z; c = Mathf.Sqrt(a * a + b * b) / 2; finalPosition += c - lastPosition; transform.position = new Vector3(transform.position.x, finalPosition, transform.position.z); Debug.Log("Pythagoras: " + c.ToString()); lastPosition = c; }