Делаю ролик с работающим кривошипно-шатунным механизмом.
Шатун не двигается плавно вместе с кривошипом, а болтается туда-сюда.
В 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(); // вращение шатуна
}
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(); // вращение шатуна
}
Помогите пожалуйста с плавным кручением шатуна с остальными частями КШМ'а.