Wheelcollider - как его использовать.

Научился сам? Помоги начинающему.

Wheelcollider - как его использовать.

Сообщение sledo 23 мар 2016, 21:07

Думаю многие хотели бы сделать автомобиль в Unity и конечно юниты позаботились о том, что бы ц их пользователей это получилось, без разработки очередного велосипеда и добавили в стандартные возможности такую штуку от Nvideo как wheelcollider. Лично я считаю что это решение крайне мудрое, поскольку намного продуктивнее использовать плоды трудов других команд, чем тратить время и деньги на изобретение очередного велосипеда.И вот не так давно и у меня дошли таки у меня руки и до wheelcollider'а. Однако, то ли из за того что решение стороннее, то ли в силу вредности юнитов, они возможность добавили, а вот подробно объяснить как ей пользоваться, забыли (что достаточно необычно, поскольку подробность документации просто шикарна). Пользователи тоже как то не особо вникали в использование колесных коллайдеров и в основном повторяли уроки от самих юнитов. Все это безобразие породило другое безобразие - множественные любительские расширения для Unity, где пользователи пытались переплюнуть профессионалов. И все из за по сути отсутствия документации по wheelcollider. Эту непонятную ситуацию, я и попытаюсь просветить.

Итак, что мы все делаем, когда начинаем создавать автомобиль? Правильно, идем на http://docs.unity3d.com/Manual/class-WheelCollider.html и смотрим что это вообще такое. А там, поверхностная информация, типа эта штука есть и она работает. Конечно этого не достаточно, мы идем дальше и натыкаемся на это http://docs.unity3d.com/Manual/WheelCol ... orial.html. Уже намного, намного лучше думаем мы! И вроде даже это именно то что надо. Делаем все как там написано, копипастим скрипт и... И получается нечто, что как то непонятно движется и как то странно поворачивает. Наверное надо это нечто настроить - первая мысль. Идем на предыдущую страничку, смотрим параметры, крутим и о чудо, поведение нечто начинает становиться отдаленно похожей на поведение автомобиля. Собственно на этом все и заканчивается. Ибо как бы мы не крутили настройки, что бы мы не делали, но оно ни как не хочет вести себя так, как ведет себя нормальный автомобиль. И это (физику автомобиля), на секундочку, сделала одна из ведущих компаний мира, над этим работали десятки профессионалов в своей области! Невероятно? Точно, невероятно. Думаю не ошибусь, что 90% людей которые сталкивались в WheelCollider, плевали на него и делали свою физику и видит Бог, я бы тоже так поступил, если бы не моя дотошность в поиске причин неисправности.

Так вот, первый ключик к настройке сил трения, лежит тут (тынц) в виде графика. Это ключевой момент, который для человека мало знакомого с физикой поведения сил трения, мало о чем говорит. Более того! Даже если вы поищите подобную информацию, то вам либо придется пролистать институтский курс по поведению автомобиля на дороге либо выдаст информацию по системам ABS. Как ни странно, но именно системы ABS нам и помогут понять, что же за такой график представлен на страничке. Теперь идем сюда - тынц - и очень, очень внимательно читаем все изложенное, особенно если вы в первый раз столкнулись с этим. Возможно, придется перечитать все несколько раз, но оно того стоит.
Вернемся к графику. Этот график, представляет из себя ничто иное, как зависимость сил которые цепляют колесо за дорогу не давая ему скользить, к собственно самому скольжению. Вкратце, эта зависимость выглядит так — чем больше скользит колесо, тем выше оно сопротивляется этому скольжению до того момента, как не будет пройдена критическая точка (где ExtremumSlip - скольжение, ExtremumValue — силы сопротивления). После того как точка будет пройдена, колесо начинает срываться в юз и силы сопротивления постепенно падают к точке Асимтоты ((AsymptoteSlip, AsymptoteValue) ), благодаря чему и получается эффект юза. Соответственно что бы прекратить юзить, нужно снизить силы действующие на колесо, до той силы, которое шина оказывает на дорогу, сопротивляясь скольжению. Теперь становится ясно, что, что бы выйти из юза (либо из заноса), нужно либо снизить скорость, либо уменьшить угол поворота рулевого колеса, либо увеличить давление на колесо, что бы таким образом либо уменьшить силы которые действуют на колесо (сбросить газ, уменьшить угол), либо увеличить силы сопротивления скольжению шины и довести их до сил, которые действуют на колесо. Все в точности так, как и происходит в реальности.

Подведем итог по графику.
До этой точки, колесо не срывается в юз, после этой точки, срывается
ExtremumSlip — это и есть скольжение колеса. Чем выше это значение, тем больше шина сможет скользить по поверхности, без срывания на юз(т.е. к резкому снижению сил сопротивления). Я думаю что в реальности этот параметр можно наблюдать при движении автомобиля по наклонной поверхности. Колеса стоят прямо и автомобиль движется параллельно горке, но все равно немного «съезжает» в бок.
ExtremumValue — это силы, которые сопротивляются скольжению. Чем выше это значение, тем больше нужно приложить сил, что бы сорвать колесо на юз.

После прохождения критической точки, колеса срываются в юз со снижением сопротивления
AsymptoteSlip — это скольжение колеса, во время юза.
AsymptoteValue — это силы которые сопротивляются скольжению во время юза

Собственно ситуация с заносами, точно такая же. Небольшая книжица, где автор очень просто и в то же время очень подробно описывает физику автомобиля http://www.miata.net/sport/Physics/. Есть и русский вариант, но ее уже найдете сами.

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


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

Всем удачи в создании гонок)
Последний раз редактировалось sledo 29 май 2016, 16:58, всего редактировалось 2 раз(а).
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение sledo 28 мар 2016, 04:53

p.s. Добавлю еще вот что - наверняка многие столкнутся с проблемой прыгающих значений от WheelCollider'а. Решается, на мой взгляд, это довольно просто только двумя путями:
1) Увеличить число просчетов физики. У меня получались более менее стабильные результаты, только на значении 0,002. (кто не в курсе, это надо либо через скрипт задавать Time.fixedDeltaTime = test_fixedDeltaTime; , либо через Edit > Project Setting > Time > Fixed Timestep). Но по мне, это уж очень топорное решение. С другой стороны, для ГО двигающихся со скоростью больше 250 м/с, в любом случае стандартный шаг просчета физики, будет мал.
2) Просто считать среднее. Минус в том, что будет некоторое "запаздывание" значения, однако вроде как вполне достаточно среднего из 5 значений, что бы не слишком запаздывать и при этом получать стабильное значение, например rpm)
Как пример
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Test1 : MonoBehaviour {

    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public WheelCollider leftWheelBack;
    public WheelCollider rightWheelBack;

    WheelHit wh;

    public float testWheelHitForwardSlip1;
    public float testWheelHitForwardSlip2;
    public float testWheelHitForwardSlip3;
    public float testWheelHitForwardSlip4;

    public Vector3 position1;
    public Quaternion rotation1;
    public Vector3 position2;
    public Quaternion rotation2;
    public Vector3 position3;
    public Quaternion rotation3;
    public Vector3 position4;
    public Quaternion rotation4;

   
    public float testWheelRpmright;
    public float testWheelRpmleftWheelBack;
    public float testWheelRpmrightWheelBack;

    public float testWheelMotorleft;
    public float testWheelMotorright;
    public float testWheelMotorleftWheelBack;
    public float testWheelMotorrightWheelBack;

    public float speed;

    float time;
    public float timeControl;
    bool start;

    public float angularVelocity;

    public float test_fixedDeltaTime = 0.02f;

    //средние значения
    public int arrayLength;
    float[] массивСреднегоЗначения = new float[5];

    public float среднее;
    public float testWheelRpmleft;

    // Use this for initialization
    void Start ()
    {
        //1) Пороговое значение скорости ветра
        //2) шаги Ниже порога
        //3) действия, описанные выше порога
        /*
        leftWheel.ConfigureVehicleSubsteps(1000f,12,15);
        rightWheel.ConfigureVehicleSubsteps(1000f, 12, 15);
        leftWheelBack.ConfigureVehicleSubsteps(1000f, 12, 15);
        rightWheelBack.ConfigureVehicleSubsteps(1000f, 12, 15);
        */


    }

    void Update()
    {
        time += Time.deltaTime;

        if (Input.GetKey("2"))
        {
            start = true;
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        массивСреднегоЗначения[arrayLength] = leftWheelBack.rpm;
        arrayLength++;

        if (arrayLength == массивСреднегоЗначения.Length)
        {
            arrayLength = 0;
        }

        среднее = 0;

        for (int i = 0; i < массивСреднегоЗначения.Length; i++)
        {                  
            среднее += массивСреднегоЗначения[i];
        }

        среднее /= массивСреднегоЗначения.Length;


        if (speed < 100 && start)
        {
            timeControl = time;
            speed = ((((2f * 3.14f * leftWheel.radius) * leftWheel.rpm) / 1000 * 60) + (((2f * 3.14f * rightWheel.radius) * rightWheel.rpm) / 1000 * 60)
                + (((2f * 3.14f * leftWheelBack.radius) * leftWheelBack.rpm) / 1000 * 60)+ (((2f * 3.14f * rightWheelBack.radius) * rightWheelBack.rpm) / 1000 * 60) )/4;
        }
        else
        {
            time = 0;
        }



        WheelHit wheelHit;
        leftWheel.GetGroundHit(out wheelHit);
        testWheelHitForwardSlip1 = Mathf.Abs(wheelHit.forwardSlip);
        rightWheel.GetGroundHit(out wheelHit);
        testWheelHitForwardSlip2 = Mathf.Abs(wheelHit.forwardSlip);
        rightWheelBack.GetGroundHit(out wheelHit);
        testWheelHitForwardSlip3 = Mathf.Abs(wheelHit.forwardSlip);
        leftWheelBack.GetGroundHit(out wheelHit);
        testWheelHitForwardSlip4 = Mathf.Abs(wheelHit.forwardSlip);

        leftWheel.GetWorldPose(out position1, out rotation1);
        rightWheel.GetWorldPose(out position2, out rotation2);
        leftWheelBack.GetWorldPose(out position3, out rotation3);
        rightWheelBack.GetWorldPose(out position4, out rotation4);

        testWheelRpmleft = leftWheel.rpm;
        testWheelRpmright = rightWheel.rpm;
        testWheelRpmleftWheelBack = leftWheelBack.rpm;
        testWheelRpmrightWheelBack = rightWheelBack.rpm;



        testWheelMotorleft = leftWheel.motorTorque;
        testWheelMotorright = rightWheel.motorTorque;
        testWheelMotorleftWheelBack = leftWheelBack.motorTorque;
        testWheelMotorrightWheelBack = rightWheelBack.motorTorque;

        Time.fixedDeltaTime = test_fixedDeltaTime;
    }
}
 


Я так и не понял как влияет на обсчеты WheelCollider.ConfigureVehicleSubsteps.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение Cr0c 28 мар 2016, 09:16

Каждый раз, когда fixed update происходит, моделирование транспортного средства расщепляет это fixed delta time на меньшие подстадии и вычисляет подвески и шин силы на каждую меньшую дельту. Тогда было бы суммировать все полученные силы и крутящие моменты, интегрировать их, и применять к телу автомобиля.

С помощью этой функции вы можете настроить, сколько подэтапы будут выполняться моделирования выше и ниже порога скорости.

Этого достаточно, чтобы вызвать эту функцию только один раз в каждом транспортном средстве, как он фактически устанавливает параметры транспортного средства, но не к колесу.

Это что бы не делать
Решается, на мой взгляд, это довольно просто только двумя путями:
1) Увеличить число просчетов физики. У меня получались более менее стабильные результаты, только на значении 0,002

А не то физику считать 500 раз в секунду будет для всего, а это только колесам разрешит чаще вычисляться.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2293
Зарегистрирован: 19 июн 2015, 13:50

Re: Wheelcollider - как его использовать.

Сообщение sledo 28 мар 2016, 14:37

Cr0c писал(а):
Каждый раз ... вычисляться.

Все мы умеем читать справку. Проблема всегда в том, что не все что написано в справке, полностью отражает действительность.
Если у вас есть практические знания как применять то или иное, когда это надо применить, почему и что изменится или есть вопросы по заданной автором теме, пишите их. Если только теория из справки, то это не тот раздел, где надо ее написать.
Последний раз редактировалось sledo 28 мар 2016, 20:06, всего редактировалось 2 раз(а).
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение sledo 28 мар 2016, 20:05

Тесты показали следующее:
С помощью WheelCollider.ConfigureVehicleSubsteps можно стабилизировать показания, в зависимости от скорости колеса. По умолчанию, значения WheelCollider.ConfigureVehicleSubsteps примерно такие - ConfigureVehicleSubsteps(10f, 5, 5) (ConfigureVehicleSubsteps(float speedThreshold, int stepsBelowThreshold, int stepsAboveThreshold)), где 10f (speedThreshold) это скорость до прохождения которой для обсчета колес берется значение stepsBelowThreshold, после прохождения берется значение stepsAboveThreshold.
Т.е. если не изменять значения ConfigureVehicleSubsteps, то при скорости меньше 10 км/ч, показания WheelCollider будут нестабильны и прыгать в ту или иную сторону так, что работать с ними категорически нет никакой возможности. Такая ситуация останется до значения у stepsBelowThreshold, не меньше 13 и при 15, возвращаемые значения начинают себя чувствовать стабильно, начиная с 1 км/ч, что соответствует 1Hm при массе 1000кг и радиусе 0,3, что наводит на мысль о возможности расчета необходимых значений.
Что интересно - на низких скоростях wheelHit.forwardSlip всегда возвращает значения по возрастающей, а не какие то стабильные, поэтому уйти от использования средних, для прогнозируемых результатов, мне кажется не получится. Думаю с wheelHit.sidewaysSlip ситуация будет аналогичная.

Еще иногда возникают артефаки в виде вибрации ТС при жестких пружинах или амортизаторах. У меня проблема решилась регулировкой параметра Force App Point Dictance, более близкому к оси колеса.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение sledo 20 сен 2016, 15:55

Рекомендации по предотвращению "тряски" автомобиля.
1) Колеса должны находиться в корневой иерархии к какому то ГО, который не содержит компонент коллайдера, так же как и у самих колес и ГО в их иерархии, не должно быть коллайдеров.
2) ГО колес, должны находиться на одинаковом расстоянии от ГО в иерархии которого находятся. К примеру координаты с левого переднего колеса х -1, z 1; переднее правое колесо х 1, z 1; заднее левое колесо х -1, z -1; заднее правое колесо х 1, z -1;
3) Ось колес, т.е. ось Y объектов колес, должна находиться на нулевых координатах оси Y к родительскому объекту. Т.е координаты с левого переднего колеса х -1, y 0, z 1; переднее правое колесо х 1, y 0, z 1; заднее левое колесо х -1, y 0, z -1; заднее правое колесо х 1, y 0, z -1;
3.1) А еще лучше, что бы у всех ГО с WheelCollider координаты были нулевыми, а расставлять коллайдеры с поля "Center".
4) ГО с коллайдером должен находиться в корневой иерархии или лучше поместить в отдельный пустой ГО, поскольку будет рассчитываться "сумма" коллайдеров для центра тяжести, если в скрипте не указано иное.
5) Коллайдеры должны пересекать оси колес. Т.е. для примера выше, размер ГО с коллайдером по оси Z должен быть как минимум 2,1.
5.1) Размеры коллайдеров не должны быть равны нулю, как в поле "Transform" ГО коллайдеров, так и в поле "Size" самих компонентов коллайдеров.
6) Force App Point Dictance должен быть отличен от нуля и находиться как можно ближе к оси колеса. Так в тестовом проекте, для радиуса 0.5, наиболее стабильные результаты давало значение 0.49. Но тут его придется подбирать ручками (что интересно - при движении, когда эффект тряски проявился, изменение значение может не привести к стабилизации автомобиля. Поэтому его надо каждый раз разгонять заново). Следует помнить, что превышение значения над осью колеса, будет давать противоположный эффект крена, что наталкивает на мысль о применении подобного например для крена мотоциклов при повороте. Каких то негативных последствий на данный момент не выявлено.
7) Отношение между весом, жесткостью пружин и жесткостью амортизаторов, должно быть в пределах разумного.
8) (Точно не известно, "баг" был выявлен в чужом проекте) Параметр "Target Position" в "Suspension spring" должен быть отличен от 1 (возможно и от 0).

Кроме того, не забывайте использовать WheelCollider.ConfigureVehicleSubsteps (описание использования, выше).

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

P.S. Один раз проявился странный эффект при весе в 100 - колеса на четверть проваливались под землю и один раз вообще игнорировали Terrain. Причину такого поведения выяснить не удалось.
Последний раз редактировалось sledo 05 окт 2016, 00:59, всего редактировалось 3 раз(а).
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение sledo 21 сен 2016, 19:07

О том, что такое автомобиль.

Как происходит в жизни? Есть топливо, которое окисляется кислородом и при этом выделяет какое то количество энергии. В идеале, каждая молекула кислорода, должна присоединиться к каждой молекуле топлива, а от каждой молекулы топлива, отделиться молекулы, которые делали это топливо стабильным. В случае с бензином, это углерод и водород, сера и т. д. Между количеством углерода и количеством выделяемой энергии, есть прямая связь, и чем больше углерода в топливе, тем меньше будет выделено энергии, а чем больше водорода, тем больше. Все это условно называется эффективным сгоранием топлива или Удельная теплота сгорания , которое как правило выражается в виде коэффициента который равен 43 Мдж/кг. Все это хозяйство при выделении энергии, давит на поршень и стенки цилиндра и условно выражается как среднее индикаторное давление в цилиндре. В свою очередь поршень давит на шатун, который имеет какую то длину, а именно длину рабочего объема цилиндров (как правило так делают, но в целом, шатун может быть любой длины), который давит на шейку колена коленчатого вала, создавая тем самым крутящий момент, на этом самом валу, равный длине колена помноженному на индикаторное давление. Все это дело, называется индикаторное давление двигателя, т.е. можно сказать идеальное.
Вообще на топливе надо остановиться отдельно, для лучшего понимания что это вообще такое в ДВС. Как правило ДВС используют бензин в качестве топлива, реже дизель, и еще реже мазут. Так вот, никто точно не знает, что это за топлива. Тут ситуация примерно такая же как и л.с. - они есть, их можно посчитать, но это не физическая величина и конечная цифра может быть любая. К примеру с бензином, ситуация такая же. Бензин, это смесь высокоуглеродистых веществ и принято считать, что основа его изооктан, который имеет химическую формулу С8Н18 и удельную теплоту сгорания 43 МДж/кг. Обратите внимания сколько водорода в изооктане. Чем больше водорода и меньше связывающих его веществ, тем больше будет удельная теплота сгорания. Предположим возьмем пропан, у которого удельная теплота сгорания выше изооктана. Пропан имеет химическую формулу С3Н8, а его удельная теплота сгорания равна 50,35 Мдж/кг, как раз по тому, что на одну молекулу углерода, приходится больше молекул водорода. Для спирта, который содержит в своей формуле еще и кислород (который уже связал собой какое количество веществ), будет еще ниже чем у изооктана, например для Амилового спирта C5H12O удельная теплота сгорания уже 34.82 Мдж/кг. Для самого же углерода, удельная теплота сгорания 33.30 Мдж/кг. А вот для чистого водорода, удельная теплота сгорания равна 141.8 Мдж/кг. (Кстати, химическая формула древесины, а точнее ее основы — целюлозы, имеет вид C6H10O5 и умные люди, смогут сделать далеко идущие выводы (главное не пиролизить дома!)). Поэтому в принципе можно смело утверждать, что находится некое среднее между удельными теплотами сгорания при окислении вещества, на выходе которого, получается углекислый газ (СО2) и вода (Н2О). Т.е. можно это представить как - кислород, при горении вещества, вступает в реакцию как с водородом, так и с углеродом, тем самым выделяя среднее между этими реакциями количество энергии. Однако поскольку водород имеет бОльшую теплоту сгорания, то всегда стремятся сжечь именно водород, а не что то иное.
В случае с бензином там находится сборная солянка веществ, основные из которых это водород, углерод и сера. Сернистые соединения очень прочные и избавиться от них крайне сложно, и содержание серы в бензине, влияет на его качество. В России добываемая нефть низкого качества, с высоким содержанием серы, потому кроме того что сера разрушает трубы по которым ее вытаскивают на поверхность, снижая рентабильность добычи, еще и получаемый из этой нефти бензин, как правило ниже по качеству чем тот же самый бензин, но полученный из нефти например Ближнего Востока, переработанный например в Европе. Сама же теплота сгорания серы, крайне низкая и равна 10,88 Мдж/кг, поэтому присутствие серы в бензине, мало того что снижает его теплотворные характеристики, так еще и при сгорании такого бензина, кислород соединяясь с серой образует оксид серы SO2, токсичное вещество, который в свою очередь растворяется в воде H2O, которая так же образуется при сгорании, образует сернистую кислоту H2S03, которая как раз и оседает на стенках цилиндра, разрушая масленую пленку, металлах, постепенно разрушая их (особенно сернистые соединения любят нейтрализоторы, где активные вещества — платина, паладий, родий. Хотя конечно разрушение масленой пленки по своим негативным последствиям, намного превосходит окись металлов).
Это основные моменты того, как само топливо влияет на мощность двигателя.
Другим важным компонентом сгорания топливной смеси, является воздушная смесь или просто воздух. Воздух в основном состоит из кислорода и азота который его связывает, в соотношении 30/70. Чем больше кислорода попадет в цилиндры, тем больше можно сжечь топлива, тем больше будет выделено энергии. Однако попаданию воздуха в цилиндры всегда что то мешает и он как бы цепляется за эти препятствия, которые не дают ему туда проникнуть (разные изгибы, гофры, неровные стыки и т.д.). Создается разряжение в впускных коллекторах, по которому можно измерить какое количество воздуха попадает в цилиндры и уже по нему регулировать количество подачи топлива. Это называется инжектор. Инжектор оптимизирует соотношение топлива и воздуха и таким образом оптимизирует сгорание топлива, несколько повышая (или понижая, тут, что нужно производителю, за примером задушенных двигателей далеко ходить не нужно - ВАЗ (к слову, вопреки распространенному мнению, АвтоВаз принадлежит концерну Рено-Ниссан (74,51% с 2014г), а не государству Российскому, так что это вовсе не отечественный автозавод. Так то.)) давление на поршень. Поэтому использование инжектора в ДВС может несколько увеличить мощность двигателя, но не на много и основное предназначение у него, иное.
Простыми средствами в рамках автомобиля изменить это соотношение невозможно, поэтому идут на различные ухищрения. Например ставят нагнетатели. Таким образом увеличивают количество воздуха в одном и том же объеме, а значит и количество кислорода который окисляет топливо. Следовательно, в одном и том же объеме можно сжечь больше топлива, тем самым повысить давление на поршень и таким образом увеличить мощность двигателя. Для этого же используют окисьазота, которая увеличивает количество свободного кислорода при сгорании, благодаря чему, больше топлива им окисляется. Чем больше выделяется энергии, тем больше выделяется тепла (а точнее наоборот), которое нужно куда то девать, что бы детали двигателя не разогрелись до температуры сгорания топлива (1300—1400 °С для бензина, 2800 ° С для водорода, температура плавления алюминия из которого сделаны поршни 660,3°C ), нужно его отводить, для чего делают различные контуры охлаждения и они тем больше, чем больше мощность двигателя. В основном это водяное охлаждение, т.е. вода вокруг цилиндра, но при использовании 95го бензина и выше (атмосферные двигатели), охлаждают еще и поршни, подавая на его дно масло, однако в высоко мощных двигателях, могут использовать даже сжиженные газы для охлаждения двигателя, на подобии холодильных установок.
Охлаждение цилиндров, это плохо для мощности двигателя, поскольку часть выделенной энергии при сгорании топлива, тратится на нагрев деталей двигателя, и тем больше, чем холоднее двигатель. С другой стороны, холодные детали не нагревают поступающий воздух в цилиндры, который при нагревании расширяется и его становится меньше в том же объеме при одном и том же давлении, а значит меньше топлива можно сжечь. Однако у холодного воздуха есть негативная особенность — в нем топливо плохо испаряется, а значит хуже перемешивается с воздухом и не полностью сгорает, что как вы уже поняли, снижает мощность двигателя, особенно это критично для дизельных двигателей. Однако если получается что воздуха несколько больше чем нужно для полного сгорания топлива, т.е. бедная смесь (всегда регулируется подача топлива, а не воздуха для достижения оптимального сочетания топлива и воздуха. Поэтому богатая смесь или обогащенная это когда топлива слишком много, а бедная или обедненная, это когда топлива слишком мало. Давным давно бедными смесями пользовались производители БМВ, потому их движки казались мощнее), то благодаря тому что у молекул кислорода больше шансов окислить молекулы топлива, а значит окисленных молекул будет больше, т.е. сгорит больше топлива, потому холодные двигатели часто мощнее прогретых, но в таком случае они менее экологически чистые. Поэтому в высокофорсированных двигателях вместо бензина используют спирты, как вещество очень хорошо испаряемое и всегда обедненые смеси.
Это в целом все что касается давления на поршень.

Со средним индикаторным давлением разобрались, перейдем к крутящему моменту.
Крутящий момент, как я написал выше ни что иное как давление созданное газами на поршень и плечо колена коленчатого вала. Имеет формулу M = r*F, где М это момент силы, который крутящий момент, r — это длина колена коленчатого вала, который можно обозвать рычагом, F — сила с которой газы давят на поршень. Соответственно единственным динамически изменяемым значением, от которого зависит крутящий момент, является давление газов на поршень. В какой то момент времени, это давление (т.е. топливо сгорает с максимально возможной эффективностью, которое может позволить оборудование двигателя (вот тут как раз и нужен инжектор и прочее) и сам двигатель) достигает своих максимальных значений и тогда говорят, что достигнут максимальный крутящий момент и он равен тому то. Важно понимать, что крутящий момент, не растянут по времени — он произошел один раз и все. Топливо сгорело, толкнуло поршень в низ, поршень шатун, шатун колено коленчатого вала, вал сделал оборот, он передался на колеса, машина тронулась или продолжила движение и на этом весь крутящий момент закончился. Т.е. заставляет двигаться автомобиль, именно крутящий момент и ни что иное.
Мощность же, это количество крутящих моментов за кокой то промежуток времени и имеет формулу P = M * n, где Р — мощность двигателя, М — крутящий момент, n обороты двигателя в минуту. Т.е. ключевым отличием от крутящего момента у мощности является количество совершенных оборотов двигателя за какое то время, или как я писал выше, сколько раз за промежуток времени, этот крутящий момент настал. Когда человек нажал на газ, обороты двигателя начинают увеличиваться, вместе с ними увеличивается скорость автомобиля, т.е. именно мощность, разгоняет автомобиль. С ростом скорости, возрастают силы которые автомобиль останавливают и в основном это силы лобового сопротивления автомобиля. Причем эти силы возрастают в геометрической прогрессии. На преодоление этих сил, тратится энергия сгоревшего топлива, соответственно чем выше скорость, тем больше сил за каждый момент времени останавливает автомобиль, тем сильнее человек давит на педаль газа, что бы как можно больше топлива сгорело, тем самым выделилось как можно больше энергии (прямая зависимость между расходом топлива и скоростью. Снова распространенная чушь, о некой оптимальной скорости - чем меньше скорость, тем меньше расход топлива. Однако надо понимать, что оптимально возможная топливо-воздушная смесь для двигателя, создается в точке максимального крутящего момента - из топлива выжимается максимум энергии которая могут позволить системы двигателя - соответственно при превышении или принижении максимального крутящего момента, всегда будет проигрыш по расходу топлива из за не оптимально приготовленной смеси). Предположим что максимальная мощность двигателя равна 2Н при двух об/сек, автомобиль двигается со скоростью 100км/ч, а силы сопротивления равны 1Н в секунду, соответственно что бы автомобиль двигался с равной скоростью, нужно к нему приложить 1Н в секунду что соответствует одному обороту двигателя. Для того что бы начать ускоряться, нужно приложить уже 2Н в секунду, т. е. Нажать на педаль газа, увеличив тем самым обороты двигателя в два раза, которые теперь будут равны 2 оборота в секунду. С увеличением скорости, возрастут и силы сопротивления движению и к моменту когда автомобиль перестанет набирать скорость, будут равны 2H, сам автомобиль будет двигаться со скорость 150 км/ч, а двигатель будет развивать максимально возможную для него мощность в 2Н при двух оборотах в секунду. Т.е. найдется баланс сил сопротивления движению и сил движения, которая в случае с автомобилем и является максимальной скоростью движения (поэтому распространенная чушь о расходе топлива зависящее непосредственно от оборотов двигателя (Т.е. на скорости 100км/ч при 5000об/мин топлива будет тратиться больше, чем при 100км/ч и 1000об/мин, потому что слишком высокие обороты двигателя), верно только для автомобиля стоящего на месте.).
С мощностью все. Коробка передач.
Единственное предназначение коробки передач в том, что бы водитель имел возможность держать обороты двигателя в диапазоне максимальной мощности, который обычно составляет примерно 1000 об/мин (±), но диапазон зависит от характеристик двигателя.
С коробкой передач все. Колеса, тормоза, сцепление и прочее.
Колеса вещь простая, но мало кто знает о них хоть что то. Колеса обычно резиновые, имеют пятно контакта, на них давит масса автомобиля, и в зависимости от массы автомобиля и типа резины, меняется их сопротивление скольжению.
Вопреки расхожему мнению (вообще чуши вокруг автомобиля много), широкие колеса это вовсе не хорошо и машина не будет лучше сопротивляться прямолинейному движению при поворотах (Fтр = k * m * g, где k - коэффициент сопротивления, m - масса тела, g - ускорение свободного падения). Более того, чем шире поворачиваемые колеса, тем больше будет разница в скоростях на краях покрышки и одним лишь фактом поворота колеса при заходе в поворот, можно сорвать ее в скольжение (наглядный пример - отсутствие дифференциала в главной передаче - примерно тоже самое, но в меньших масштабах происходит при повороте у покрышки. Очень просто и понятно о дифференциале). Именно по этой причине, всегда передние колеса уже задних.
Чем меньше пятно контакта при одном и том же весе (Уже колеса), тем больше будет давление на каждую молекулу колеса в месте контакта, тем сильнее она будет сопротивляться скольжению, однако общая сила трения для всех молекул, останется прежней. Широкие колеса, как и все остальные увеличенные размеры видов механизмов которые связаны с трением, нужны лишь для того, что бы более эффективно рассеивать тепло от возникшего трения, а меньший удельный вес на квадратную единицу площади, позволит меньше нагреваться этой поверхности при скольжении. Большие тормозные диски, ни как не увеличивают эффективность тормозов, т.е. из за этого машина лучше тормозить не станет, но зато не позволяют перегреваться тормозам при частом и интенсивном торможении или при большой массе автомобиля. Диски сцепления ставят керамические не для того, что бы они лучше сцеплялись, а для того, что бы они не перегревались до критических температур (причем керамика не будет хуже нагреваться, хотя конечно у нее и другая теплоемкость/теплопроводность. Просто порог ее разрушаемости от температуры намного выше чем у обычных фрикционных накладок, что накладывает дополнительные проблемы для охлаждения уже КПП и маховика). Точно так же с колесами — чем шире колесо, тем больше пятно контакта, тем меньше сопротивление скольжению на каждую квадратную единицу поверхности, тем меньше выделяемой теплоты и больше теплоемкость резины, поскольку самой резины больше. А вообще, нет широкой и узкой резины. Предположим что есть машина массой 1000кг и шириной резины 10 см, и машина массой 3000кг, и шириной резины 30см. При движении, эти автомобили будут вести себя полностью одинаково, если исключить разность угловых скоростей у широкой резины при поворотах. Однако, если на машину массой 3000 кг, поставить резину шириной 10см, а на машину 1000кг, поставить 30см, то более тяжелая машина будет лучше проходить повороты и реже срываться в занос, в отличии от второй машины. Но если уж сорвется в занос, то выйти из него ему будет сложнее, поскольку охладить резину до критической температуры, т.е. рассеивать увеличившееся выделяемое тепло при скольжении будет некуда, поскольку резины мало и нужно будет снижать скорость, в отличии от второй, более легкой машины. С другой стороны, более легкая машина будет чаще входить в заносы, но и выходить из них ей будет проще.
Поэтому то что для одной машины широкое, для другой может быть узкое, и что для одной машины узкое, для другой может быть широкое.
Увеличить сопротивление скольжению можно лишь либо изменив состав вещества, либо увеличив на это вещество давление (Fтр = k * m * g, где k - коэффициент сопротивления, m - масса тела, g - ускорение свободного падения). Например когда машина трогается с места, то вес переносится к задней оси автомобиля и если нужно резко тронуться, то имеет смысл поставить более широкую резину, что бы не перегревать ее. Точно так же при торможении, вес автомобиля переносится вперед и больше давит на передние колеса, которые всегда из за этого тормозят лучше чем задние (вспоминаем что написано выше - больший вес > больше выделяемого тепла силами трения > больше тормозные механизмы). Странная глупость которую популяризировали что при сносе передней оси у переднеприводных автомобилей, нужно давить на педаль газа, имеет мало общего с действительностью.
Таким образом налицо зависимость площади пятна контакта, к весу автомобиля, которое будет влиять на силы сопротивления скольжению в перспективе. Почему это важно? Предположим что сила сопротивления скольжению равна 0.5Н на каждое ведущее заднее колесо, которых два, а мощность двигателя из примера выше, 2Н при 2 оборотах в секунду и прямая передача. Это значит, что при этой резине, с таким весом, мы можем реализовать от двигателя только 1Н мощности и не сможем двигаться со скоростью 150км/ч, поскольку уже на 100км/ч, колеса начнут пробуксовывать (необычно, да?) и так будет всегда, пока мы не подберем либо соотношение главной передачи, либо другие колеса, либо вес автомобиля. Но если мы будем постоянно ускоряться, тем самым увеличив давление на задние колеса, то сможем на какое то время превысить 100 км/ч благодаря увеличимушемся(< какое то дурацкое слово) весу на задние колеса, до тех пор, пока не перегреем резину.
В жизни это выглядит примерно так — первая передача имеет соотношение около 4х, главная около 5, мощность, допустим 75л.с. Не будем принимать в расчет радиус колеса и тогда при 5500 об/мин, на первой передаче в пятне контакта мы получим примерно 1500 л.с., при сопротивлении обычной резины в примерно 1000 л.с. (все это весьма условно и призвано просто наглядно показать ситуацию). Т.е. реализовать будет возможно лишь 1000 л.с. и если нагрузка будет больше, то колесо начнет проскальзывать и перегреваться.
Тут кстати интересный момент. Благодаря высоким передаточным числам, у Жигуленка с его 70 л.с. на первой передаче мощность на колесах может быть больше, чем допустим у БМВ 7й серии с 5л двигателем и мощностью в 350л.с.
Точно так же, нет разницы насколько мощным мы сделали двигатель автомобиля, до тех пор пока вес и колеса автомобиля будут оставаться прежними, ущерб от "избыточной" мощности узлам и агрегатам автомобиля наноситься не будет, и их износ будет в пределах запланированной нагрузки на них, точно так же, как и не будет изнашиваться двигатель, при условии точного расчета отвода тепла, при новых реалиях сгорания топлива (конечно постоянная эксплуатация с высокими оборотами, укоротит привычное время жизни деталей автомобиля, что может быть ошибочно принято (и принимается!) за преждевременный износ от избыточной мощности. Увеличивается прочность деталей потому, что подразумевается эксплуатация с более высокой скоростью или в необычных для обычного автомобиля условиях. Движение со скоростью 150 км/ч с обычным двигателем и движение со скоростью 200км/ч с форсированным двигателем и измененными соотношениями пар КПП и редуктора, это не одно и тоже, так же как и преодоление лежащих деревьев).

Поскольку при торможении обычно передние колеса имеют бОльшее сопротивление скольжению, то и к тормозным дискам предъявляют бОльшие требования и делают их намного мощнее чем для задних колес. Если предполагается часто сбрасывать скорость, то что бы исключить перегрев тормозных дисков, делают их больше, организуют пассивное охлаждение в виде вентиляции или используют вещества которые не меняют свои свойства при бОльших температурах, например та же керамика. То же относится и к сцеплению.

Теперь к Unity.
Какое имеет все это отношения к ней? А ни какого. Там ничего этого не реализовано в том виде, как это реализовано на автомобиле. Все это нужно писать ручками, забивать в код и только знания процессов происходящих в автомобиле, помогут вам создать имитацию реального автомобиля в Unity.
Но на самом деле все просто — вы можете написать десятки скриптов, полностью воспроизвести процессы, но при оптимизации, вы приведете ваш код в подобие стандартного примера.
Например расчет мощности будет заключаться в одной формуле выше, максимум в трех, если вы хотите добавить гибкости программе. Переключения передач, примет следующий вид:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class MotorTest : MonoBehaviour {

    public Rigidbody motor;
    public float Обороты_двигателя = 0;

    float force_Motor;
    public WheelCollider колесо;
    public float maxMotorTorque;
    public float maxBrakeTorque;
    public float Обороты_колеса;
    public float _скоростьЛевогоКолеса_Км_ч;

    public AudioSource Звук_Двигателя;

    // Use this for initialization
    void Start ()
    {
        motor.maxAngularVelocity = 8000;
    }

    // Update is called once per frame
    void Update ()
    {

        _скоростьЛевогоКолеса_Км_ч = ((2f * 3.14f * колесо.radius) * колесо.rpm) / 1000 * 60;

        Обороты_двигателя = (motor.angularVelocity.magnitude) *10f;

        //Звук_Двигателя.pitch = Обороты_двигателя / 1000;


        if (_скоростьЛевогоКолеса_Км_ч >= 0 && _скоростьЛевогоКолеса_Км_ч < 15)
        {
            //Debug.Log("с 0 по 1");

            Звук_Двигателя.pitch = 0.8f;
        }

        if (_скоростьЛевогоКолеса_Км_ч >= 15 && _скоростьЛевогоКолеса_Км_ч < 50)
        {
            //Debug.Log("с 1 по 50");

            //Debug.Log("_скоростьЛевогоКолеса_Км_ч / 1000 = " + _скоростьЛевогоКолеса_Км_ч / 100);

            Звук_Двигателя.pitch = колесо.rpm / 100;
        }

        if (_скоростьЛевогоКолеса_Км_ч >= 50 && _скоростьЛевогоКолеса_Км_ч < 100)
        {
            //Debug.Log("с 50 по 100");
            //Debug.Log("колесо.rpm = " + колесо.rpm + "   _скоростьЛевогоКолеса_Км_ч = " + _скоростьЛевогоКолеса_Км_ч);
            //Debug.Log("колесо.rpm / 230 = " + колесо.rpm / 230);

            Звук_Двигателя.pitch = колесо.rpm / 230;
        }

        if (_скоростьЛевогоКолеса_Км_ч >= 100 && _скоростьЛевогоКолеса_Км_ч < 150)
        {
            //Debug.Log("с 100 по 150");
            //Debug.Log("колесо.rpm = " + колесо.rpm + "   _скоростьЛевогоКолеса_Км_ч = " + _скоростьЛевогоКолеса_Км_ч);

            Звук_Двигателя.pitch = колесо.rpm / 346f;
        }

        if (_скоростьЛевогоКолеса_Км_ч > 150 && _скоростьЛевогоКолеса_Км_ч < 200)
        {
            //Debug.Log("с 150 по 250");
            //Debug.Log("колесо.rpm = " + колесо.rpm + "   _скоростьЛевогоКолеса_Км_ч = " + _скоростьЛевогоКолеса_Км_ч);

            Звук_Двигателя.pitch = колесо.rpm / 362;
        }

        if (_скоростьЛевогоКолеса_Км_ч > 200 && _скоростьЛевогоКолеса_Км_ч < 250)
        {
            //Debug.Log("с 200 по 250");
            //Debug.Log("колесо.rpm = " + колесо.rpm + "   _скоростьЛевогоКолеса_Км_ч = " + _скоростьЛевогоКолеса_Км_ч);

            Звук_Двигателя.pitch = колесо.rpm / 578;
        }

        if (_скоростьЛевогоКолеса_Км_ч > 250 && _скоростьЛевогоКолеса_Км_ч < 300)
        {
            //Debug.Log("с 250 по 300");
            //Debug.Log("колесо.rpm = " + колесо.rpm + "   _скоростьЛевогоКолеса_Км_ч = " + _скоростьЛевогоКолеса_Км_ч);

            колесо.brakeTorque = 0;
            Звук_Двигателя.pitch = колесо.rpm / 690;
        }

        if (Input.GetKey("2") && _скоростьЛевогоКолеса_Км_ч < 300)
        {
            //Debug.Log("Поехали");

            колесо.brakeTorque = 0;
            force_Motor = maxMotorTorque;
        }
        else
        {
            //Debug.Log("отпустили газ, тормозим");
            force_Motor = 0;
            колесо.brakeTorque = maxBrakeTorque;
        }
    }

    void FixedUpdate()
    {
        Обороты_колеса = колесо.rpm;
        колесо.motorTorque = force_Motor;
    }

}
 


У тормозов лишь добавить коэффициент перегрева, для снижения усилия на них.
Важно лишь одно помнить — motorTorque, brakeTorque и т.п. принимает значение один раз, а не на каждый просчет физики и когда он не нужен, его нужно обнулять). Все остальное - декорации, с которыми уже придется повозиться. А как известно, дьявол сокрыт в деталях.
Последний раз редактировалось sledo 02 апр 2017, 20:28, всего редактировалось 2 раз(а).
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение sledo 26 сен 2016, 03:01

Еще кое что.

Натолкнулся на тему в этом форуме, где человек задавался вопросом как сделать тахометр и верная мысль о том что обороты двигателя, это те же обороты колес (ведущих разумеется), была отвергнута опытными пользователями, которые видимо как им казалось, понимали о чем говорили. Человек извинился и отказался от правильной мысли...
На самом деле ситуация абсолютно типичная. В подростковую пору в моем учебном заведении из 500 учащихся, могло набраться от силы человек 20 которые хоть что то понимали в механике автомобиля, и максимум человек 10, которые полностью представляли процессы происходящие в автомобиле, даже к концу обучения. Что же уж говорить о людях для которых замена свечей, сам по себе подвиг.

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

Точно так же идя от обратного, элементарно вычислить как мощность выдаваемую двигателем, так и его крутящий момент, и уж тем более, его обороты:
Обороты_двигателя = Обороты_колеса * передаточное_число_передачи_КПП * передаточное_число_главной_передачи;
крутящий_момент = диаметр_поршня * диаметр_поршня * ход_поршня * 3.14f * количество_цилиндров * (нажатие_на_педаль_газа(от 0 до 10) * 1817 (давление на поршень для бензина) * коэффициент_для_дизеля);
мощность_двигателя_кВт = крутящий_момент * Обороты_двигателя / 9549; // p = Mkp * n/9549 (кВт), Mkp - Нм, n - об/мин
момент_на_колесе = крутящий_момент * главная_передача * передаточное_число / (максимальные_обороты_двигателя / Обороты_двигателя);

Следует помнить, что дифференциал делит крутящий момент в пропорциях, поэтому при расчетах в Unity надо не на каждое колесо давать рассчитанный крутящий момент, а только половину или, с учетом дифференциала:
Синтаксис:
Используется csharp
if (_скоростьЛевогоКолеса_Км_ч > _скоростьПравогоКолеса_Км_ч
{
       коэфКрутМом = _скоростьЛевогоКолеса_Км_ч / _скоростьПравогоКолеса_Км_ч;
       крутМомЛевогоКолеса = момент_на_колесе * коэфКрутМом;
       крутМомПравогоКолеса = момент_на_колесе / коэфКрутМом;
}
 



Рассчитать pitch звука двигателя, не сложнее:
Звук_Двигателя.pitch = 0.8f + 2 / максимальные_обороты_двигателя * Обороты_двигателя;

Обычно, датчик спидометра стоит на КПП, поэтому он показывает не скорость автомобиля, а скорость колес:
скорость_колеса_Км_ч = ((2f * 3.14f * колесо_ведущее.radius) * колесо_ведущее.rpm) / 1000 * 60;

Так то.
Последний раз редактировалось sledo 18 окт 2016, 00:19, всего редактировалось 2 раз(а).
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение Cr0c 26 сен 2016, 10:04

Интересно почитать теорию (или очень близко к этому).
sledo писал(а):Для особых скептиков поясню - тахометр не измеряет количество оборотов двигателя непосредственно по оборотам коленчатого вала, но измеряет количество раз поданного напряжения на катушку зажигания

Как практиковавший скептик не соглашусь. Тахометр как раз частоту вращения двигателя показывает (на карбюраторных по распредвалу, на инжекторных по коленвалу). Если хочется считать обороты по колесу - то о какой реалистичности разговор? Если реалистично - есть абстракция двигателя, который имеет обороты и мощность - в ней УЖЕ есть обороты.
По большому счету, в играх идёт ухудшение идеального двигателя (его проще реализовать) до большей похожести на реальный. Никто же не впихивает в игры реализацию зависимости мощности двигателя от температуры ОЖ и масла, зависимость высоты покрышки к пятну контакта и центобежной силы (срыв машины с траектории, занос)... Всё это усредняется до более простых характеристик, хотя теория желательна для более-менее точной настройки. Но кто ж будет искать такие данные?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2293
Зарегистрирован: 19 июн 2015, 13:50

Re: Wheelcollider - как его использовать.

Сообщение sledo 26 сен 2016, 17:28

Cr0c писал(а):Интересно почитать теорию (или очень близко к этому).
Как практиковавший скептик не соглашусь. Тахометр как раз частоту вращения двигателя показывает (на карбюраторных по распредвалу, на инжекторных по коленвалу). Если хочется считать обороты по колесу - то о какой реалистичности разговор? Если реалистично - есть абстракция двигателя, который имеет обороты и мощность - в ней УЖЕ есть обороты.
По большому счету, в играх идёт ухудшение идеального двигателя (его проще реализовать) до большей похожести на реальный. Никто же не впихивает в игры реализацию зависимости мощности двигателя от температуры ОЖ и масла, зависимость высоты покрышки к пятну контакта и центобежной силы (срыв машины с траектории, занос)... Всё это усредняется до более простых характеристик, хотя теория желательна для более-менее точной настройки. Но кто ж будет искать такие данные?

У меня есть незначительные неточности в текстах, но первое - они на суть не влияют, второе - вы говорите не о них.
Но раз уж вы взяли под сомнение мои разъяснения по определению оборотов двигателя, по оборотам колеса, то разберу ваш пост.

1) "Тахометр как раз частоту вращения двигателя показывает" - нигде не утверждается обратное.
2) "(на карбюраторных по распредвалу, на инжекторных по коленвалу)" - ни карбюратор, ни инжектор ни как не влияют на конструкцию зажигания, что бы по ним предполагать, откуда берутся значения тахометра. Любой здравомыслящий производитель, берет эти показания с катушки зажигания (в общем смысле). Убеждаемся в этом - электронная схема тахометра . Вы говорите о том, откуда берутся значения для зажигания, но даже тут правы лишь на 50%. На карбюраторных двигателях, может стоять как контактная система зажигания, так и без контактная, а так же электронная система зажигания. Точно так же как на инжекторных моторах. Системы подачи топлива и системы зажигания - это разные вещи. Тахометр берет значения с системы зажигания.
3) "Если хочется считать обороты по колесу - то о какой реалистичности разговор?" - я еще раз повторяю - в системе приводов с жесткой сцепкой, нет разницы с какого места снимать значения - везде они будут верными по той простой причине, что жесткая сцепка передает 100% крутящего момента. Исключения составляют гидропривода, как например в АКПП или спецтехнике, что имитируется простым коэффициентом. Это значит, что при прямой передаче имея в системе 10 приводов, какой то один вал будет крутиться с угловой скоростью 10 об/мин, то и все остальные валы, будут крутиться со скоростью 10 об/мин.
Простой эксперимент - возьмите в руку ручку и покрутите ее одной рукой - количество оборотов будет один и тем же на каждый момент длины ручки. Ваша рука будет выступать в роли двигателя, а передаточное число от вашей руки к ручке, будет равно 1. Это значит, что ручка будет крутиться с той же угловой скоростью, что и ваша рука и откуда конкретно вы будете снимать значения угловых скоростей в пределах системы рука-ручка - абсолютно нет ни какой разницы - всякий раз, вы получите количество оборотов как руки, так и ручки, равными друг другу.
Для тех кто все же не понял, проведу расчеты -
Для ВАЗ 21011:
1-я — 3.753; 2-я — 2.303; 3-я — 1.493; 4-я — 1; редуктор 4.3 (4.1)
Обороты максимальной мощности - 5600 об/мин.
Узнаем обороты двигателя на скорости, допустим 93,5 км/ч при включенной 3й передаче.
скорость_колеса_Км_ч = ((2f * 3.14f * колесо_ведущее.radius) * колесо_ведущее.rpm) / 1000 * 60;
колесо_ведущее.rpm = (скорость_колеса_Км_ч * 1000 / 3600) / (колесо_ведущее.radius / (2f * 3.14f)) * 60 = 827
Обороты_двигателя = Обороты_колеса * передаточное_число_КПП * передаточное_число_редуктора;
Обороты_двигателя = 827 * 1.493 * 4,3 = 5309,2573 об/мин

Узнаем максимальную скорость ВАЗ 21011, без учета лобового сопротивления:
Обороты_колеса = 5600 / 4,3 / 1 = 1302,325581395349
скорость_колеса_Км_ч = ((2f * 3.14f * 0.3) *1279) / 1000 * 60 = 147,2148837209302 км/ч

Заявленная максимальная скорость ВАЗ 145 км/ч

4) "Если реалистично - есть абстракция двигателя, который имеет обороты и мощность - в ней УЖЕ есть обороты." - вообще не ясно для чего вы это написали. Формула из поста выше, дает полное представление что такое мощность и какие данные в ней содержатся - p = Mkp * n, где - Mkp момент силы Нм, n -обороты двигателя об/мин
5) "По большому счету, ... такие данные?" - я бы рекомендовал вам не думать за других людей что и как они будут делать - это очень полезная привычка.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение Cr0c 26 сен 2016, 18:39

sledo писал(а):тахометр не измеряет количество оборотов двигателя непосредственно по оборотам коленчатого вала, но измеряет количество раз поданного напряжения на катушку зажигания (если она есть конечно), за определенное время

sledo писал(а):"Тахометр как раз частоту вращения двигателя показывает" - нигде не утверждается обратное.

Только фраза выглядит как раз так, что тахометр меряет что-то другое, похожее на обороты двигателя.
sledo писал(а):Любой здравомыслящий производитель, берет эти показания с катушки зажигания (в общем смысле)

99% существующих конструкторов инжекторных (да и дизельных тоже) двигателей с Вами не согласятся. Либо все они не являются здравомыслящими :)
sledo писал(а):Исключения составляют гидропривода, как например в АКПП

Не слишком ли много допущений? Или про роботизированные АКПП забыли? Дифференциал учитывать вообще не стоит?
sledo писал(а):вообще не ясно для чего вы это написали

К тому, что если реалистично - будет агрегат двигатель со всеми параметрами работы и "считать обороты двигателя по любому колесу" звучит как издевка. А если нет реалистичности - то rigidbody.velocity вполне удовлетворит.
sledo писал(а):я бы рекомендовал вам не думать за других людей что и как они будут делать

Я Вам то же самое рекомендовал бы :)
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2293
Зарегистрирован: 19 июн 2015, 13:50

Re: Wheelcollider - как его использовать.

Сообщение sledo 26 сен 2016, 21:02

Cr0c писал(а):Только фраза ... омендовал бы :)

Я вижу про зависимость оборотов двигателя и колеса, вы таки поняли. Про тахометр я не буду комментировать, ибо к делу мало относится, а приведенная ссылка полностью показывает положение дел. Допущений ровно столько, что бы дать людям представление о том, что такое автомобиль с технической точки зрения. Считать можно что угодно и по чему угодно, лишь бы это было связано с системой (вы не поверите, но к примеру планеты открывают не по тому что их видят, а по тому, что они воздействуют на звезду и она совершает движения по оси в плоскости. Причем находят даже приблизительную температуру поверхности планеты и ни кто это не считает издевкой. Более того, найденные по косвенным признакам планеты, не переходят из реальности в нечто иное и вы можете вполне себе это сделать в Unity и эти планеты будут точно такими же как и в реальности). И я ни за кого не думаю, а констатирую факты в рамках предложенного контекста, давая людям возможность выбора действий.
С последним постом вы снова ошиблись темой, разделом, да и форумом. Выше я вам уже писал, что "если у вас есть практические знания как применять то или иное, когда это надо применить, почему и что изменится или есть вопросы по заданной автором теме, пишите их". Тут не маленькие дети в детском саду играют в кубики, а взрослые дядьки, занимаются серьезными вещами и помогают ими заниматься другим. Если вам хочется пофлудить, поковыряться в слове игнорируя контекст, поумничать, занять системную оппозицию, просто поогрызаться и т.д. - то вы с успехом это можете делать например на ответах.маил и всем будет плевать. Тут же, свое мнение нужно обосновывать, а часто и доказывать что бы не выглядеть бесполезной единицей.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение Cr0c 26 сен 2016, 22:15

Я понял, Ваша точка зрения - единственно верная.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2293
Зарегистрирован: 19 июн 2015, 13:50

Re: Wheelcollider - как его использовать.

Сообщение sledo 28 сен 2016, 04:00

Калибровочные данные. При разногласиях расчетных данных к замерочным данным, преимущество имеют замерочные данные, перед расчетными данными (к примеру расчетная мощность равна 50,7 кВт, а разгон до 100 км/ч в Unity по какой то причине не равен 18 сек (-+) при заводских передаточных числах, то замерочный разгон имеет преимущество перед расчетной мощностью и мощность следует подобрать исходя из замеров на время, например путем регулировки максимальных значений "педали газа").

ВАЗ 21011

Вес, кг 955
Полная масса 1355 кг
Грузоподъемность, кг 400
Масса приходящаяся на переднюю ось, кг:
снаряженного автомобиля 515
полная 615
Масса приходящаяся на заднюю ось, кг:
снаряженного автомобиля 440
полная 740
Диаметр разворота, м 11.2
Колея передняя, мм 1349
Колея задняя, мм 1305
Колесная база, мм 2424
Клиренс при полной нагрузке и нормальном давлении в
шинах, мм:
до поперечины передней подвески 175
до балки заднего моста 170
до маслянного картера двигателя 182
Схождение передних колес для обкатанного автомобиля под нагрузкой, при замере между ободом и вертикалью, мм 2 - 4
Ход подвески
Передняя:
вверх, мм 90
вниз, мм 65,5
Задняя:
вверх, мм 75
вниз, мм 175
Передние амортизаторы:
Номинальные усилия при скорости поршня 0,31 м/с, Н (кгс):
- ход сжатия 235 (24)
- ход отбоя 1154 (117,6)
Задние амортизаторы :
Номинальные усилия при скорости поршня 0,31 м/с, Н (кгс):
- ход сжатия 283 (28,8)
- ход отбоя 1060 (108)
Жесткость пружин, кг/мм 3,53
Размер шин (мм) 165/80 R13 (595) Калькулятор
Максимальная скорость, км/ч
с наибольшей нагрузкой 143
с водителем и пассажиром 145
Время разгона с места до
скорости 100 км/ч, сек:
при полной массе автомобиля 20
с водителем и одним пассажиром 18
Расстояние на разгон, м 141
Максимальный подъем при протяженности не менее двойной длины автомобиля, преодолеваемый без разгона при полной массе автомобиля, % 34
Ресурс двигателя:
125 тыс.км
Масса двигателя, кг 114.
Количество цилиндров 4
Диаметр цилиндра 79 мм
Ход поршня 66 мм.
Мощность двигателя, л.с (кВт) / оборотах 69 (50,7)/5600
Крутящий момент, н·м / оборотах 96/3400
Передаточные числа КПП
1-я — 3.753; 2-я — 2.303; 3-я — 1.493; 4-я — 1; Задняя передача — 3.867
Передаточное число редуктора
4.3(4.1)
Передаточное число редуктора рулевого механизма 16,4
Тормозной путь при полной массе автомобиля со скорости 80 км/ч, м 43,2
Коэффициент лобового сопротивления, Cx — 0,52

Вес агрегатов ВАЗ-2106 (кг):
- двигатель с оборудованием: 140
- коробка передач: 26
- карданный вал: 10
- задний мост: 52
- радиатор: 7
- кузов: 280




Значение φ покрытий:
Виды покрытия......сухое ......влажное
Цементобетонное...0,7—0,8.....0,35—0,45
Асфальтобетонное..0,6—0,7.....0,25—0,40
Грунтовое ............0,5—0,6.....0,30—0,40
Песчаное..............0,5—0,6.....0,40—0,50
Снежное...............0,2—0,3
Обледенелое.........0,08—0,1
Последний раз редактировалось sledo 08 апр 2017, 03:43, всего редактировалось 1 раз.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Wheelcollider - как его использовать.

Сообщение End_User 16 фев 2017, 09:30

Некоторые данные по Т-34-85 (1944 года):

Вес 30500кг.
Всё остальное, вроде 150кг дорожного колеса, сантиметры хода подвески, скорость, график и коэффициент трения... Всё это уже не важно и более настроить невозможно.
Wheel Collider начинает и не прекращает глючить.
End_User
UNец
 
Сообщения: 22
Зарегистрирован: 02 фев 2014, 15:30

След.

Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4