2013-07-12 4 views
0

많은 예제를 보았지만 지금까지 아무 것도 작용하지 않았습니다. 원이 mousemove에서 회전하고 원 중심으로 회전하기를 원하기 때문에 지금까지 문제가 없습니다. 그러나 무대의 절반을 통과하면 180도 뛰게됩니다. 무대의 절반을 지나기까지 모든 것이 잘되어있어서 분명히 뭔가 빠져 있습니다. Math.atan2는 나에게 오류를 준다 : 원이 무대의 (0,0)으로 점프한다.마우스 키네틱 js로 돌림

정말 도움이되도록 도와주세요.

미리 감사드립니다.

new Kinetic.Tween({ 
    node: cGrad1, 
    x: stage.getWidth()/2, 
    y: stage.getHeight()/2, 
    duration: 1, 
    opacity:1, 
    easing: Kinetic.Easings.EaseInOut 
}).play(); 

clickO.on('mousemove', function() { 
    for(var n = 0; n < 16; n++) { 
    var shape = cGradlayer1.getChildren()[n]; 
    var stage = shape.getStage(); 
    var mousePos = stage.getMousePosition(); 
    var x = mousePos.x - shape.getPosition().x; 
    var y = mousePos.y -shape.getPosition().y ; 
    var degree = (Math.PI)+(Math.atan(y/x)); 

    shape.setAttrs({ 
     rotation: degree 
    }) 
    cGradlayer1.draw() 
    } 
}) 
+0

미안하지만 당신이 정확히 무엇을하려하는지 이해하는 데 여전히 어려움이 있습니다. 무엇이 잘못되었는지 설명하기 위해 jsfiddle을 설정할 수 있습니까? click0 이상으로 마우스를 움직이면 어떻게 될까요? 모든 모양이 마우스 포인터가있는 곳을 향해 회전해야합니까? – projeqht

+0

clickO는 클릭 위치를 얻기위한 투명 레이어입니다. 모든 모양은 같은 지점으로 회전해야합니다. 나는 설치를 시도했다 [link] (http://jsfiddle.net/koyotee/3yTPB/6/) 당신이 도울 수 있다면 그것은 좋을 것이다. 작동 자바 스크립트 및 CSS 예제가 많이 있지만 내가 kinetic js에서 일할 수 없습니다. – koyotee

답변

0

당신은 다음과 같이 트윈의 x와 y 위치를 설정해야 할 수 있습니다

new Kinetic.Tween({ 
    x: mousePos.x, 
    y: mousePos.y, 
    node: shape, 
    rotation: degree, 
    easing: Kinetic.Easings.EaseInOut, 
    duration:1, 
}).play(); 

는 참조 http://www.html5canvastutorials.com/kineticjs/html5-canvas-stop-and-resume-transitions-with-kineticjs/

+0

음.이 모양이 마우스 위치에 트윈한다고 생각합니다. 나는 그것이 제 위치에 머무르고 클릭 된 위치로 회전하기를 원합니다. 내 문제는 그것이 회전하는 방식이 이상하다는 것입니다. 그것이 180도 같아서 지나갈 때 점프. 나는 약간의 fomurlas를 시험해 보았다. 그러나 non는 올바르게 일하는 것처럼 보인다. 그러나 어쨌든 귀하의 답변 주셔서 감사합니다! – koyotee

2

이 자습서를 참조하십시오 그럼이 내가 해낸되며, 잘하면 그것은 당신이 찾고있는 것과 가깝습니다 : jsfiddle

기본적으로 회전시키고 자하는 각도를 계산하려면 두 점을 저장해야합니다 :

  1. (가) 마우스의 좌표 모양의 원점 (중심 좌표)
  2. 당신이, 당신은 삼각 함수의 조금으로 두 점 사이의 각도를 계산 할 수있는 일단

을 클릭 (만약 내가 정확하지 않다면 죄송합니다. Trigonometry는 나의 강한 소송이 아닙니다.) 두 점 (dx, dy) 사이의 거리를 계산 한 다음 trig 수식을 사용하여 각도를 각도로 찾으십시오.

layer.on('click', function() { 
    var mousePos = stage.getMousePosition(); 
    var x = mousePos.x; 
    var y = mousePos.y; 
    var rectX = rect.getX()+rect.getWidth()/2; 
    var rectY = rect.getY()+rect.getHeight()/2; 
    var dx = x - rectX; 
    var dy = y - rectY; 
    var rotation = (Math.atan2(dy, dx)*180/Math.PI+360)%360; 

    var rotateOnClick = new Kinetic.Tween({ 
    node: rect, 
    duration: 1, 
    rotationDeg: rotation, 
    easing: Kinetic.Easings.EaseInOut 
    }); 
    rotateOnClick.play(); 
}); 

편집 :

내 바이올린을 업데이트 한 (나는이 같은 결론에 도달) 아래 수집 된 정보를 기반으로 : jsfiddle

마르크이 코멘트에 아래에 언급 한 바와 같이, KineticJS는 "강제 시계 방향 플래그"를 지원하지 않으므로 360도지나 시계 방향으로 회전하거나 0 시계 반대 방향으로 회전 할 때 항상 회전이 점프됩니다. 그렇지 않으면 회전이 제대로 작동한다는 것을 알고 있습니다.

그래서 수동으로 우리가 고려해야 할 이가지 경우가이 문제를 해결하려면 :
  1. 우리가 시계 방향으로 360지나 회전

    .
  2. 시계 반대 방향으로 0을 지나칠 때.

그리고 이것이 내가 회전 여부에 대응하기 위해 여부를 계산하는 데 사용되는 수학입니다 :

var currentDeg = rect.getRotationDeg(); 

var oneWay = rotation - currentDeg; 
var oneWayAbsolute = Math.abs(rotation - currentDeg); 
var otherWay = 360-oneWayAbsolute; 

if (otherWay < oneWayAbsolute) { 
    //Take the other way 
    if (oneWay > 0) { 
     //Clicked direction was positive/clockwise 
     var trueRotation = currentDeg - otherWay; 
    } else { 
     //Clicked direction was negative/counter clockwise 
     var trueRotation = currentDeg + otherWay; 
    } 
} else { 
    //Take the clicked way 
    var trueRotation = rotation; 
} 

은 기본적으로 우리가 회전하는 방법을 알아 내야 할을, 각도도를 비교하여 어느 방향 것의 더 가까이에, 우리가 클릭 한 방향으로, 또는 그 반대 방향으로.우리가 otherWay이 (음수) 또는 시계 방향으로 우리가 클릭 방향이 시계 반대 방향에 있다면 우리가 볼 필요는 currentDeg에 가까운이었다 (양의) 방향, 우리가 갈 수있는 otherWay 방향을 설정하는 것이 결정되면

반대 방향으로.

그리고 rotationDegonFinish 이벤트를 정규화 할 수 있습니다.

var rotateOnClick = new Kinetic.Tween({ 
    node: rect, 
    duration: 1, 
    rotationDeg: trueRotation, 
    easing: Kinetic.Easings.EaseInOut, 
    onFinish: function() { 
     trueRotation = (trueRotation+360)%360; 
     rect.setRotationDeg(trueRotation); 
     layer.draw(); 
    } 
}); 
+0

꽤 가깝습니다. 그것은 또한 180- "점프"를하지만 그것은 매우 좋고 무엇을 찾고있는 가깝습니다. 당신이 슬프지만 정확하지는 않지만 답변에 많은 감사를드립니다! – koyotee

+0

잘하면 당신은 그것에서 벗어나 완벽하게 할 수있어! :) 나는 "180 점프"를 알아 차리지 못했지만 너무 많이 테스트하지는 않았다. 그것을 파악하고 여기로 돌아와 답변을 게시하고 승인 된 것으로 표시하면 우리는 당신이 일을 어떻게 처리했는지 알고 싶어합니다. 다른 것을 찾으면 여기에 알려 줄 것입니다 : P – projeqht

+1

+1 @projeqht : 답변에 "장애"가 보이지 않았습니다 ...하지만 회전 각도를 정규화 할 수있는 경우를 대비하여 : var rotation = (Math.atan2 (dy, dx) * 180/Math.PI + 360) % 360; – markE