繁体   English   中英

在 3D 中改变方向

[英]Changing direction in 3D

我正在 Unity 中从事 3D 项目。

我有一个 object 在密闭空间内移动。 object 有一个固定的速度,一旦到达空间限制就会反弹回来。

我希望它每 n 秒改变一次方向。

我面临的问题是:如何将 3D 向量旋转给定角度。

在 2D 中很容易,而在 3D 中我不确定如何处理它。

有人可以帮我吗?

您可以在某个轴上按某个角度改变方向,使其类似于 2D。

如果您正在移动 object 及其变换,您可以使用游戏 object 变换中的 旋转方法轻松旋转 object。

//in a script attached to the game object you want to rotate
transform.Rotate(Vector3.up, Random.Range(90,270), Space.self);

您现在可以使用transform.forward移动 object。

如果你想 go 更深入到 3D 旋转看看四元数

您可以使用 Quaternion.operator * 将一个旋转旋转另一个旋转,或者将一个向量旋转一个旋转。

还可以考虑查看Vector3 class 方法,例如ReflectRotateTowards

提示:要在所有方向上保持一致的速度,请考虑对方向向量进行归一化,(0,1,1) 将比 (0,0,1) 行进得更快。

您可以按如下方式对任何向量进行归一化:

Vector3 direction = Vector3.up + Vector3.forward; //(0,1,1)
direction = direction.normalized; //(0,0.71,0.71)

在 2D 中,这很简单......

中三三也。

例如,您可以通过以下方式简单地围绕任何给定的欧拉角旋转 Vector3

var newVector = Quaternion.Euler(x, y, z) * oldVector;

问题仍然是您从哪里获得这些角度以及这些角度是否是随机的,或者您更愿意在对象达到您定义的区域约束后Reflect矢量。

您也可以简单地反转各个组件,例如

// Note for simplicity reasons this is not an actual "distance"
// but rather the maximum of each individual axis
public float maxDistance;

private Rigidbody _rigidbody;

private void Start ()
{
    _rigidbody = GetComponent<Rigidbody>();
    _rigidbody.velocity = Random.insideUnitSphere.normalized;
}

private void FixedUpdate()
{
    var vel = _rigidbody.velocity;
    var pos = _rigidbody.position;

    if(Mathf.Abs(pos.x) >= maxDistance)
    {
        vel.x *= -1;
    }

    if(Mathf.Abs(pos.y) >= maxDistance)
    {
        vel.y *= -1;
    }

    if(Mathf.Abs(pos.z) >= maxDistance)
    {
        vel.z *= -1;
    }

    _rigidbody.velocity = vel;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM