2017-10-14 22 views
0

私は、回転させることができる矢印を直線で動かしようとしています。私は使用するために正しい数式を思いつくことにいくつかの困難を抱えています。私はそれがおそらくサインとコサインを含むべきだと知っていますが、私はいろいろな設定を試していますし、動作するものを手に入れることができませんでした。ここで 回転した矢印を直線で移動する

が矢印で私のシーンの絵と弓だ
Here's a picture of my scene with the arrow and bow.

rotateNumberは、(1つの左回転用)-1のような整数、0(回転なし)、1(1つの右回転)、などがあります

rotateAngleはデフォルトで10度です。ここで

は、矢印を移動するためのコードです:

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; 
    } 

は、ここで矢印を描画し、変換するコードです:

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(); 
} 

答えて

0

あなたのコードはかなり正しい見えますが、あなたはの使用を排除する必要がありますrotateNumber。代わりに正の角度と負の角度を使用して回転させることができます。ここではエラーの原因がわかりません。 SinとCosは、正、負、またはゼロのいずれかの角度を確実に処理できます。 幸運を祈る!

+0

注:単位円と、正の角度が反時計回りである方法を考えてください。 – Hallsville3

+0

rotateNumberを削除するように変更しましたが、それでも動作しません。左に完全に向いている場合は機能し、そうでない場合は間違った方向に動きます。たとえば、回転しない場合、まっすぐ上に移動するのではなく、右に直接移動します。 – Suerg

+0

座標系の左上隅に(0,0)があります – Hallsville3

0

問題を見つけました。私は、回転が回転を狂わせていたので、回転する前に翻訳する必要があるときに回転した後に翻訳していました。

+0

素晴らしい!私はそれがWebglと途中で何かに釘付けになって翻訳といくつかの問題かどうか疑問に思っていた。私はあなたがそれを働かせてうれしいです – Hallsville3

+0

回転の後または前に回転を適用することは、変換を実現する2つの重要な方法です。しかし、最初のケース(回転後に変換:T * R)では、ローカル空間で平行移動と呼ばれるものを実行します。すなわち、行列軸に沿って、回転によって変更された軸。これはいつか非常に便利です。 –

関連する問題