2017-10-14 11 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의 각도를 확실히 처리 할 수 ​​있습니다. 행운을 빈다!

+0

참고 : 단위 원과 양각이 반 시계 방향 인 방법을 고려하면 리프트를 직접 가리키는 것으로부터 시작해야합니다. – Hallsville3

+0

rotateNumber를 제거하기 위해이를 변경했으며 여전히 작동하지 않습니다. 왼쪽을 완전히 가리키면 작동하고 그렇지 않으면 잘못된 방향으로 이동합니다. 예를 들어 회전이 없으면 직선 이동 대신 오른쪽으로 직접 이동합니다. – Suerg

+0

좌표계에서 왼쪽 위 모서리의 (0,0)입니다. – Hallsville3

0

문제를 발견했습니다. 나는 회전이 회전을 엉망으로 만들면서 회전하기 전에 번역 할 필요가있을 때 회전 후에 번역을하고있었습니다.

+0

좋아요! Webgl과 함께 진행되는 과정에서 번역본이 엉망이되어서 어떤 문제가 있는지 궁금합니다. 나는 당신이 그것을 작동하게되어 기쁘다. – Hallsville3

+0

변환을 적용하기 전이나 후에 번역을 적용하는 것은 변환에 대한 두 가지 중요한 방법이다.그러나 첫 번째 경우 (회전 후 변환 : T * R)에서는 로컬 공간에서 변환이라고 부르는 것을 수행합니다. 즉, 행렬 축을 따라 회전에 의해 수정 된 축을 말합니다. 이것은 때로는 매우 유용합니다. –