Интеграция Verlet аварийно завершает мой механизм физики

Я вижу, что за 5 лет никто не придумал самое простое решение:

#define LOCK(x) CSingleLock lock(&x, TRUE);
...
void f() {
   LOCK(m_criticalSection);

И теперь используют только этот макрос для создания замков. Больше нет никаких шансов создать временных! Это дает дополнительное преимущество, заключающееся в том, что макрос может быть легко дополнен для выполнения любого вида проверки в сборках отладки, например, для обнаружения неподходящей рекурсивной блокировки, записи файла и строки блокировки, и многого другого.

5
задан RCIX 21 October 2009 в 10:26
поделиться

1 ответ

в качестве ссылки на других ... Верлетная статья, на которую вы, вероятно, ссылаетесь, это: продвинутая физика персонажей , сделанная командой, которая создала киллера и была одним из первым, кто использовал физику на основе тряпичной куклы

, так или иначе ... исходный код, который они использовали, был:

 void ParticleSystem::Verlet() {
       for(int i=0; i<NUM_PARTICLES; i++) {
             Vector3& x = m_x[i];
             Vector3 temp = x;
             Vector3& oldx = m_oldx[i];
             Vector3& a = m_a[i];
             x += x-oldx+a*fTimeStep*fTimeStep;
             oldx = temp;
       }
 }

, и вы правы, что ваш код делает то же самое.

Единственная вещь, которая всегда мешала моим симуляциям, - это использование слишком большого временного шага. Also, with this verlet integration, make sure that the timestep you use is constant throughout the game. (e.g 30 frames/sec for instance (so timestep is 1/30)) and doesn't fluctuate. If it does you should use the time corrected verlet integration which accounts for this

EDIT:

answer to question2: to move your position (without changing velocity/acceleration) just update the position to the new position, and then as an extra step add the delta of this movment(so newPosition-oldPosition) to the oldposs, so this gets updated accordingly.

answer to question1: Impulse is the force applied to an object over a period of time. So your solution is not correct. The impulse would be that over X timesteps(or frames), you call your applyForce function with a fixed force.

3
ответ дан 15 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: