Программная имитация сервомотора.
Добавлено: 04 мар 2019, 08:39
Всем привет.
Нужно сделать сервомотор, написал скрипт
но проблема в том, что в таком скрипте серва моментально перескакивает из текущего положения в заданное, а физическая серва затрачивает на это некоторое время.
Два вопроса:
1.Как сделать перебор всех углов от текущего к заданному?
2.Как замедлить выполнение команды, чтобы это выглядело физически правдоподобно?
и желательно с возможность регулировки скорости.
UPD я не могу напрямую применить скорость, т.к. основной параметр это угол поворота.
Нужно сделать сервомотор, написал скрипт
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Serva : MonoBehaviour
{
public bool ROOT;
public Serva ParentScript;
public Vector3 Axis;
public bool UseLimit;
public float Limit_MIN;
public float Limit_MAX;
public float Angle;
private float PrevParentAngle;
void Start()
{
}
void Update()
{
if (!ROOT)
{
if (Axis.x == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(Angle, 0, 0);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(Limit_MIN, 0, 0);
}
else
{
transform.localRotation = Quaternion.Euler(Limit_MAX, 0, 0);
}
}
else
{
transform.localRotation = Quaternion.Euler(Angle, 0, 0);
}
PrevParentAngle = ParentScript.Angle;
}
else if (Axis.y == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(0, Angle, 0);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(0, Limit_MIN, 0);
}
else
{
transform.localRotation = Quaternion.Euler(0, Limit_MAX, 0);
}
}
else
{
transform.localRotation = Quaternion.Euler(0, Angle, 0);
}
}
else if (Axis.z == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(0, 0, Angle);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(0, 0, Limit_MIN);
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, Limit_MAX);
}
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, Angle);
}
}
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class Serva : MonoBehaviour
{
public bool ROOT;
public Serva ParentScript;
public Vector3 Axis;
public bool UseLimit;
public float Limit_MIN;
public float Limit_MAX;
public float Angle;
private float PrevParentAngle;
void Start()
{
}
void Update()
{
if (!ROOT)
{
if (Axis.x == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(Angle, 0, 0);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(Limit_MIN, 0, 0);
}
else
{
transform.localRotation = Quaternion.Euler(Limit_MAX, 0, 0);
}
}
else
{
transform.localRotation = Quaternion.Euler(Angle, 0, 0);
}
PrevParentAngle = ParentScript.Angle;
}
else if (Axis.y == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(0, Angle, 0);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(0, Limit_MIN, 0);
}
else
{
transform.localRotation = Quaternion.Euler(0, Limit_MAX, 0);
}
}
else
{
transform.localRotation = Quaternion.Euler(0, Angle, 0);
}
}
else if (Axis.z == 1)
{
if (UseLimit == true)
{
if (Angle >= Limit_MIN && Angle <= Limit_MAX)
{
transform.localRotation = Quaternion.Euler(0, 0, Angle);
}
else if (Angle < Limit_MIN)
{
transform.localRotation = Quaternion.Euler(0, 0, Limit_MIN);
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, Limit_MAX);
}
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, Angle);
}
}
}
else
{
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
}
но проблема в том, что в таком скрипте серва моментально перескакивает из текущего положения в заданное, а физическая серва затрачивает на это некоторое время.
Два вопроса:
1.Как сделать перебор всех углов от текущего к заданному?
2.Как замедлить выполнение команды, чтобы это выглядело физически правдоподобно?
и желательно с возможность регулировки скорости.
UPD я не могу напрямую применить скорость, т.к. основной параметр это угол поворота.