Хмм.. сомнительно мне это.. Представьте палку, находящуюся в горизонтальном положении, она просто тупо движется вниз без силы тяжести и самым краем задевает лежащий частично под ней кубик. При соударении ведь был обмен импульсами, и импульс приложенный к палке был направлен вверх, тело продолжит падать, но начнёт вращаться. Движение центра масс не зависит.
Теперь эта палка падает и соударяется почти центром(на близком к нулю расстоянии от центра)её центр масс разве продолжит движение по той же траектории, когда мы прилаживались к краю палки?
Хз, моё нутро почему-то этому противоречит, хотя я бы почитал на досуге грамотную книжку по теор. механике чтоб конкретно со всем разобраться, только не знаю какую лучше?
UVW
> какую лучше?
да хоть какую. в твоём случае палка получит сильное вращение и почти не получит линейного импульса, потому что обменный импульс будет мал а плечо велико. поэтому изменение линейной скорости будет мало, а угловой - велико.
Вот я про это и говорю, что по моему дальнейшее движение тела(центра масс) зависит и от точки приложения, и от направления..
}:+()___ [Smile]
> Движение центра масс тела абсолютно не зависит от точки приложения силы
А от импульса?
UVW
> Вот я про это и говорю, что по моему дальнейшее движение тела(центра масс)
> зависит и от точки приложения, и от направления..
Оно зависит только от величины импульса, а не от его точки приложения. Вот только сама величина импульса зависит от точки удара, отсюда и возникает это кажущееся противоречие.
Если собираетесь заниматься физикой, то привыкайте, что всякий "здравый смысл" и прочие "интуитивные представления" не имеют ничего общего с реальностью. Природа устроена совсем не так, как кажется рядовому обывателю (что очень хорошо видно на примере истории физики).
}:+()___ [Smile]
> Оно зависит только от величины импульса, а не от его точки приложения
а от направления импульса зависит?
Такс, вроде начал доперать, но только мне объясняли с фейса, а я видел всё с ребра..
Вобщем решил продолжить допиливать физику, есть вопросы по дальнейшему "допиливанию".
Переделал сегодня порядок различных действий в основном цикле движка, получилось вот что:
void Scene::Evalute(float dt)
{
int iteration = 15;
float ddt = dt / iteration;
for (int i=0; i<iteration; i++)
{
fis.Impact(ddt); // тут будет применение сил, пока только действует ускорение свободного падения (в статье пункт "воздействуем на систему")
fis.CollisionDetection(); // определение всех столкновений
fis.Solver(ddt); // решение и нахождение импульсов по столкновению и по трению
fis.Integrate(ddt); // изменение позиции и поворота(ускорений нет, потому скорость тут не меняется)
}
}
После того, как я сделал такой порядок, тела перестали(почти) проваливаться и без warmstarting и без псевдоскоростей, это вообще норм? раньше проваливались.
А больше интересует другая вещь, почему у меня тела так отталкиваются, как будто небольшой взрыв? если включить warmstarting, некоторые телу чуть ли не на марс улетают.
Тут трение без проскальзывания, и отскок сделан нулевым, вот что получается.
Ещё есть пару вопросов по правильности алгоритмов.
вот есть такое замечание "Но, к сожалению, во время решения LCP, точки касания тел могут свободно наращивать свою скорость в направлении, перпендикулярном этому выбранному, что в результате приведёт к нестабильностям."
Я изначально сделал одноосевое, пока не увидел это замечание. Я сначала нахожу все лямбды для контактов не применяя их, чтоб скорости тел во время прохода цикла не менялись(система как бы замерла) а после нахождения в другом цикле(всё это в солвере) поочерёдно применяю импульсы для каждого тела, сначала на столкновение, затем на трение, и дальше для следующего тела. Но у меня направление скоростей и соответственно силы трения в цикле не меняется(импульсы будут применены после нахождения всех лямбд для всех коллизий) то можно ли использовать одноосевое трение? Если что-то не правильно, прошу объяснять попроще(я от школьной физики не далеко утопал).
Ещё вопрос, в абзаце про warmstarting написана такая строчка
lambda += (0.0f - accumulatedImpulse);
Почему не просто
lambda -= accumulatedImpulse;
Для чего это сделано?
> lambda += (0.0f - accumulatedImpulse);
потому что вместо 0.0f может быть другое значение ограничения
одноосевое трение может привести к дрожанию, но едва ли к взрывам. отлаживай без warmstarting'а - стабильно должно работать и без него.
Так это и так без warmstarting'а, вообще ничего нет кроме трения и отскока, интересно то, что раньше именно дрожание было, а теперь какая-то ерунда.. фиг знает почему так может быть
Тема в архиве.