Проблема с плавным движением шатуна в КШМ

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Проблема с плавным движением шатуна в КШМ

Сообщение le4o 31 май 2011, 17:47

Здравствуйте!
Делаю ролик с работающим кривошипно-шатунным механизмом.
Шатун не двигается плавно вместе с кривошипом, а болтается туда-сюда.

В Update() вызываю такую функцию:
Синтаксис:
Используется csharp
float r1 = 15.0f; //длина кривошипа
float r2 = 35.0f; // длина шатуна
float fi = 0.0f; // текущий угол поворота кривошипа
float fi_step = 1.0f; // шаг угла поворота кривошипа
float alpha; // угол поворота шатуна
float alpha_step;
       
void Start () {
        alpha = Mathf.Asin(r1/r2);
        alpha *= 180/Mathf.PI; // максимально возможный угол поворота шатуна
        alpha_step = alpha*fi_step/90; // шаг высчитывается так, чтобы при 90 углах кривошипа шатун тоже достиг наибольшего отклонения
                                                     
}

...
...
...
void UpdateShatuns() {
        float curr_fi = fi*Mathf.PI/180;
        float new_pos_x = (base_shatun.transform.position.x + base2.transform.position.x)*0.5f; //новые координаты шатуна (середина между суставом и поршнем)
        float new_pos_y = (base_shatun.transform.position.y + base2.transform.position.y)*0.5f;
        shatun2_1.transform.position = new Vector3(new_pos_x, new_pos_y, shatun2_1.transform.position.z);
        shatun2_2.transform.position = new Vector3(new_pos_x, new_pos_y, shatun2_2.transform.position.z);
        int mn = 0; // множитель, определяет направление вращения шатуна - вверх или вниз
        if (fi <= 90.0f) {
                mn = -1;
        } else if (fi <= 180.0f) {
                mn = 1;
        } else if (fi <= 270.0f) {
                mn = 1;
        } else if (fi <= 360.0f) {
                mn = -1;
        }
        shatun2_1.transform.Rotate(0, 0, mn*alpha_step, Space.World);
        shatun2_2.transform.Rotate(0, 0, mn*alpha_step, Space.World);
}

void Update () {
        fi += fi_step;
        if (fi >= 360.0f) fi = 0.0f;
       
        UpdateKrivoship(); // вращение кривошипа
        UpdateBase2(); // толкание поршня
        UpdateShatuns(); // вращение шатуна      
}

Помогите пожалуйста с плавным кручением шатуна с остальными частями КШМ'а.
У вас нет доступа для просмотра вложений в этом сообщении.
le4o
UNец
 
Сообщения: 4
Зарегистрирован: 29 янв 2011, 11:34
Откуда: славный город на Уде
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Ert Donuell 31 май 2011, 18:07

Если я не ошибаюсь, то ограничив степени свободы механизма до одной (например, незримыми коллайдерами), Вы сможете воспользоваться джоинтами для создания рычажного соединения, а затем задать вращение кривошипу. Попробуйте (popcorn)
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Ert Donuell 31 май 2011, 18:17

Приложите Web сборку. Или видео. Кстати, поршень и шатун должны иметь между собой шарнирное соединение, иначе поршень будет продолжением шатуна.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Ert Donuell 31 май 2011, 18:23

Возможно, Вам будет полезен прикреплённый к сообщению курсовой графический расчёт механизма. Удачи ;)
У вас нет доступа для просмотра вложений в этом сообщении.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение le4o 31 май 2011, 18:58

Ert Donuell, спасибо большое за отзыв :)
Про joint'ы не слышал, буду разбираться.
Вашу работу тоже почитаю. Спасибо!

Под спойлером веб-сборка.
Скрытый текст:
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://perython.gb7.ru/crank/WebPlayer.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>
le4o
UNец
 
Сообщения: 4
Зарегистрирован: 29 янв 2011, 11:34
Откуда: славный город на Уде
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Ert Donuell 31 май 2011, 19:18

Всегда пожалуйста ;)

Я тут заметил интересную вещь:
le4o писал(а):
Синтаксис:
Используется csharp
float r1 = 15.0f; //длина кривошипа
float r2 = 35.0f; // длина шатуна
float fi = 0.0f; // текущий угол поворота кривошипа
float fi_step = 1.0f; // шаг угла поворота кривошипа
float alpha; // угол поворота шатуна
float alpha_step;
       
void Start () {
        alpha = Mathf.Asin(r1/r2);
        alpha *= 180/Mathf.PI; // максимально возможный угол поворота шатуна
        alpha_step = alpha*fi_step/90; // шаг высчитывается так, чтобы при 90 углах кривошипа шатун тоже достиг наибольшего отклонения
                                                     
}

...
...
...
void Update () {
        fi += fi_step;
        if (fi >= 360.0f) fi = 0.0f;
       
        UpdateKrivoship(); // вращение кривошипа
        UpdateBase2(); // толкание поршня
        UpdateShatuns(); // вращение шатуна      
}


У Вас выходит, что шатун изменяет положение после изменения положения поршня, в то время как поршень должен зависеть от положения шатуна. Возможно, в функциях UpdateShatuns() и UpdateBase2() Вы изменяете какую-то общую переменную, просто в неправильном порядке?
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Order 01 июн 2011, 05:30

А может процедурно сделать ? Чисто математически посчитать положения объектов.
А еще красивее и оптимальнее сделать анимацию модели в 3Dmax.
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Проблема с плавным движением шатуна в КШМ

Сообщение le4o 01 июн 2011, 08:28

У Вас выходит, что шатун изменяет положение после изменения положения поршня, в то время как поршень должен зависеть от положения шатуна. Возможно, в функциях UpdateShatuns() и UpdateBase2() Вы изменяете какую-то общую переменную, просто в неправильном порядке?

В каждый момент времени я просчитываю положение кривошипа, шатуна и поршня в пространстве. Их новые координаты зависят от длин кривошипа и шатуна(которые постоянны) и текущего угла поворота. Т.е. друг от друга они(кривошип, шатун и поршень) не зависят, и можно в любом порядке просчитывать их новое положение в пространстве.
А может процедурно сделать ? Чисто математически посчитать положения объектов.
Если я вас правильно понял, так и делаю.

Если с помощью Joint получится сделать, то вращать буду только кривошип.
А пока получилось следующее
настройки:
Скрытый текст:
Изображение
веб:
Скрытый текст:
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/5178382/CrankMechanismV2.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>
Почему болтается, непонятно мне.

upd: увидел, что есть Configurable Joint. Буду с ним экспериментировать.
le4o
UNец
 
Сообщения: 4
Зарегистрирован: 29 янв 2011, 11:34
Откуда: славный город на Уде
  • ICQ

Re: Проблема с плавным движением шатуна в КШМ

Сообщение Order 01 июн 2011, 09:47

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/30997989/WebPlayer.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>


Стало интересно набросал скриптик, сильно не вылизывал код и не коментировал.
есть костыли, но работает как надо.

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

public class Main : MonoBehaviour
{
        public GameObject KshpGO;
        public Quaternion KshpRotation;
        public Vector3 KshpAngles;
        public float KshpAnglesX;
        public float KshpX;
        public float KshpY;
        public float KshpR;
       
        public float AngleKSM;
       
       
        public GameObject ShtnGO;
        public Quaternion ShtnRotation;
        public float ShtnL;
        public float Speed;
       
        public GameObject PorshGO;
       
        void Start ()
        {
                KshpGO = GameObject.Find("Kshp");
                ShtnGO = GameObject.Find("Shtn");
                PorshGO = GameObject.Find("Porsh");
                KshpAngles = KshpGO.transform.eulerAngles;
                KshpAnglesX = KshpAngles.z;
                KshpR = Vector3.Distance(ShtnGO.transform.position , KshpGO.transform.position);
                ShtnL = 6;
                Speed = -1;
        }

        void OnGUI()
        {
                GUI.Label(new Rect(80, 30, 500, 20), Speed.ToString());
                if (GUI.Button(new Rect(10,10,60,20),"Speed+")) Speed = Speed+1;
                if (GUI.Button(new Rect(10,30,60,20),"Speed-")) Speed = Speed-1;
        }
       
        void Update ()
        {
                AngleKSM += Time.deltaTime*Speed;
                if (AngleKSM >= 6.283f) AngleKSM = 0;
                if (AngleKSM <= -6.283f) AngleKSM = 0;
                RotateKshp (AngleKSM);
        }
       
        public void RotateKshp (float KshpA)
        {
                KshpX = Mathf.Cos(KshpA+1.571f)*KshpR;
                KshpY = Mathf.Sin(KshpA+1.571f)*KshpR;
                KshpAngles.z = 57.296f * KshpA;
                KshpRotation = Quaternion.Euler(KshpAngles.x, KshpAngles.y, KshpAngles.z);
                KshpGO.transform.rotation = KshpRotation;
               
                PorshGO.transform.position = new Vector3(PorshGO.transform.position.x, Mathf.Sqrt(ShtnL*ShtnL - KshpX*KshpX)+KshpY ,PorshGO.transform.position.z);
               
                ShtnGO.transform.position = KshpGO.transform.position + new Vector3(KshpX,KshpY,0);
                Vector3 ShtnDir = PorshGO.transform.position - ShtnGO.transform.position;
                float ShtnAngle = Vector3.Angle(ShtnDir ,Vector3.up);
               
                if (57.296f * KshpA > 0) if ((57.296f * KshpA > 0) && (57.296f * KshpA < 180)) ShtnAngle = -ShtnAngle;
                if (57.296f * KshpA < 0) if ((57.296f * KshpA > -360) && (57.296f * KshpA < -180)) ShtnAngle = -ShtnAngle;
               
                Debug.Log(57.296f * KshpA);
               
                ShtnRotation = Quaternion.Euler(0, 0, ShtnAngle);
                ShtnGO.transform.rotation = ShtnRotation;
        }
}

 
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Проблема с плавным движением шатуна в КШМ

Сообщение le4o 03 июн 2011, 12:06

Order, спасибо большое за помощь :)
Из вашего скрипта узнал, как можно поворачивать объекты с помощью кватеринионов. Оказалось все просто.
Теперь весь механизм вращается как надо.
le4o
UNец
 
Сообщения: 4
Зарегистрирован: 29 янв 2011, 11:34
Откуда: славный город на Уде
  • ICQ


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 12