2017-10-14 21 views
0

J'essaie de déplacer une flèche, qui pourrait être tournée, en ligne droite. J'ai de la difficulté à trouver la bonne formule à utiliser. Je sais que cela devrait probablement impliquer le sinus et le cosinus, mais j'ai essayé différentes configurations et je n'ai pas réussi à obtenir quelque chose qui fonctionne.Déplacement d'une flèche pivotée en ligne droite

Voici une photo de ma scène avec la flèche et l'arc
Here's a picture of my scene with the arrow and bow.

rotateNumber est un entier comme -1 (pour 1 rotation à gauche), 0 (pas de rotation), 1 (1 rotation à droite), etc.

rotateAngle est de 10 degrés par défaut.

Voici le code pour déplacer la flèche:

if (arrowMoving) { 
     var rAngle = rotateAngle * rotateNumber; 
     var angleInRad = rAngle * (Math.PI/180); 
     var stepSize = 1/20; 
     arrowX += stepSize * Math.cos(angleInRad); 
     arrowY += stepSize * Math.sin(angleInRad); 
     DrawArrowTranslate(arrowX, arrowY); 
     requestAnimFrame(render); 
    } else { 
     DrawArrow(); 
     arrowX = 0; 
     arrowY = 0; 
    } 

Voici le code pour dessiner et traduire la flèche:

function DrawArrowTranslate(tx, ty) { 
    modelViewStack.push(modelViewMatrix); 

    /* 
    var s = scale4(0.3, -0.7, 1); 
    var t = translate(0, -4, 0); 
    */ 
    var s = scale4(0.3, -0.7, 1); 
    var t = translate(0, -5, 0); 
    var t2 = translate(0 + tx, 1 + ty, 0) 

    // rotate takes angle in degrees 
    var rAngle = rotateAngle; 

    var r = rotate(rAngle, 0, 0, 1); 

    var m = mult(t, r); 
    var m = mult(m, t2); 
    modelViewMatrix = mat4(); 
    modelViewMatrix = mult(modelViewMatrix, m); 
    modelViewMatrix = mult(modelViewMatrix, s); 

    /* 
    // update bounding box 
    arrowBoundingBox.translate(0, -5); 
    arrowBoundingBox.rotate(rAngle); 
    arrowBoundingBox.translate(0, 1); 
    arrowBoundingBox.scale(0.3, -0.7); 
    */ 

    gl.uniformMatrix4fv(modelViewMatrixLoc, false, flatten(modelViewMatrix)); 
    gl.drawArrays(gl.LINE_STRIP, 1833, 4); 
    gl.drawArrays(gl.LINE_STRIP, 1837, 4); 

    modelViewMatrix = modelViewStack.pop(); 
} 

Répondre

0

Votre code semble tout à fait correct, mais vous devez éliminer l'utilisation du rotateNumber. Vous pouvez simplement utiliser des angles positifs et négatifs pour la rotation, en éliminant ce que j'imagine être la cause de l'erreur ici. Sin et Cos peuvent certainement gérer des angles de toute magnitude positive, négative ou nulle. Bonne chance!

+0

Remarque: Considérez le cercle de l'unité et les angles positifs dans le sens inverse des aiguilles d'une montre, en commençant directement par le point de rupture. – Hallsville3

+0

Je l'ai changé pour éliminer rotateNumber et ça ne marche toujours pas. Cela fonctionne si vous pointez complètement vers la gauche, sinon il se déplace dans la mauvaise direction. Par exemple, sans rotation, il se déplace directement vers la droite plutôt que vers le haut. – Suerg

+0

Dans votre système de coordonnées est (0,0) dans le coin supérieur gauche – Hallsville3

0

J'ai trouvé le problème. Je traduisais après la rotation quand j'avais besoin de traduire avant de tourner, car la rotation gâchait la traduction.

+0

Super! Je me demandais si c'était un problème avec la traduction qui a été bousillée par quelque chose en cours de route avec Webgl. Je suis content que vous l'ayez fait fonctionner – Hallsville3

+0

L'application de la traduction après ou avant la rotation est deux manières valides d'accomplir la transformation.Mais dans le premier cas (traduire après rotation: T * R), il effectue ce que l'on appelle une translation dans l'espace local, soit: le long des axes matriciels, les axes qui ont été modifiés par la rotation. C'est parfois très utile. –