[英]Quaternion.Euler rotates wrong axis
我有这个问题:在此处输入图像描述
然后,我尝试旋转 y 轴,并且“PartToRotate”跟随“敌人”。 在此处输入图像描述
但是随后,它将轴 z 旋转了 -90,我不知道为什么。 在此处输入图像描述
因此,如果您能帮助我,我将不胜感激。 我把所有代码都留在这里:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Turret : MonoBehaviour
{
private Transform target;
public float range = 15f;
public Transform partToRotate;
public string enemyTag = "Enemy";
// Start is called before the first frame update
void Start()
{
InvokeRepeating("UpdateTarget", 0f, 0.5f);
}
void UpdateTarget()
{
GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag);
float shortestDistance = Mathf.Infinity;
GameObject nearestEnemy = null;
foreach ( GameObject enemy in enemies)
{
float distanceToEnemy = Vector2.Distance(transform.position, enemy.transform.position);
if(distanceToEnemy < shortestDistance)
{
shortestDistance = distanceToEnemy;
nearestEnemy = enemy;
}
}
if(nearestEnemy != null && shortestDistance <= range)
{
target = nearestEnemy.transform;
}
else
{
target = null;
}
}
// Update is called once per frame
void Update()
{
if (target == null)
{
return;
}
Vector3 dir = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(dir);
Vector3 rotation = lookRotation.eulerAngles;
partToRotate.rotation = Quaternion.Euler(0f, rotation.y, 0f);
}
void OnDrawGizmosSelected ()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, range);
}
}
这是照片。 在此处输入图像描述。 这就是以前的样子,以及新代码Vector3 direction = target.position - transform.position; float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; partToRotate.rotation = Quaternion.Euler(0, 0, angle);
Vector3 direction = target.position - transform.position; float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; partToRotate.rotation = Quaternion.Euler(0, 0, angle);
是“partToRotate”跟随敌人(目标),他这样做了,但它仍然得到(加上z,这是我想要的轴)x轴。 在此处输入图像描述
如果没有看到target.position
和transform.position
的值,则无法确保它,但您可能遇到了万向节锁定。
为避免万向节锁定,您必须避免欧拉角并仅使用四元数。 在您的代码中,您创建一个四元数,然后获得欧拉角,然后仅使用这些欧拉角的 Y 轴创建一个新的四元数。 我假设这是为了限制旋转在 XZ 平面上,你可以不使用这样的欧拉角来做同样的事情:
Vector3 dir = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.z));
partToRotate.rotation = lookRotation;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.