2D 스프라이트의 회전력 계산


35

누군가 다음 시나리오를 계산하는 우아한 방법이 있는지 궁금합니다.

나는 (n) 개의 사각형, 임의의 모양의 객체를 가지고 있지만, 그것들은 모두 사각형 인 척합니다.

우리는 중력을 다루지 않으므로 우주에서 물체를 위에서 아래로 생각하십시오. 특정 사각형에서 물체에 힘을 가하고 있습니다 (아래 그림 참조).

힘을 가함

적용되는 위치에서 적용되는 힘을 기준으로 회전 각도를 어떻게 계산합니까? 중앙 정사각형에 적용하면 직선으로 진행됩니다. 중앙에서 멀어 질수록 어떻게해야합니까? 회전 속도는 어떻게 계산합니까?


물체가 회전하면서 시간이 지남에 따라 어떤 일이 일어나고 싶습니까? 항상 같은 방향으로 같은 사각형에 적용됩니까? 개체의 가장자리를 따라 "스윕"됩니까? 제공하는 정보를 사용하면 해당 회전력 (일명 토크) 만 얻을 수 있지만 그로부터 회전 속도를 추론하려면 힘이 아닌 임펄스를 제공하거나 방법을 설명해야합니다. 시간이 지남에 따라 힘이 가해 져야한다.
sam hocevar

솔직히 이것은 기본 물리학의 문제이기 때문에 아마도 physics.stackexchange.com에 더 좋은 질문 일 것입니다.
BlueRaja-대니 Pflughoeft

답변:


44

토크를 계산하려고합니다. 토크는 적용된 힘 F, 적용 지점 및 물체의 질량 중심에 따라 다릅니다.

1) 질량 중심 . 객체의 질량 중심을 정의하십시오.

2) 적용 지점 : 힘이 작용하는 지점을 정의합니다.

3) Moment Arm : 위에서 정의한 두 점 사이의 거리.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) 각력 : 힘 F를 두 개의 직교 벡터로 나눕니다. 하나는 3)의 선과 평행하고 하나는 수직입니다. 평행 성분은 각 운동량에 영향을 미치지 않습니다. 직각입니다. 벡터 투영으로 평행 성분을 계산할 수 있습니다. 원본에서 빼고 수직 성분을 얻을 수 있습니다. 의사 코드 ( dot점 제품을 의미)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) 토크 : 힘의 수직 성분에 모멘트 암의 길이를 곱한 값.

Vector angularForce
Vector torque = angularForce * momentArm.Length

토크에서 각속도로 가려면 :

1) 관성 모멘트 : 주어진 물체가 얼마나 많은 회전 관성에 대한 정의. 예를 들어, 같은 질량의 구보다 긴 막대를 회전하는 데 더 많은 토크가 필요합니다. 리얼리즘에 대해 걱정하지 않는다면, 관성 모멘트가 질량에 상대적인 척하거나 객체의 모양과 질량을 완전히 무시할 수 있습니다.

2) 각가속도 :

Vector angularAcceleration = torque / momentOfInertia

3) 각속도 : 토크가 적용되는 한 각속도는 계속 증가합니다. 따라서 공식은 대략 "시간 T 에서 의 각속도는 T 까지의 각가속도의 누적 합입니다 ." 이것은 의사 코드로 다음과 같이 표현됩니다

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

그러나 훌륭한 정보는 내가 가장 확실하지 않은 부분은 토크 힘이 무엇인지 결정하는 방법입니다. 당신이 설명한대로 모든 구성 요소가 제자리에 있습니다.
jgallant

@ 존 : 구성 요소가 있습니다. 즉, 1-3 단계가 있으며 4 단계를 계산하는 방법을 알 수 없습니까? 그것은 주로 까다로운 단계입니다. 조금 더 자세히 설명하겠습니다.
Jimmy

3
각속도의 누적 합인 방향은 orientation += angularVelocity * elapsedSeconds시간 단계에 따른 속도를 과대 평가하기 때문에 잘못되었습니다. 즉, 다른 프레임 속도는 다른 방향을 제공합니다. 적절한 공식은 다음과 같습니다 float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;.. 또한 중력이 없기 때문에 대신“질량 센터”를 사용하는 것이 좋습니다. 아주 좋은 설명은 +1입니다.
sam hocevar

1
수직력의 일부는 질량 중심을 가속시키는 작용을하며, 힘이 질량 중심에 가까워 질수록이 계수는 증가합니다. 대답은 좋고 명확하지만, 이와 관련하여 불완전한 것 같습니다.
Sam Watkins

내 자신의 의견에 대답하기 위해 물리학에 대한 Chris Hecker의 기사를 읽고 있습니다 : chrishecker.com/Rigid_body_dynamics . 어느 시점에서든 힘이나 충격은 몸이 회전 할 수없는 것처럼 F = ma 또는 a2 = a1 + p에 따라 질량 중심에 잘 알려진 영향을 미치는 것으로 나타났습니다. 이것은 선형 운동량 보존 법칙에 따릅니다. 지미의 답변에 설명 된 것처럼 반지름에 수직 인 힘의 성분은 토크와 각도 운동량의 변화를 유발합니다.
Sam Watkins

7

힘이 너무 강하지 않으면 여러 점과 스프링을 연결 하여 회전을 시뮬레이션하는 것이 훨씬 쉽습니다 . 이 경우 모양은 스프링으로 연결된 여러 점으로 구성되어 있다고 가정합니다. 각 점은 질량을 나타내며 다른 모양의 모든 질량은 0과 같습니다.

봄 & 도트

위 그림에서 검은 점은 질량을 나타내고 빨간 선은 스프링을 나타냅니다. 그런 다음 힘을 적용하려면 가장 가까운 점에 적용하기 만하면 원하는대로 개체가 회전하는 것을 볼 수 있습니다. 모양을 견고한 구조처럼 보이게하려면 댐핑 값과 k 값이 높은 스프링을 정의하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.