Euler Rotation Issue - PullRequest
       13

Euler Rotation Issue

1 голос
/ 19 мая 2019

Я работаю над простым кусочком кода на C #, чтобы убедиться, что голова модели игрока указывает на векторную позицию мыши (lookPoint), но она зажимается между диапазоном 90 градусов, 45 градусов по обе стороны от туловища.текущее направление.

Я поэкспериментировал с результатами углов Эйлера, чтобы убедиться, что получаю желаемое значение поворота для оси y, но я борюсь с тем, чтобы угол Эйлера снова стал равным 0и я не могу понять, как с этим разобраться.

 minRot = myTorso.transform.rotation.eulerAngles.y-180f-45f;
 maxRot = myTorso.transform.rotation.eulerAngles.y-180f+45f;

 lookDirection = Mathf.Atan2(lookPoint.x - transform.position.x, lookPoint.z - transform.position.z);
 lookRotation = Mathf.Clamp(Mathf.Rad2Deg * lookDirection, minRot, maxRot);

 myHead.eulerAngles = new Vector3(0,lookRotation,0);

Это приводит к тому, что голова возвращается к одной из крайностей, когда она не может понять, каким должен быть ее максимум или минимум.

Может кто-нибудь помочь мне определить minRot иmaxRot, чтобы он составлял 180 градусов кроссовера?

1 Ответ

0 голосов
/ 19 мая 2019

Это должно сделать то, что вы ищете. Я просто основываюсь на предоставленных переменных и коде, поэтому есть вероятность, что все может работать не совсем идеально. Итак, дайте мне знать, если это не так, и мы можем настроить:

lookDirection = Mathf.Atan2(lookPoint.x - transform.position.x, 
                            lookPoint.z - transform.position.z) * Mathf.Rad2Deg;
Quaternion q = Quaternion.Euler(new Vector3(0, lookDirection, 0));
Quaternion targetRotation = new Quaternion();
Quaternion torsoRotation = myTorso.transform.rotation;
// Check if the angle is outside the 45degree range
if (Quaternion.Angle(q, torsoRotation) <= 45.0f)
    targetRotation = q;
else
{
    // This is to check which direction we're out of range
    float d = Mathf.DeltaAngle(q.eulerAngles.y, torsoRotation.eulerAngles.y);
    if (d > 0.0f)
        target = torsoRotation * Quaternion.Euler(0, -45f, 0);
    else if (d < 0.0f)
        target = torsoRotation * Quaternion.Euler(0, 45f, 0);
}
myHead.rotation = targetRotation;
...