흔들리는 진자를 어떻게 시뮬레이션합니까?


9

나는 진자처럼 앞뒤로 흔들리는 무게가 붙은 로프를 시뮬레이션하고 싶습니다. 실제 물리학은 과잉입니다. 끝없이 같은 동작을 반복합니다.

JQuery는 내가 찾고있는 것과 비슷한 "스윙"용이성 을 가지고 있습니다. 어떻게 작동합니까?

나는를 사용하여 한 각도에서 다른 각도로 회전하려고 생각 Math.easeOutExpo했지만 실제 진자는 다르게 완화됩니다 ...


2
영점이 피크에 있고 최고 속도 값이 하단에 오도록 사인 곡선이 진자의 각속도로 피드되도록합니다.
Shotgun Ninja

답변:


10

글쎄, 당신은 약간의 물리학을 사용해야하지만, 물리학을 시뮬레이션 할 필요는 없습니다 . 진자 의 회전을 설정하기 위해 쉽게 사용할 수있는 진자 운동 공식 이 있습니다. 작은 스윙의 경우 간단한 고조파 모션으로 모션을 근사화 할 수 있습니다 .

특정 시간에서의 각도 변위는 다음과 같이 근사 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

이것은 작은 최대 θ에 대해 가장 정확하지만 목적에 충분할 것입니다. 현재 시간이 걸리고 진자가 회전해야하는 각도를 출력하는 함수를 만들고 그 정도만큼 스프라이트를 회전시킵니다.


4

다음은 간단한 등급 11 Trig and Physics에서 도출 된 No-Trig 계산입니다. 원점은 진자 밥 서스펜션의 가장 낮은 지점이고 L은 진자의 길이이며 y는 아래로 증가하고 x는 오른쪽으로 증가한다는 일반적인 그래픽 규칙이 채택된다고 가정합니다.

업데이트 : 처음에는 yAcceleration을 엉망으로 만들었습니다. 이것은 더 쉽다.
업데이트 # 2 : 명시 적 시간 제어 및 측정 단위가 추가되었습니다.

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
방정식에 시간이 없습니다.
Maik Semder

@MaikSemder : 시간 단위는 애니메이션 주기로 정의됩니다. 왜 다른 방법으로할까요?
Pieter Geerkens

현재 가속 통합은 1 단위의 암시 적 시간을 사용합니다. 게임 시간 단위가 초라면 초당 1 개의 시뮬레이션 프레임 만 가질 수 있습니다. 시간을 명시 적으로 플러그인하면 해당 문제가 해결됩니다. 시간은 이미 거기에 있습니다. 명시 적으로 만드십시오. 예를 들어 프레임 시간은 다양하지만 다른 플랫폼 간에도 프레임 시간과 상관없이 애니메이션의 안정적인 일정한 속도가 필요하거나 여러 가지 이유로 슬로 모 효과를 원합니다.
Maik Semder

1
그것은 내 요점이었다. g는 외부 또는 "게임"에서 나온다. 이제 시간 단위가 있습니다. 현재 델타 t는 해당 시간 단위 중 하나입니다. 실시간 시뮬레이션의 경우 게임에 자체 "아이디어"경과 시간이 있기 때문에 그다지 편리하지 않습니다. 암시 적 상수가 아닌 명시적인 매개 변수로 만들면 게임에 대한 답변이 유용 할 수 있습니다.
Maik Semder

2
Nice :) 속도는 속도에서 "변위"를 얻기 위해 "deltaT"도 곱해야하므로 "x"에 추가 할 수 있습니다.
Maik Semder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.