2012-01-15 4 views
9

나는 플레이어가 손가락으로 보트를 드래그하는 게임을 만들고 있습니다. Box2D를 게임의 물리학 측면에 사용하고 있습니다. 특히 터치 이벤트가 보트를 드래그하도록 터치 이벤트를 보트에 첨부하려면 b2MouseJoint을 사용하고 있습니다.Box2D의 방수 시뮬레이션

그러나 끌고있는 동안 보트가 움직이는 방식은 사실적이지 않습니다. 그것은 실제 세계에서 보트가 그 길이를 따라 움직일 수 있고 보트 운동의 방향을 바꾸기가 어려운 내수성이있는 모든 방향으로 간단히 끌 수 있습니다. 따라서 보트의 움직임을 현실적으로 만들기 위해 내수성을 시뮬레이션 할 수있는 방법이 필요합니다.

Box2D에서 시뮬레이션 할 수 있습니까? 선형 댐핑과 각도 댐핑은 단순히 보트를 움직이기 어렵게 만들지 만 보트를 한 방향으로 쉽게 움직이기를 원하며 방향 변경에 저항해야합니다.

P.S.이 질문에 대한 내 코드를 게시 할 필요는 없지만 코드 발췌 내용을보고 싶다면 알려주십시오.

+2

[드래그 방정식] (http://en.wikipedia.org/wiki/Drag_equation)을 사용해 보았습니까? 단면적 항 * A *는 보트의 속도에 상대적인 방향에 따라 달라지며, 이는 원하는 것을 수행해야합니다. 그리고 당신은 언제나 * A *를 값싼 발견 적 방법으로 평가할 수 있습니다. – Rahul

+0

@Rahul, 힌트를 주셔서 감사합니다. 나는 근사법을 사용하여 코드에 항력 방정식을 추가했다. (속도와 보트 각도를 참조 영역과 함께 사용하는 것과 같다.) 최신 코드에서 시뮬레이션 한 약간의 방수량을 볼 수 있지만 몇 가지 미친 움직임이있는 것 같다. 배는 세계 국경과 충돌합니다. 나는 여기서 더 이상의 도움을 요청하기 전에 잘못된 점을 이해하려고 노력하고있다. 다시 한번 힌트를 주셔서 감사합니다. – Lukman

+0

건방진 해결 방법은 보트 주변의 공간을 채우기 위해 작은 질량의 매우 작은 원형 몸체를 많이 만드는 것입니다. 나는 물리학이나 처리 능력 (아직)의 측면에서이 생존력을 테스트하지 않았기 때문에 이것이 적절한 답으로 제출되지는 않습니다. – Andrey

답변

1

필자에게는 사소한 의견이긴하지만 많은 입자가 필요하므로 아마도 약간의 처리 능력이 필요할 것입니다. 충돌로 많은 작은 원을 만들 수는 있지만 그려서는 안됩니다. 따라서 물의 시뮬레이션 효과는 얻지 만 물은 얻지 못할 것입니다. 서클의 크기에 따라 그들 중 몇 명이 당신을 결정할 수 있으며, 화면을 채울 필요가 있으므로 귀하의 실적도 결정해야합니다. 내가 해킹 해독 솔루션을 조금 알고 있지만 그것은 가치가있을 수 있습니다. 좋은 성능과 역 동성과 같은 유체를 허용하는 서클의 크기에 맞는 행복한 매개체를 찾을 수 있습니다.

죄송합니다. 누군가 이미이 문제를 제안한 것으로 보입니다. 죄송합니다.

+0

불행히도, IMO, 그 입자들은 전 세계에 존재하는 다른 물리적 인 물체를 간섭 할 것이므로이 hackish 기술을 사용하지 않을 것입니다. 생각해 줘서 고마워. – Lukman

+0

@Fred 나는 그걸 가지고 노는 것을 끝내었고, 균형을 올바르게 잡는 것은 막대한 문제였습니다. 서클이 너무 커서 모든 움직임을 방해하거나, 모든 것이 내 프로세서에 너무 부담 스러웠습니다. JS 포트에서 시도해 보았습니다. 보통 조금 느린 것 같습니다. – Andrey

2

실제로 이것은 사소한 일이 아니므로 '완전한'대답이 조금만 희망적입니다. Here은 box2d에서 자동차의 예에 대한 링크입니다. 그 신사의 demoreel (릴의 세 번째 데모가 가장 관련성이 있음)을보고 그의 소스 코드를 살펴보십시오. 그의 시뮬레이션은 당신이 성취해야 할 것보다 조금 더 발전했기 때문에 그것이 어떻게 작동 하는지를 이해할 수 있다면 더 간단한 버전을 만드는 데 아무런 문제가 없을 것입니다.

dougk16의 box2d 확장에는 많은 코드가 있습니다. 따라서 자동차 작동 방식을 정확하게 파악하기가 어려울 수 있습니다. 여기 간단한 출발점이 있습니다 : 앞뒤로 움직일 수있는 몸체를 시뮬레이션하고 싶을 때. 그래서 이것은 배의 몸체의 현재 방향에서 앞으로 또는 뒤로 펼쳐지는 힘이며 시체를 왼쪽이나 오른쪽으로 돌리는 한 개의 힘입니다. 이것은 꽤 멋진 것을 얻기 위해 필요한 것입니다. 여기에 적당한 장소를 시작하는 것입니다 일부 의사 코드는 다음과 같습니다

if(needs_to_turn) 
{ 
    // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user 
    body.ApplyTorque(turn_direction * boat_torque); 
} 

if(needs_to_move) 
{ 
    // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user 
    body.ApplyForce(facing_vector * boat_force); 
} 

내가 다른 link 내 대답은, 관련 튜토리얼이 시간을 겁니다. dougk16의 액션 스크립트만큼 멋지지 않지만 튜토리얼 형식이므로 더 유용 할 것입니다.

관련 문제