Problem med mushastighet i Javascript.

Permalänk
Medlem

Problem med mushastighet i Javascript.

Hejsan! Jag har suttit några timmar och gnuggat idiotknölen över ett problem jag har med Javascript. Jag försöker räkna ut vilken hastighet musen har när man släpper musknappen.

Sättet som jag gör det på nu är att när eventet "mousemove" avbryts när man släpper musknappen, alldeles efter kollar man var musen befinner sig och subtraherar den föregående positionen med den nya.
Det fungerar alldeles utmärkt i Chrome, men Firefox verkar ha lite problem med det och båda får samma värde.
Jag petar in lite kod här nedanför ifall någon är intresserad.

All hjälp uppskattas!

document.addEventListener("mouseup", function(ev) { var rotationSpeedX = ev.screenX - lastX; var rotationSpeedY = ev.screenY - lastY; if (mouseMoved == 1) { interval1 = setInterval(function(late) { if (rotationSpeedX > 0) { self.RenderManager.currentRotationX = self.RenderManager.currentRotationX + rotationSpeedX; if (rotationSpeedX <= 0) clearInterval(interval1); rotationSpeedX = rotationSpeedX + -0.2; rotationSpeedX = rotationSpeedX * 0.95; } if (rotationSpeedX < 0) { self.RenderManager.currentRotationX = self.RenderManager.currentRotationX + rotationSpeedX; if (rotationSpeedX >= 0) clearInterval(interval1); rotationSpeedX = rotationSpeedX + 0.2; rotationSpeedX = rotationSpeedX * 0.95; } self.RenderManager.Frame(); }, 20); interval2 = setInterval(function(late) { if (rotationSpeedY > 0) { self.RenderManager.currentRotationY = self.RenderManager.currentRotationY + rotationSpeedY; if (rotationSpeedY <= 0) clearInterval(interval2); rotationSpeedY = rotationSpeedY + -0.2; rotationSpeedY = rotationSpeedY * 0.95; } if (rotationSpeedY < 0) { self.RenderManager.currentRotationY = self.RenderManager.currentRotationY + rotationSpeedY; if (rotationSpeedY >= 0) clearInterval(interval2); rotationSpeedY = rotationSpeedY + 0.2; rotationSpeedY = rotationSpeedY * 0.95; } self.RenderManager.Frame(); }, 20); } }, false); document.addEventListener("mousemove", function(ev) { var deltaX = ev.screenX - lastX; deltaX = deltaX * - 1; lastX = ev.screenX; self.RenderManager.currentRotationX -= deltaX; var deltaY = ev.screenY - lastY; deltaY = deltaY * - 1; lastY = ev.screenY; self.RenderManager.currentRotationY -= deltaY; while (self.RenderManager.currentRotationX < 0) self.RenderManager.currentRotationX += 360; if (self.RenderManager.currentRotationX >= 360) self.RenderManager.currentRotationX = self.RenderManager.currentRotationX % 360; while (self.RenderManager.currentRotationY < 0) self.RenderManager.currentRotationY += 360; if (self.RenderManager.currentRotationY >= 360) self.RenderManager.currentRotationY = self.RenderManager.currentRotationY % 360; self.RenderManager.Frame(); return true; }, false);

Visa signatur

Dur ru - dum.

Permalänk
Medlem

Hej,
jag skulle föreslå att du följer efter mushastigheten hela tiden. Så initiera hastigheten till noll, vid varje move-event så kan du uppdatera hastigheten enligt:
velocity = velocity*alpha + (1-alpha)*measurment;
där velocity är din skattning på hastigheten och measurment är din nyuträknade hastighet ( current_position - old_position ) och sist alpha som är en vikt hur mycket du vill att din skattning ska bero på gamla eller nya värden. alpha ska vara mellan 0 och 1, nära 0 så litar du mest på nya mätvärden. Nära 1 så litar du mest på gamla mätvärden.

Med denna metod så kommer du inte få så mycket problem med eventuella ryck precis då man släpper musen, och eftersom du har en skattning hela tiden så kommer det funka även om du får två nära identiska positioner på varandra.

Ett annat sätt är att du spar undan positionen för låt säga 5 event tidigare och räknar ut hastigheten med denna position istället för positionen från förra eventet...

Lycka till och visa gärna hur det blir

Visa signatur

weeeee

Permalänk
Medlem

Tack så mycket! Jag använde en metod av din idé så fungerade det klockrent. Det verkar bete sig aningen olika beroende på webbläsare ändå, men det spelar inte så stor roll.
Det jag pillar med används lite här och var, du kan testa det på bl.a. http://anticitizenone.net/about och http://damn.peragro.org/
Är ganska nytt och man kan inte just göra något förutom att snurra på saker än, men i stort sett allt som kör WebGL är väl nytt och inte så färdigt än så länge.

Visa signatur

Dur ru - dum.