anz
Да. Я плохо посмотрел, думал тут модуль суммы векторов, а не флоатов:
> float all = ::fabs( friction_x + friction_z );
Mikle
> Суммируешь вектора продольной и поперечной сил, если модуль полученной величины
> превышает силу трения - нормализуешь полученный вектор до величины силы трения
> и раскладываешь обратно, получаешь реально действующие продольную и поперечную
> силы с учётом трения.
Именно так.
Кстати в реальных условиях часто бывает, что окружность трения является эллипсом. Но это уже чрезмерное уточнение))
Тааак уже лучше)
Нашел подобный код в буллете
И вот чего не пойму, зачем они гасят fwdFactor ?
btScalar sideFactor = btScalar(1.); btScalar fwdFactor = 0.5; m_wheelInfo[wheel].m_skidInfo= btScalar( 1.); btScalar maximp = wheelInfo.m_wheelsSuspensionForce * timeStep * wheelInfo.m_frictionSlip; btScalar maximpSquared = maximp * maximp; m_forwardImpulse[wheel] = rollingFriction; btScalar x = ( m_forwardImpulse[wheel] ) * fwdFactor; btScalar y = ( m_sideImpulse[wheel] ) * sideFactor; btScalar impulseSquared = ( x*x + y*y); if ( impulseSquared > maximpSquared) { sliding = true; btScalar factor = maximp / btSqrt( impulseSquared); m_wheelInfo[wheel].m_skidInfo *= factor; }
FDsagizi
> И вот чего не пойму, зачем они гасят fwdFactor ?
Это собственно то, о чём я написал выше - не окружность а эллипс.
Кстати, код в плане логики вполне образцовый.
Rotation += Torque / Inerita;
где Torque — приложенный крутящий момент, Inertia — инерция колеса.
Inertia = ?
Считать по формуле цилиндра, первую важность имеет относительное значение.
Alexander K
> Считать по формуле цилиндра, первую важность имеет относительное значение.
Я так понял это: инерция цилиндра = Масса * радиус2 / 2
Супер но как учитывать сопротивление вращению для колеса от земли ?
Возможно этот вопрос решал "сам" физ движек который вы использовали
Но т.к. я использую RayCast колеса, сопротивление от земли нужно расчитывать самому
Ато выходит что колеса это кусок железа в вакууме :)
Добавил позже: Хотя у меня есть предположение что Maсса = масса колеса + масса машина на данное колесо ?
RPM += torq / Inertia - pow(1.0f - torq, 2) * BackTorque;
где pow() — функция возведения в степень, backTorq — константа, определяющая величину обратного момента.
Откуда брать - backTorq ?
Ништяк)))
float additionRPM = torq / Inertia - pow(1.0f - torq, 2) * BackTorque;
при нажатии педали акселератора, двигатель снижает обороты, я так понимаю из за возведения в степень, значение приобретает намного больший результат чем тот из которого он вычитается, перепробовал множество разных констант, изменяется только диапазон оборотов двигателя. В чем может быть проблема??
float additionRPM = torq / Inertia - pow(1.0f - Throttle, 2) * BackTorque;
Опечатка :D
Буду третьим, кто задает вопрос, на который пока что нет ответа: Как правильно подобрать значение BackTorque?
:) Я сам так и не попробывал, но подозреваю что это момент который передается от коробки с колесами обратно двигателю, типа инерции. Хотя могу ошибатся.
> Как правильно подобрать значение BackTorque?
BackTorque это константа, и при этом это не крутящий момент вовсе, как можно подумать из названия. Это к слову.
Как можно догадаться, величина этого значения обуславливает скорость падения оборотов двигателя при закрытой дроссельной заслонке.
Если копнуть глубже, то следовало бы ввести значение именно крутящего момента, который тормозил бы вращение двигателя. И наверняка он бы также зависел от самих оборотов. Но ведь это не такой уж важный, даже с точки зрения реализма, момент и можно ведь не усложнять, правда? :D
Я сейчас не могу сказать какие значения этой константы я использовал сам, но подобрать его совсем не сложно:
Пусть обороты падают на 3000 каждую секунду при отпущенном газе (закрытом дросселе). Стало быть BackTorque должно равняться 3000 * dTime, где dTime ваш шаг по времени.
Тема в архиве.