Войти
ПрограммированиеФорумФизика

Физика "на пальцах" (комментарии) (24 стр)

Страницы: 123 24 25 2639 Следующая »
#345
13:40, 25 июня 2020

Suslik
>
>
> dsin⁡(x)/dx=π180cos⁡(x)
>
> аналогично для градусов не работают никакие ряды разложения по степеням в
> каноническом виде итп.
Ну это совсем несерьёзно - вещественные числа, обозначающие количество градусов дадут иной результат нежели такие же числа, обозначающие радианы ?

#346
(Правка: 14:08) 14:02, 25 июня 2020

mihals
> Ну это совсем несерьёзно - вещественные числа, обозначающие количество градусов
> дадут иной результат нежели такие же числа, обозначающие радианы ?
да, как минимум потому что у них размерности разные. производная в радианах — это [1/рад](что можно считать безразмерным), производная в градусах — это [1/градус] (существенно размерная величина). а приращение синуса за 1[радиан] гораздо больше, чем приращение этого же синуса за 1[градус]
https://ideone.com/H3cypW

#include <iostream>
#include <math.h>
using namespace std;

const float pi = 3.141592f;

template<typename T>
float GetDerivative(T func, float val, float eps)
{
  return (func(val + eps) - func(val)) / eps;
}

int main()
{
  auto sinRad = [](float rad){return sin(rad);};
  auto sinDeg = [](float deg){return sin(deg / 180.0f * pi);};
  
  float eps = 1e-5f;
  std::cout << "dsinRad(x)/dx|0 = " << GetDerivative(sinRad, 0.0f, eps) << "\n";
  std::cout << "dsinDeg(x)/dx|0 = " << GetDerivative(sinDeg, 0.0f, eps) << "\n";
  return 0;
}
dsinRad(x)/dx|0 = 1
dsinDeg(x)/dx|0 = 0.0174533
#347
14:50, 25 июня 2020

Suslik
У производной есть математическое определение и это не " значение ф-ции GetDerivative", тем более, что в ней вычисляется лишь разностное отношение, если перепрыгивать с числяка на матан, то можно прийти и не к таким странным выводам.

#348
15:04, 25 июня 2020

mihals
> У производной есть математическое определение и это не " значение ф-ции GetDerivative"
Если не шаришь в математике, то лучше в математических темах ничего не писать, умнее будешь выглядеть.

#349
15:16, 25 июня 2020

}:+()___ [Smile]
))) - Smile (саркастическая и немножко презрительная)

#350
(Правка: 5:35) 5:32, 26 июня 2020

Suslik[/b]
> я уже кучу раз говорил, что градусы не нужны, именно потому что только для
> радиан справедливы равенства вроде
> v→=ω→×r→, что является следствием
>
> ddxsin⁡(x)=cos⁡(x), что также справедливо только для радиан. и каждый раз,
> когда я кому-то это говорю, получаю в ответ что-то вроде "да это всё равно
> никогда никому не понадобится

\(\vec{v} = (\vec{\omega} \times \vec{r}) * \frac{180}{\pi }\)
А так можно для градусов ?

#351
5:48, 26 июня 2020

werasaimon
> А так можно для градусов ?
наоборот, pi / 180. только зачем?

#352
(Правка: 7:47) 7:45, 26 июня 2020

Хех, думал с вармстартингом все просто, но не учел что:

Основная проблема такого подхода — определить, какой из контактов был и на прошлой итерации процесса моделирования, а какой появился только что. Выдвигаются особые требования к алгоритму определения столкновений и его косвенная связь с, казалось бы, независимым от него солвером.

Поскольку теории в статье маловато попытаюсь осознать как это работает разбирая код.

Так, понимаю что для переменная джойнтов "valid" введена как раз для вармстартинга и не будь вармстартинга - можно было бы просто обнулять массив джойнтов при каждом шаге физики и каждый раз содавать его заново. При таком подходе вармстартинг не работает.

Сначала все существующие джойнты помечаются как недействительные и подлежащие удалению.
Дальше идут два цикла по существующим коллизиям.
В первом цикле идет проверка существует назначен ли текущей коллизии джойнт.. если назначен ничего не происходит, а если назначен, то.. и вот тут сложный для меня момент..
Если назначен - то этот джойнт становится валидным и ему присваиваются информация от текущей коллизии. Это вообще зачем и как работает? Джойнт, который принадлежит текущей коллизии, помечается как валидный и у него обновляется информация и ему назначается текущая коллизия. Смысл этой манипуляции в чем, в том чтобы джойнт мог существовать сколько угодно долго, но менял принадлежащие ему коллизии? То есть позиции тел изменились, и если при этом какая-то коллизия НЕ исчезла, а сохранилась.. то соответствующий ей  джойнт.. обновляет информацию о коллизии, которая ему принадлежит? Так в нем же и так уже была эта информация, об этой коллизии. Одна коллизия - один джойнт - два тела. Я что-то упускаю?

И еще, нельзя обойтись одним циклом по коллизиям, используя if-else вместо if-continue? Здесь какая-то хитрость?

#353
(Правка: 7:52) 7:51, 26 июня 2020

MikeNew
> Так в нем же и так уже была эта информация, об этой коллизии. Одна коллизия -
> один джойнт - два тела. Я что-то упускаю?
в моей реализации коллижены перестраиваются каждый кадр заново, а джойнты, которые им соответствуют, сохраняются как можно дольше. и нет там никакой волшебной магии, можно реализовать по-разному, я просто привёл одну возможную реализацию. если бы я сейчас снова это писал, сделал бы по-другому. принципиальный момент — это найти соответствующую лямбду для каждого возможного джойнта с предыдущего кадра и передать на текущий. как ты это будешь делать — твоё дело.

#354
(Правка: 10:33) 10:06, 26 июня 2020

Suslik
> принципиальный момент — это найти соответствующую лямбду для каждого возможного
> джойнта с предыдущего кадра и передать на текущий. как ты это будешь делать —
> твоё дело.

На практике реализуется так:

    сначала применяем аккумулированные на прошлой итерации импульсы во всех ограничениях
    продолжаем решать ограничения, как ни в чём не бывало находя импульсы lambda, и просто прибавляем их к аккумулированному значению.

Сначала применяем аккумулированные импульсы только в том случае, если джойнт существовал и раньше, иначе и применять нечего.
Если же джойнт возник только что (fresh), начинаем процедуру накопления импульсов для него.

if (joint.fresh) joint.accumulatedImpulse = 0;
else applyImpulse(joint.accumulatedImpulse);

joint.accumulatedImpulse += computeLambda;

applyImpulse(computeLambda); 

Правильно ли я понял алгоритм?

#355
10:39, 26 июня 2020

MikeNew
во-первых, там должен быть цикл по dt, во-вторых, должен быть цикл по итерациям солвера.

#356
(Правка: 10:55) 10:53, 26 июня 2020

Suslik
> во-первых, там должен быть цикл по dt, во-вторых, должен быть цикл по итерациям
> солвера.
Ну то что этот псевдокод внутри цикла по итерациям солвера само собой подразумевается, а что еще за "цикл по dt", цикл по джойнтам? Да, надо было сразу с циклами сделать, недооформил:

for (joint:joints) {
  if (joint.fresh) joint.accumulatedImpulse = 0;
  else applyImpulse(joint.accumulatedImpulse);
}

for (i:iterationsCount) {
  for (joint:joints) {
    joint.accumulatedImpulse += computeLambda;
    applyImpulse(computeLambda); 
  }
}
#357
(Правка: 10:57) 10:57, 26 июня 2020

MikeNew
ну, если джойнты без ограничений, то можно так сделать. но я же, вроде, выкладывал код с примером, который это делает всё?

#358
(Правка: 11:13) 11:06, 26 июня 2020

Suslik
> ну, если джойнты без ограничений, то можно так сделать. но я же, вроде,
> выкладывал код с примером, который это делает всё?
Имеется в виду какой-то код в комментах или это ирония и речь о коде прикрепленном к статье? :)

PS Если второе, то размеется это не полный псевдокод учитывающий ограничения, а только часть имеющая отношение непосредственно к вармстартингу. Чтобы не напрягать никого.

PPS Или я что-то недопонял по поводу ограничений.

#359
15:29, 26 июня 2020

MikeNew
> Имеется в виду какой-то код в комментах или это ирония и речь о коде
> прикрепленном к статье? :)
я, вроде, выкладывал SusliX lite когда-то, который реализовал подход из статьи на минимальном примере физики шариков

Страницы: 123 24 25 2639 Следующая »
ПрограммированиеФорумФизика