Нет, не в тему, там два риджитбади объекта связываются посредством шарнирного соединения, и к свободному вращению тела в падении не имеют отношения. Ну я уже писал (очень давно)
Есть такая игрушка неваляшка мне надо почти такое.Добавлено (10 июля 2017, 13:55)
---------------------------------------------
ПС. Простой физикой не выйдет однозначно, надо скриптами контролировать
Добавлено (10 июля 2017, 16:18)
---------------------------------------------
Сколько не пытался придумать, дальше этого не пошло
Код
Rigidbody rb;
public Transform _sample; // Образец для подражания
public Transform _baseOfColumn; // Пустышка в основании столбика с риджит бади
public float _angle; // Угол между образцом и столбиком
// Use this for initialization
void Start()
{
rb = _baseOfColumn.GetComponent<Rigidbody> ( );
}
// Update is called once per frame
void FixedUpdate()
{
Quaternion _base = _baseOfColumn.rotation;
Quaternion _smpl = _sample.rotation;
_angle = Quaternion.Angle(_base, _smpl);
if (_angle > 40)
{
// Этот вариант ведёт себя очень странно
transform.rotation = Quaternion.Slerp(_base, _smpl, 0.5f);
// В этом прыгает всё время хотя и не падает
_baseOfColumn.rotation = Quaternion.Slerp(_base, _smpl, 0.5f);
// И в этом тоже прыгает всё время и тоже не падает
rb.rotation = Quaternion.LerpUnclamped(_base, _smpl, 1f);
// И в этом тоже прыгает всё время и тоже не падает
rb.MoveRotation(Quaternion.LerpUnclamped(_base, _smpl, 1f));
//
}
}
Добавлено (21 июля 2017, 09:39)
---------------------------------------------
Всем спасибо за участие, пришлось самому помудрить и почитать, и вот что в итоге получилось, если кому будет интересно вот видео
Видео
а вот и сам код
Код
Transform TransformTestCube;
float rotateAxisZ;
float rotateAxisX;
public Text infoText;
string str = "";
public Transform AxisOfRotation;
public float speedR = 10f;
public bool stabilizationIsEnabled;
public float limitAngle = 30f;
private Vector3 eulerAng;
// Use this for initialization
void Start()
{
TransformTestCube = transform;
}
// Update is called once per frame
void FixedUpdate()
{
if (Input.GetKeyUp(KeyCode.C))// Включение / выключение стабилизатора
stabilizationIsEnabled = !stabilizationIsEnabled;
// Вывод данных о наклоне на дисплей
str = "Поворот по оси Z: ";
// Получаем величину наклона объекта по оси Z
rotateAxisZ = TransformTestCube.eulerAngles.z;
str += rotateAxisZ.ToString();
// Получаем величину наклона объекта по оси X
rotateAxisX = TransformTestCube.eulerAngles.x;
str += "\n" + "Поворот по оси X: " + rotateAxisX.ToString();
infoText.text = str;
// Собственно сам стабилизатор
if (stabilizationIsEnabled)
{
eulerAng = TransformTestCube.eulerAngles;
// Проверяем угол наклона по оси Z
// если наклон до 180 градусов значит объект наклоняется влево
if (rotateAxisZ >= limitAngle && rotateAxisZ < 180)// И одновременно проверяем достиг наклон лимита
{
// если достиг или превысил лимит наклона присваиваем величину лимита углу z переменной eulerAng
eulerAng.z = limitAngle;
// И поворачиваем трансформ на угол eulerAng
TransformTestCube.eulerAngles = eulerAng;
}
// Проверяем угол наклона по оси X
// если наклон до 180 градусов значит объект наклоняется вперёд
if (rotateAxisX >= limitAngle && rotateAxisX < 180)
{
eulerAng.x = limitAngle;
TransformTestCube.eulerAngles = eulerAng;
}
// Проверяем угол наклона по оси Z
// если наклон больше 180 градусов значит объект наклоняется вправо
if (rotateAxisZ <= (360 - limitAngle) && rotateAxisZ > 180)//При наклоне вправо вычисляем нужный угол (360 - limitAngle)
{
eulerAng.z = 360 - limitAngle;
TransformTestCube.eulerAngles = eulerAng;
}
// Проверяем угол наклона по оси X
// если наклон больше 180 градусов значит объект наклоняется назад
if (rotateAxisX <= (360 - limitAngle) && rotateAxisX > 180)
{
eulerAng.x = 360 - limitAngle;
TransformTestCube.eulerAngles = eulerAng;
}
// Индикация работы стабилизатора
AxisOfRotation.rotation *= Quaternion.AngleAxis(speedR * Time.deltaTime, Vector3.up);
}
}
Ещё раз спасибо, если кто найдёт способ оптимизировать код или что то поправить буду благодарен.