Suslik
>каждом из которых тело скачкообразно меняет свою [b]позицию[/b] на величину acceleration * dt, и смещается на малый вектор v * dt.
скорость?
дальше второго майлстона неосилил, тяжко.
какнибудь на работе почитаю
Adler
> жесть... ну и изврат... никогда не думал так делать.
вообще говоря, это стандартное представление. величину, обратную массе можно трактовать как "подвижность". сомневаюсь, что это может быть очень принципиальным моментом.
> может так..
да, здесь ошибка
AndryBlack
>дальше второго майлстона неосилил, тяжко.
та статья даже близко не закончена. я попросил её опубликовать, чтобы понять, что делал радикально неверно. так сказать, проба пера.
А продолжение будет? Интересуют именно теоретические аспекты программирования физики.
не знаю, судя по по общему энтузиазму геймдева, все уже либо всё знают, либо не знают но уже не согласны. так что лучше пойду займусь чем-нибудь более продуктивным)
Suslik
Даже если что-то знаешь - никогда не будет лишним прочитать еще раз.
А на воинствующих неучей можно просто не обращать внимания.
Suslik : с урдовольствием вступлю в поклонники этой статьи если подскажешь где найти способ вычисления этой штуки:
>> Vector::GetNorm() - взятие нормали вектора
Ума не приложу как это сделать через "Vector axis = angularVelocity.GetNorm();" без точки, из которой (или к которой) этот вектор исходит. Подскажи плизз?
Можно я? :)
Вектор задается тремя числами - считай что он выходит из (0, 0, 0) и попадает в точку (x, y, z)
это было первое что я подумал ))) но angularVelocity - тоже вектор, заданный тремя числами (x, y, z) (или больше?)
Если тремя, то юридически он исходит из точки (0, 0, 0) и направлен в точку (x, y, z)
тогда нормаль будет либо (0, 0, 0) -(0, 0, 0) , либо будет совпадать с ним.
Может просто формулку подкинешь, мээн? Буду признателен.
Ejeg
> Может просто формулку подкинешь, мээн?
Yo, man!! Take this formula
normal = angularVelocity / sqrt( sqr(x) + sqr(y) + sqr(z) );
Sergio && Ejeg
Это ты вектор нормализуешь (приведение вектора к еденичной длине), а нормаль (не путать) - ортогональный вектор к касательной кривой. Хотя наверняка в статье имелась ввиду именно нормализация, и в этом случае
normalized_vec = vec / ||vec||
т.е. формула которую ты написал.
бууу. вы чо. там в статье нормализация вектора так и называется - Normalize
И его длинна тоже имеет своё имя - Len
А это именно нормаль к вектору.
Хотя в моём понимании в пространстве нормалью к вектору , заданному тремя координатами является плоскость.
Я не гуру механики и кинематики, но математику люблю )
Единственное что могу предположить - что нормаль Сусел рассчитывает исходя из еще какой-то точки. Но не признаётся )) бережет, до последнего момента скрывает как в детективе! )
Ejeg
Псевдовектор угловой скорости - вектор оси (единичный), помноженный на скалярную величину скорости поворота вокруг оси.
Статью не читал, но полагаю там путаница терминологий, и GetNorm() / Normalize() это одно и то же фактически. Только GetNorm() не изменяет вектора, возвращается его копия, приведенная к единичной длине, а Normalize() - изменяет сам вектор.
Короче, к нормали это не имеет никакого отношения, судя по всему.
XperienS: Респект - ты мысли читаешь. Я тоже был вынужден ввести кучу методов с похожими именами - одни из них меняют вектор, а другие не меняют а только возвращают результат. И не нашел способа сделать это красивее.
И спасибо - очень рад услышать вменяемое объяснение.
Suslik: жги дальшэ, мэээн. А-то я скоро двиг закончу раньше чем ты статью. А я хочу по статье! на чужом опыте сподручнее.
Кстати у меня вопросы. Они все по статье, поэтому наверно имею право их тут задать:
1) реально ли есть необходимость в величинах угловой и линейной акселерации? куда они? Для линейной - гравитация? и всё? А для угловой?.. (просто не смог придумать)
2) у меня есть метод "ПрименитьСилу" и ей в параметрах передаётся вектор силы, её величина в псевдо-ньютонах, и длительность приложения этой силы. Каждый квант времени я вызываю её для моторчиков, колёсиков, и прочего космического ветра. В ней исходя из массы (да, мне тоже инвертная масса удобнее кажется) объекта считаю прибавку к скорости. Без посредства ускорений. У меня вообще есть только одно ускорение - гравитация. Зря? Позже мне это аукнется?
Просто, например, скорость надо хранить, т.к. она суммируется: в каждый очередной квант времени какая-либо из приложенных сил увеличивает скорость на некую дельту. А ускорение то она не увеличивает. Грубо говоря после рассчета каждого кванта это ускорение надо обнулять с тем чтоб на следующем кванте оно с нуля накопило в себе все воздействия. Так?
3) поясни пожалуйста суть моментального удара? По сути - это как воздействие силы бесконечно короткой длительности. Но ведь тогда она не успеет придать ускорение... Можешь на пальцах плизззз? Не согласишься ли ты, что понятие импульса надуманно и является лишь упрощением сложного процесса приложения силы, просто в очень коротком отрезке времени? (это просто вопрос. нет - так нет)
(еси ответы на все эти вопросы обещаются быть в статье -буду терпеливо ждать)
(А как ты вектор вращаешь?)
>> Хинт состоит в том, что мы разрешаем соприкасающимся телам всегда проникать друг в друга на малую величину, назовём её deltaDepth. Смысл такого экстровагантного допущения будет объяснён позже.
Эх, а так и не объяснил, а очень нужно и интересно почему?
Как раз решаю проблему скольжения окружности с наклоненной плоскости, окружность уходит в ступор в связи с прикосновением, либо спускается как по лесенке.
ps. спасибо за статью, интересно почитать опытного физика
[/slowpoke mode]
Ejeg
> 1) реально ли есть необходимость в величинах угловой и линейной акселерации?
> куда они? Для линейной - гравитация? и всё? А для угловой?.. (просто не смог
> придумать)
ну любая сила, приложенная к телу, придаёт ему какое-то ускорение : линейное и угловое. вот эти ускорения и принято хранить в аккумуляторах ускорений.
> что-то там про силы
делай так, как тебе удобнее. это не принципиальный момент. другое дело, что если ты хранишь силу, тебе её каждый раз придётся множить на тензор инерции, не удобно обычно.
>3) поясни пожалуйста суть моментального удара? По сути - это как воздействие силы бесконечно короткой длительности. Но ведь тогда она не успеет придать ускорение... Можешь на пальцах плизззз?
короткое объяснение:
если ты бесконечно большой силой будешь действовать бесконечно малый промежуток времени, произведение может дать что-то конечное
более умное объяснение:
рассмотрим шарик, который ударяется о стенку. известно, что до удара он имел скорость(проекцию на нормаль стенки) v. после удара -v. аналогично импульс сменился с mv до -mv. в школе была формула m *(delta v) = f * delta t. f - сила, delta t - рассмотренный промежуток времени. предположим, что шарик отскакивал не мгновенно, а на протяжении какого-то малого интервала времени dt. можно найти силу, которая действовала на этом интервале времени, чтобы импульс поменялся на противоположенный: 2 * m * v = f * dt; f = 2 * m * v / dt; та-даан, получаем - что сила - какая-то конкретная величина. и замечаем, что чем меньше время удара(dt) мы берём, тем больше получается эта самая сила. именно поэтому в большинстве физических выкладок вместо того, чтобы рассматривать пару величин: одна очень большая(сила) вторая очень маленькая(время удара) рассматривается одна - изменение импульса, которая обычно выражается вполне нормальным числом.
ещё более умное объяснение:
dP = f(t) dt
P - импульс
integral[0, t](dP) = integral(0, t)(f(t) dt)
P(t) = integral(0, t)(f(t) dt) = 2mv; t -> 0;
следовательно, получаем f(t) = 2mv * б(t), где б(t) - дельта-функция
_Leviathan_
> Эх, а так и не объяснил, а очень нужно и интересно почему?
да, до этого так и не дошёл в объяснениях. в общем это нужно вот здесь в разделе "Warmstarting" рассказывается о технике, позволяющей резко улучшить сходимость, если в качестве начального решения брать результат солвера с предыдущего кадра. чтобы взять результаты с предыдущего кадра, нужно определить, какие из коллижнов остались, какие исчезли и какие появились новые. так вот если мы позволим телам проникать немного друг в друга, коллижны от итерации к итерации будут более устойчивыми, не будут постоянно пропадать и появляться, из-за этого стабильность сильно повышается. если ты не планируешь использовать в каком-то виде warmstarting, то забей.
Тема в архиве.