相机跟随物体,旋转 EXCEPT z 轴
Camera follow object, rotate EXCEPT z axis
我有一个跟踪飞机物体的相机,它可以旋转 left/right。我想防止相机在这个轴(z 轴)上旋转。
this.transform.rotation = Cube.transform.rotation;
这显然会在飞机可以移动的所有方向上旋转相机。
我一直在尝试使用 zAxis 等进行各种操作,仅在 x 和 y 上旋转...
this.transform.Rotate(Cube.transform.rotation.xAngle, 0, 0, Space.Self);
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html
但我无法解决。有人可以帮忙吗?
我相信你想尝试设置相同的旋转,并省略 Z 轴,这样
Vector3 rotation = Cube.transform.rotation;
rotation.z = 0;
this.transform.eulerAngles = rotation;
这应该将相机的旋转设置为与立方体相同,没有 Z 轴。
最简单的方法可能是只使用 LookAt
,它允许您以观察目标对象的方式旋转相机,而不改变它的向上方向(=> Z 旋转)
我只是加了一个简单的位置平滑和一个位置偏移——当然你也可以把不需要的东西刮掉,直接设置位置。
public class Example : MonoBehaviour
{
// the target to follow
[SerializeField] private Transform followTarget;
// local offset to e.g. place the camera behind the target object etc
[SerializeField] private Vector3 positionOffset;
// how smooth the camera position is updated, smaller value -> slower
[SerializeField] private float interpolation = 5f;
private void Update()
{
// target position taking the targets rotation and the offset into account
var targetPosition = followTarget.position + followTarget.forward * positionOffset.z + followTarget.right * positionOffset.x + followTarget.up * positionOffset.y;
// move smooth towards this target position
transform.position = Vector3.Lerp(transform.position, targetPosition, interpolation * Time.deltaTime);
// rotate to look at the target without rotating in Z
transform.LookAt(followTarget);
}
}
我有一个跟踪飞机物体的相机,它可以旋转 left/right。我想防止相机在这个轴(z 轴)上旋转。
this.transform.rotation = Cube.transform.rotation;
这显然会在飞机可以移动的所有方向上旋转相机。
我一直在尝试使用 zAxis 等进行各种操作,仅在 x 和 y 上旋转...
this.transform.Rotate(Cube.transform.rotation.xAngle, 0, 0, Space.Self);
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html
但我无法解决。有人可以帮忙吗?
我相信你想尝试设置相同的旋转,并省略 Z 轴,这样
Vector3 rotation = Cube.transform.rotation;
rotation.z = 0;
this.transform.eulerAngles = rotation;
这应该将相机的旋转设置为与立方体相同,没有 Z 轴。
最简单的方法可能是只使用 LookAt
,它允许您以观察目标对象的方式旋转相机,而不改变它的向上方向(=> Z 旋转)
我只是加了一个简单的位置平滑和一个位置偏移——当然你也可以把不需要的东西刮掉,直接设置位置。
public class Example : MonoBehaviour
{
// the target to follow
[SerializeField] private Transform followTarget;
// local offset to e.g. place the camera behind the target object etc
[SerializeField] private Vector3 positionOffset;
// how smooth the camera position is updated, smaller value -> slower
[SerializeField] private float interpolation = 5f;
private void Update()
{
// target position taking the targets rotation and the offset into account
var targetPosition = followTarget.position + followTarget.forward * positionOffset.z + followTarget.right * positionOffset.x + followTarget.up * positionOffset.y;
// move smooth towards this target position
transform.position = Vector3.Lerp(transform.position, targetPosition, interpolation * Time.deltaTime);
// rotate to look at the target without rotating in Z
transform.LookAt(followTarget);
}
}