Bra sätt att implementera kast m.h.a. mushastighet? (C++/OGL)

Permalänk
Medlem

Bra sätt att implementera kast m.h.a. mushastighet? (C++/OGL)

Hej hej!

Satt & pillade lite med ett program där jag ska kunna kasta objekt i musens riktning mha mushastighet, då är frågan hur jag ska beräkna hastigheten för optimal känsla, precisionen bör vara riktigt bra. Då det är i 3D så använder jag mig nu endast av två olika objekt positioner (x, y led) & beräknar skillnaden (objektet man håller i). Dock med denna lösning så kan man inte lita på att objektet kommer ut med rätt hastighet, ganska ofta får det en mycket låg hastighet. Funderade på en vector med några fler samples, men jag vill undvika slangbellaeffekter och kastning åt fel håll/riktning om man gör korta drag...

Beräkningarna sker ca 60 gånger/sek, dock vet man ju inte hur ofta användarens mus uppdateras... kör nu med en 1000hz 5600dpi mus och vet inte riktigt hur många riktiga rapporteringar som sker till programmet... har musacceleration avaktiverat så kan vara att musen rapporterar lite stötigt (som jag drar) och därav hastigheten blir låg på objektet.

Någon som har ideer?
Obs, det är viktigt att objekten får närmast möjliga hastighet som musdraget!

mvh

Permalänk
Medlem

Borde det inte gå att ta skillnaden mellan de två senaste muspositionerna som en vektor, och använda den som ny velocity på objektet?

Ett problem som kan uppstå är om du inte tar hänsyn till hur många uppdateringar som gjorts mellan punt A och punkt B. Skapar man en vektor mellan dessa som man använder måste man dela magnituden på antalet uppdateringar.

Använder du en fysikmotor bör det inte vara så svårt att beräkna en hyffsad vektor som man sedan applicerar som en force på objektet, så tar fysikmotorn hand om resten. Då får du även med accelerationen.

Hur uppdateras objektets position?

Edit: hur blir det om du summerar ihop alla vektorer mellan muspositionerna varje uppdatering, och sedan delar magnituden på antalet uppdateringar? Vill du sen ha högre hastigthet är det bara att skala upp (eller ner) vektorn.

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Objektet har en egen hastighet/kraft (också en friktion men det är oviktigt), dvs en egen transformationsnod i en scengraf (objekt), när jag håller i objektet så sätter jag en tvingad hastighet åt en riktning som bestäms mha musens riktning & hastighet, därav den här beräkningen som behöver vara hyffsad.

Jag får ta & testa hur det blir med ett par positioner och medelvärde som du nämnde, vill dock inte ha så många (typ max tre) då man kan få problem vid snabba rörelser i något motsatt riktning, frågan är hur man ska göra om man redan drar musen i en hastighet sen grabbar objektet samtidigt :S Får helt enkelt testa om det är så jag vill ha...

Edit: i princip tar jag nu två positioner och beräknar en "vektor" som läggs som hastighet på objektet, vilket är för lite. Dock är det inte direkt muspositioner eftersom det är 3d, utan objektpositioner eftersom man har perspektivvy och objektet kan ligga vart som helst i en 3drymd och hastigheten på objektet blir snabbare i tex x/y-led om det ligger längre bort om det skall följa musen. Men vi kan kalla det muspositioner eftersom det är musen som styr

Tack för svar!

Permalänk
Medlem

Prova att i varje musförflyttning vikta ny beräknad hastighet med den gamla. Prova olika värden på e mellan 0.0 & 1.0

estimatedHastighet = ****beräkna vid varje musförflyttning****
hastighet = estimatedHastighet* e + (1.0 - e) * hastighet ;

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem

Hm, det kanske kunde vara nått, det blir väll bättre precision om man drar åt ett håll, men drar man sedan fort åt andra hållet går det väll åt pipan?

Edit, i vilket fall bör det bli bättre än att bara beräkna medel på några samples... vilket kan ju förvränga riktningen samt skapa negativ hastighet lättare om man drar musen fort i motriktning.

Permalänk
Medlem

Okey, har pillat på den här musgrejen ganska länge nu, det verkar ok så länge man rör på musen, saktar in, drar fortare, släpper osv, grejen är när jag drar med musen, sedan stannar plötsligt och sen släpper efter ett tag, då flyger ju objekten iväg med uträknad hastighet, jag har alltså ingen feed när musen står stilla, dvs när inga mouse events droppar in. Testade att lägga till så den tar bort första av dessa mouse samples varje loop, också att adda 0-vektor, grejen är att jag inte vet vilken takt detta skall ske i, som sagt, loopen uppdateras ca 60 gånger/sek (max).

Känns som det snurrar i skallen, väldigt mycket kod för musklick, dragningar och allt möjligt i detta program :S

Några ideer?

while(true){ if (mousemotionevent){ mouse.addsample(x,y) } }

Någon annanstans anropar jag typ mouse.getvelocity som har tex max 5 samples i nån lista som beräknar nått slags medel, när nya sätts in tas det äldsta bort om listan är full. Events sker ju inte så ofta som loopen, men man måste ju sänka hastigheten när musen står stilla... hm, nu kom jag ju på ett riktigt fulsätt, tror jag, som visserligen inte fungerar helt korrekt, om fler avläsningar blir samma (inte i mouse sampler klassen) så struntar man i att lägga på hastigheten..

Permalänk
Medlem

Om du vill fa med i din berakning att musen star still, sa kan du inte anvanda events fran musen (om den inte skickar events hela tiden, men da ar meningen med events borta). Du far lasa musens position i varje iteration:

vector last, current, diff; while (1) { current = mouse.position(); diff = current - last; mouse.addsample(diff.x, diff.y); last = current; }

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Okey, tackar för era svar hittills, har lyckats få det att fungera hyfsat nu...
Om jag får mer problem så skriver jag här (har inte implementerat att lägga större vikt på senaste, inte rätt struktur än)