Wiskunde achter een slide

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Roland684
  • Registratie: Januari 2000
  • Laatst online: 17-12-2023
Ik heb een stukje code waarbij ik tegen een object kan zeggen: "ik wil dat je over s milliseconden op positie x bent". Elke 40ms (25fps) wordt er vervolgens berekend op welke positie het object zich op dat moment moet bevinden.

Met behulp van een sinus word wat accelleratie/decelleratie bereikt zodat het object zich lekker vloeind verplaatst.

code:
1
2
3
4
5
6
7
8
Op hoeveel procent van de beweging zijn we nu:
percentage = ((nu - starttijd)/(i.eindtijde-i.startMoveTime))

Waar op de curve is dat:
curve = (0.5 - 0.5 * cos(percentage*PI))

Welke positie hoort daarbij:
positie = startpositie + curve * (eindpositie - startpositie)


Tot zo ver geen probleem.

Maar nu wil ik de code aanpassen zodat ik tijdens een beweging kan aangeven dat er toch naar een andere positie gegaan moet worden.
Dus dat ik (tegen een object op positie 0) zeg "zorg dat je over 9 seconden op positie 10 bent" maar al na 5 seconden zeg "zorg dat je over 5 seconden op positie 6 bent". Die tweede opdracht moet de eerste vervangen.

Vrees mijn MS-paint skills in dit voorbeeld ;)
Afbeeldingslocatie: http://www.klopt.nl/various/curve.gif

De sinus gaat nu niet meer op omdat het object op de starttijd al een snelheid (+richting) heeft.

Ik ben niet op zoek naar een volledig natuurkundig verantwoord physics-model, maar gewoon iets dat er een beetje vloeiend uit ziet.

Wat voor berekening zou ik hier op los kunnen laten?

Acties:
  • 0 Henk 'm!

  • TvdW
  • Registratie: Juli 2007
  • Laatst online: 30-08-2021
Je zou 2 variabelen kunnen nemen: speedIncrease en maxSpeed. Met speedIncrease maak je de snelheid hoger in de goede richting en maxSpeed zodat 'ie niet te snel gaat. Daarmee zou je een redelijke curve kunnen bereiken. Gebruik hiervoor geen percentages, hooguit om te bepalen hoe ver 'ie nog moet.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
TvdW schreef op donderdag 02 april 2009 @ 20:23:
Je zou 2 variabelen kunnen nemen: speedIncrease en maxSpeed. Met speedIncrease maak je de snelheid hoger in de goede richting en maxSpeed zodat 'ie niet te snel gaat.
maxSpeed? Voor een vloeiende beweging zou ik juist aan een max verandering denken. :P

{signature}


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Als je naast de positie waar je cursor is ook opslaat welke vector2 de cursor op dat punt heeft:

C#:
1
2
3
4
5
struct Cursor
{
   public int x,y;
   public Vector2 vector;
}


Dan kun je daarna een nieuwe functie maken die het volgende punt zoekt en probeert om niet te veel aan die vector per stapje te veranderen.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Voutloos schreef op donderdag 02 april 2009 @ 21:00:
[...]
maxSpeed? Voor een vloeiende beweging zou ik juist aan een max verandering denken. :P
max verandering? Bedoel je een maximum versnelling. Want max speed is natuurlijk net zo goed een maximum verandering - een maximum verandering in positie per frame. Maar ook voor de versnelling zou je weer een maximum verandering kunnen toepassen (oftewel de maximum jerk) voor écht vloeiende bewegingen ;)

Waar je ook aan zou kunnen denken is het gebruik van een spline zoals die van Hermite. Die kun je dan mooi initialiseren met de huidige positie en snelheid en de gewenste positie en snelheid door de control points goed te kiezen. Het nadeel is dat je dan echter een 2d curve hebt (dus je voert 'm een waarde t tussen 0 en 1 en daar komt dan een (x, y) uit), dus je moet elke iteratie een t zien te vinden die de juiste x geeft die bij je huidige tijd hoort. De bijbehorende y is dan de positie die je moet hebben. Aangezien de x en de y posities in feite 3e-graads functies zijn is de juiste t wel te vinden gegeven een x, en met die t kun je vervolgens je y uitrekenen.

[ Voor 5% gewijzigd door .oisyn op 02-04-2009 23:13 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22-09 10:35

Knutselsmurf

LED's make things better

Je zou een tweede functie er bij op kunnen tellen. Je eerste functie regelt dat de positie in 9 seconden van 0 naar 10 gaat.
Op t=5 komt er een nieuwe opdracht. Je maakt de oude functie 'af', maar telt daar een nieuwe functie bij op, die in 5 seconden van 0 naar -4 gaat.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Probeer je niet hetzelfde te bereiken wat mogelijk is met mootools Fx.Transitions: http://demos111.mootools.net/Fx.Transitions (gebaseerd op Robert Penner's easing equations)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Mootools transitions (met name de 'back' transition) doen wel ongeveer wat ie omschrijft maar staan geen transities tussen transities toe to my knowledge.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Roland684
  • Registratie: Januari 2000
  • Laatst online: 17-12-2023
Inderdaad, als je met Mootools een beweging onderbreekt, dan wordt het object heel abrubt gestopt en wordt de volgende beweging gestart alsof het object stil stond. Dat heb ik nu ook al, maar ziet er niet uit.

@TvdW: maar hoe bereik ik dan dat ik vast kan leggen over hoeveel tijd ik op de eindpositie ben?

@oisyn: klinkt veelbelovend, ga ik me in verdiepen
Een spline is waarschijnlijk perfect de berekening die ik zoek, maar misschien wel wat overengineered :)
Afbeeldingslocatie: http://www.klopt.nl/various/Filthy-Rich-Clients-SplineEditor.PNG

Een berekening als deze:
Afbeeldingslocatie: http://www.klopt.nl/various/864628f76d77bcef0ac3d5dcf255e8e0.png
is niet iets dat ik de laatste jaren nog ooit heb gedaan. Dat wordt even pusselen hoe het ook alweer zat.

Ik zit ook nog wat te denken aan een fixed accelleratie to 50% en daarna een fixed decelleratie. de kunst is nog even om uit te vinden wat dit max moet zijn en het zal niet in alle gevallen voldoen. de vraag is alleen of het er een beetje acceptabel uit zit.

@ knutselsmurf: Ik denk niet dat dat gaat werken aangezien de eerste berekening op een ander moment tot stilstand zal willen komen. (en wat nu als de tweede beweging ophoudt voor de eerste beweging dat eigenlijk had moeten doen?)

Acties:
  • 0 Henk 'm!

  • Roland684
  • Registratie: Januari 2000
  • Laatst online: 17-12-2023
Ik heb toch iets eenvoudigers bedacht.

Ik laat de eerste berekening wel doorlopen (maximaal tot het einde van de tweede berekening) en neem in de overlappende periode een gemiddelde van die twee.
Dat gemiddelde is ook weer een (met een sinus) gewogen gemiddelde, hoe later in de overlappende periode, hoe zwaarder de tweede berekening telt.
Afbeeldingslocatie: http://www.klopt.nl/various/curve2.gif

Maar ik denk dat ik het bij twee berekeningen houd, als er een derde bij komt, heeft de eerste maar pech ;)
Pagina: 1