[英]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 方法,例如Reflect
和RotateTowards
。
提示:要在所有方向上保持一致的速度,请考虑对方向向量进行归一化,(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.