2017-04-09 4 views
0

나는 일정한 속도로 움직이는 몸체를 가진 스프라이트를 쓰고있다. 그래서 시간 단계에서 다음과 같이 진행됩니다 Box2D에서 방향을 변경할 때 속도를 업데이트하는 방법은 무엇입니까?

const v = body.getLinearVelocity(); 
v.normalize(); 

body.setLinearVelocity(v * speed); 

는 그럼 난의 mouseClicked 이벤트를 수신하고 싶은 스프라이트 그에 따라 새로운 방향으로 이동합니다.

const point = /* new Point on screen */ 
const rotation = Math.atan2(point.y - player.y, point.x - player.x); 
body.setTransform(body.getPosition(), rotation); 

을하지만 내 스프라이트가 새로운 방향으로 켜지지 않습니다 마우스를 클릭 할 때, 그것은 같은 일정한 속도로 이전 방향으로 이동 :

내가의 mouseClicked 이벤트 처리기에서 뭐하는 거지입니다 . 몸의 각도가 매 단계마다 바뀌는 것을 볼 수 있습니다. 그것은 단지 새로운 방향으로 나아 가지 않을 것입니다.

내 스프라이트를 어떻게 바꿔서 Box2D의 새로운 방향으로 옮길 수 있습니까?

답변

0

신체가 실제로 움직이기 때문에 applyForce() 및/또는 applyImpulse()을 사용하는 것이 더 좋습니다. setTransform()은 아무런 움직임없이 새 변형에 "빔"합니다.

B2D는 그 중 apply* 방법을 사용할 때 각속도를 포함한 모든 속도를 계산합니다. 결과는 사실적인 시뮬레이션 결과입니다. 현실적이지 않은 일이 발생하면 setTransform 또는 setLinearVelocity과 같은 것을 사용해야합니다. 당신의 몸은 colision의 측면에서 진짜처럼 행동해야하며, 규정, 정기적으로,이 원하는 새로운 장소로 이동하기 위해 필요한 힘을 계산해야하는 경우

+0

죄송합니다. 나는 아직 새로운 변환에 "빔"을 적용한다는 것을 이해하지 못합니다. 나는 점차적으로 속도로 움직이기를 원할 때'applyForce()'/'applyImpulse()'를 사용하는 것이 낫다는 것을 이해한다. 그러나 나는 그것이 시작과 영원히 멈추지 않거나 시작하는 일정한 속도로 움직이기를 원한다. . 내 문제는 원래 속도를 유지하면서 새로운 방향으로 이동하는 방법입니다. – newguy

+0

아마도 "빔"이라고 말하는 대신 "텔레포트"라고 말해야합니다. body.setTransform'은 몸체를 집어 새 위치에 놓습니다. –

0

속도는 즉시가 업데이트를 할 수있다 b2Body::SetLinearVelocity 방법으로 전화하십시오. 이것은 잠재적으로 신체의 속도의 크기 및/또는 방향을 변화시킬 수 있습니다.

  1. 이 (b2Body::GetLinearVelocity 전화) 신체의 현재의 선형 속도를 얻기 :

    은 신체의 여행의 방향을 변경합니다.

  2. 반환 된 b2Vec2의 로컬 복사본을 새로운 제목으로 회전하십시오.
  3. 새로운 선 속도를 회전 된 b2Vec2 (b2Body::SetLinearVelocity)으로 설정하십시오.

그러나 실제 세계에서는 things with mass basically can't instantaneously change their velocities입니다. 스프라이트가 질량을 가지면 물리학의 관점에서 볼 때 스프라이트의 속도를 이렇게 변경하는 것이 현실적이지 못합니다. 질량이있을 경우 phillip에서 설명한 것처럼 applyForce 또는 applyImpulse은 속도를 변경하는 데 필요한 메서드입니다 (물리학 관점에서 볼 때 더 현실적입니다).

관련 문제