2011-08-10 7 views
8

자유 낙하와 땅과의 충돌 (예 : 튀는 공)을 시뮬레이션하고 싶습니다. 물체가 진공 상태가되어 공기 저항을 없앨 수 있습니다. 땅과 충돌하면 에너지가 약간 손실되어 결국 물체가 움직이지 않게됩니다. JOGL을 사용하여 떨어지는 물체 인 점을 렌더링합니다. 중력은 일정하다 (-9.8m/s^2). 잘못된중력 시뮬레이션

deltaTime = currentTime - previousTime; 
vel += acc * deltaTime; 
pos += vel * deltaTime; 

하지만 내가 뭘 뭔가 :

나는 점의 새로운 위치를 계산하는 오일러 방법을 발견했다. 요점은 몇 번 튀고 그 다음으로 내려갑니다 (매우 느림).

display() 
{ 
    calculateDeltaTime(); 
    velocity.y += gravity * deltaTime; 
    pos.y += velocity.y * deltaTime; 

    if(pos.y < -2.0f) //a collision with the ground 
    { 
     velocity.y = velocity.y * energyLoss * -1.0f; 
    } 

} 

: 여기

는 의사 (초기 POS = (은 0.0f, 2.0f, 0.0f로), 초기 VEL (은 0.0f, 0.0f를, 0.0f로), 비중 = -9.8f) 인 현실적인 효과를 얻는 가장 좋은 방법은 무엇입니까? 오일러 방정식이 일정한 가속 방정식을 어떻게 언급 하는가?

+0

방정식에서 에너지 손실 만 제거하면 어떻게됩니까? – redbmk

+0

떨어져 요 차이의 답변에서, 당신은 충돌 오류를 피하기 위해 충돌 상황에서 바닥 레벨로 설정하는 것을 고려할 수도 있습니다. –

+0

에너지 손실없이 포인트는 일정 시간 후에 튀는 것을 멈추고 매우 느리게 움직입니다. – Vert

답변

6

부동 소수점은 잘 다듬지 않으므로 실제로는 0의 속도를 얻지 못할 것입니다. 아마도 -0.00000000000001이나 뭔가를 얻을 것입니다.

충분히 가까울 때 0.0으로 설정해야합니다. (일부 델타 정의)

2

위의 내 의견을 확장하고 Tobias으로 대답하려면 여기에 전체 답변을 추가하겠습니다.

처음 검사했을 때, 나는 속도가 빠름을 알리려고 결심했다. 속도에 대해 유도체를 복용 후 energyloss이 정의 된 방식에 따라, 그리고

delta_E = m v delta_v 

를 얻을 수 있도록 간단하게 말해서, 운동 에너지와 속도 사이의 관계는, E = m v^2 /2, 당신은 delta_Eenergyloss 사이의 관계를 설정할 수 있습니다. 예를 들어, 대부분의 경우 energyloss = delta_E/E_initial으로해서 상기 관계는이 시간 간격에서는 v_initial와 제 식 v를 교체 할 수 있도록 작은 것이 가정된다

delta_v = energyloss*v_initial/2 

간단하게 할 수 있으므로 수 있어야 네가하는 일 때문에 그걸로 도망 가라. 분명히하려면 delta_v을 가지고있는 대신 충돌 블록 안의 velocity.y에서 빼십시오.

공기 저항을 추가 할 것인지의 여부에 대한 대답은 그에 달려 있습니다. 초기 낙하 높이가 작은 경우에는 문제가되지 않지만 튀어 오름과 더 높은 낙하 지점으로 인해 에너지 손실이 줄어들어 문제가 발생할 수 있습니다. 90+ - 낮은 에너지 손실 재료 (80

difference in time with and without air-drag vs. drop height

하십시오 1g, 1 인치 (2.54 cm) 직경, 매끄러운 구형 난와 낙하 높이 대 공기 마찰없이 간의 시간차를 나타내 유지 에너지 %), 나는 10 미터, 그리고 높이, 드롭 높이에 대한 추가 고려하십시오. 그러나 방울이 2 ~ 3 미터 미만이라면 걱정하지 않아도됩니다.

누구나 계산을 원한다면 공유하겠습니다.

+0

+1이 대답에 감사드립니다. 나는 이것이 또한 좋은 해결책이라고 생각한다. Vert의 원래 충돌 구현과는 달리 몸체가 바닥과 충돌하고 베개처럼 어쩌면 바닥에 충돌하는 "더 부드러운"충돌이 발생합니다. Vert의 버전은 손실이 있습니다. 선택해야 할 것은 물론 원하는 육체적 행동에 달려 있습니다. 그리고 당신이 맞습니다, 공기 마찰은 과도 할 것입니다. –

+0

@Tobias, 이것은 또한 바운스가 약간 더 부드럽고 손실이 많습니다. – rcollyer

+0

@Vert, 내가 게시했을 때 나는 눈치 채지 못했지만 델타 _v에 대한 내 결과에서'energyloss'를 삭제했습니다. 이제 해결되었습니다. – rcollyer