【问题标题】:Set orientation of moving object towards it movement direction without using rigidbody在不使用刚体的情况下将移动对象的方向设置为其移动方向
【发布时间】:2018-06-23 17:07:08
【问题描述】:

我有一个GameObject(相机)在样条线上移动(使用库)。我想将它的方向设置为它的运动。我的意思是,物体应该朝着它移动的方向看。我尝试了一些方法来实现这一点,但我没有成功。以下是我的尝试:

 transform.rotation = Quaternion.LookRotation(transform.position);

我也试过了

 transform.rotation = Quaternion.LookRotation(transform.forward);

【问题讨论】:

  • 只需使用“LookAt”。切勿出于任何原因使用四元数。
  • 嗨,乔,我曾经使用过,但每次获得新的 VECTOR3 时都会对其进行转换,从而产生混蛋效果
  • 说明您正在使用的样条软件。其中大多数都包含“前瞻性”功能
  • megaShape 的 MegaTrainFollow 脚本
  • 老实说,你最好的选择是问他们。他们非常友好,您为此付出了很多。只需给他们发电子邮件,或查看论坛即可。

标签: c# unity3d


【解决方案1】:

transform.position(空间中的一个点)和transform.forward(对象已经面向的方向)都不一定会告诉您对象正在移动的方向。

对于带有RigidBody 的对象,您可以通过velocity 变量访问它 - 但由于听起来您使用的是专有样条库并且无法访问对象的实际移动方向,因此您可以需要自己跟踪。

最简单的解决方案(如果库确实不提供运动信息),是在每一帧存储对象的当前位置和先前位置,并手动计算增量位置(也就是帧之间行进的距离)来查找速度矢量。例如:

public class MovingObject : MonoBehaviour {
    private Vector3 prevPosition;

    void Start() {
        // Starting off last position as current position
        prevPosition = transform.position;
    }

    void Update() {
        // Calculate position change between frames
        Vector3 deltaPosition = transform.position - prevPosition;

        if (deltaPosition != Vector3.zero) {
            // Same effect as rotating with quaternions, but simpler to read
            transform.forward = deltaPosition;
        }
        // Recording current position as previous position for next frame
        prevPosition = transform.position;
    }
}

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

  • 嗨,Serlite 感谢有价值的回答,如果我按下垂直键来移动我的相机,但方向会随着我停止输入而改变。
  • 非常感谢您花了 3 天时间解决了这个问题。
【解决方案2】:

试试

transform.rotation = Quaternion.LookRotation(transform.position - currentPosition);

其中currentPosition 是您的游戏对象在样条线上的位置(在应用变换transform 之前)。

请记住,Quaternion.LookRotation() 不希望查看的位置而是查看的方向。请参阅documentationFAQ

【讨论】:

  • 感谢您的意见!但是 transform.position 和 currentPosition 都是一样的。不是吗?
  • @MohammadFaizanKhan,嗯...你能告诉我们你如何改变transform.position来让游戏对象沿着样条线移动吗?
  • 类似这样的东西 transform.position = car.cp + car.carriageOffset;
  • @MohammadFaizanKhan,你必须以某种方式计算新旧位置之间的向量,并将其用作Quaternion.LookRotation 的参数。
  • 这也是有价值的答案
【解决方案3】:

您在正确的轨道上,但您应该使用您的移动方向:transform.rotation = Quaternion.LookRotation(movementDirection),因为transform.forward 已经是对象的方向。

如果您不知道/无法获得对象当前的移动方向但知道目标位置,则可以向目标位置旋转:transform.rotation = Quaternion.LookRotation(targetPosition - transform.position)

【讨论】:

  • 您用来移动相机的向量。 (喜欢camera.position = camera.position + movementVector
  • 让我看看它是如何工作的
  • movementDirection 应该是位置,那么 b/w transform.position 和 motionDirection 有什么不同?
  • movementDirection 应该是相机移动的方向。使用移动方向向量将 transform.position 转换为下一个位置(例如,在每次更新调用中)。例如:如果相机是横向移动,则移动方向可以是transform.right。
  • 如何找到方向?这是轮换吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多