【问题标题】:Unity: i need to apply a force on a rigidbody in the direction of my cameraUnity:我需要在我的相机方向上对刚体施加一个力
【发布时间】:2021-08-16 13:33:11
【问题描述】:

我当前的代码使用世界方向,但我需要它来使用我的相机的方向(忽略 y 轴)

这是我当前的代码:

{
    public GameObject Cam;
    public Rigidbody rb;
    public float movespeed = 10f;

    private float xInput;
    private float yInput;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        ProcessInputs();
    }

    private void FixedUpdate()
    {
        //movement
        Move();

    }

    private void ProcessInputs()
    {
        xInput = Input.GetAxisRaw("Horizontal");
        yInput = Input.GetAxisRaw("Vertical");
    }
    private void Move()
    {
        rb.AddForce(new Vector3(xInput, 0f, yInput) * movespeed);
    }
} 

我认为问题出在最后一行,我尝试增加相对力,但由于它附着在一个滚动的球上,它不起作用我已经尝试了几个小时才能让它起作用,但它可能真的容易,我只是有一个非常光滑的大脑。 我已经搜索了我能找到的每一个教程,每一个 reddit 帖子,甚至谷歌的第二页。我找不到这个非常简单的任务的解决方案。我正在将几个教程拼接在一起,以制作我的科学怪人代码怪物,因为我是统一编码的新手。

当我按下 w 时,我正在寻找球在相机面对的方向上移动,当我按下 d 和 s 时,我正在寻找相机的左侧。我让球移动,但是当我转动相机(使用单独的功能齐全的脚本)时,球保持其运动轴。

【问题讨论】:

  • 您需要详细说明您想要的结果与您获得的结果。为什么yInput 像new Vector3(xInput, 0f, yInput) 这样在z 坐标中?是为了你所追求的结果的特定目的吗?可以查看Transform.Forward,获取世界空间中的局部z轴。使用.up 和.right,您可以获得世界空间中3 个局部轴中的任何一个。还要检查Transform.InverseTransformDirection

标签: c# unity3d


【解决方案1】:

几年前我也做过同样的事情,这是(清理过的)sn-p 代码,应该可以满足您的需求。 absoluteMovement 是需要添加到对象的世界位置向量。就像你在你的例子中一样,我从方程中删除了 Y 轴。

var movementRelativeToCamera = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * speed;
var cameraLookingDirection = cameraObject.transform.rotation * Vector3.forward;
cameraLookingDirection = new Vector3(cameraLookingDirection.x, 0f, cameraLookingDirection.z).normalized;
var absuluteMovement = Quaternion.FromToRotation(Vector3.forward, cameraLookingDirection) * movementRelativeToCamera;

解释:

  • [第 1 行] 您首先获取移动量(乘以 speed 变量)
  • [第 2-3 行] 获取相机的视图方向,移除 Y 轴并再次归一化矢量
  • [第 4 行] 您创建一个从标准前向矢量到相机视图方向 (Quaternion.FromToRotation(Vector3.forward, cameraLookingDirection)) 的四元数(旋转)并将其应用于您的相对运动,以从“标准化”视图中旋转它相机的方向。

注意:由于我在一些旧的 Unity 版本中执行此操作,可能是 Unity 的 API 从那时起发生了变化,但我怀疑向量和四元数等基本功能。

编辑:关于四元数的更多句子

四元数用于存储和计算旋转信息。您可以说四元数是“旋转”。您可以通过将向量与向量相乘来将这种旋转应用于向量:

rotatedVector = quaternion * unrotatedVector;

如果您想更深入地了解四元数的工作原理,YouTube 上有很多关于该主题的视频。也就是说:您不需要了解它们是如何工作的,就可以使用 来进行基本操作,就像我们示例中的 on 一样。如果你不知道它们是如何工作的,你不应该尝试手动设置四元数值,它们并不是真正的“人类可读”,所以你可能不会得到你期望的结果。但是Unity provides a nice amount of helping functions 就像Quaternion.FromToRotation、Quaternion.LookRotation 或Quaternion.AngleAxis 等等。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多