Все никак не получу нужный результат. У игрока в руках оружие, я хочу чтобы оно плавно следило за камерой. Проблемы начинаются когда я смотрю на игрока с лицевой стороны. Я делаю ограничение вращения, и в итоге я получаю только минимальный или максимальный угол:
lookAtPoint = Application.instance.MainCamera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 20f));
var rotation = Quaternion.LookRotation(lookAtPoint - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 10);
transform.eulerAngles = new Vector3(ClampAngle(transform.eulerAngles.x, -6, 10), ClampAngle2(transform.eulerAngles.y, 300, 340), 0);
public float ClampAngle(float angle, float min, float max)
{
if (angle < 90 || angle > 270)
{ // if angle in the critic region...
if (angle > 180) angle -= 360; // convert all angles to -180..+180
if (max > 180) max -= 360;
if (min > 180) min -= 360;
}
angle = Mathf.Clamp(angle, min, max);
if (angle < 0) angle += 360; // if angle negative, convert to 0..360
return angle;
}
protected float ClampAngle2(float angle, float min, float max)
{
angle = NormalizeAngle(angle);
if (angle > 180)
{
angle -= 360;
}
else if (angle < -180)
{
angle += 360;
}
min = NormalizeAngle(min);
if (min > 180)
{
min -= 360;
}
else if (min < -180)
{
min += 360;
}
max = NormalizeAngle(max);
if (max > 180)
{
max -= 360;
}
else if (max < -180)
{
max += 360;
}
// Aim is, convert angles to -180 until 180.
return Mathf.Clamp(angle, min, max);
}
protected float NormalizeAngle(float angle)
{
while (angle > 360)
angle -= 360;
while (angle < 0)
angle += 360;
return angle;
}
данный вариант нормально работает когда я смотрю со спины, но когда прокручу и посмотрю с лица - оружие дергается между двумя значениями.