【问题标题】:Move to exactly a certain distance from an object移动到距物体一定距离
【发布时间】:2020-05-12 03:47:37
【问题描述】:

我的相机正在寻找一个对象A。当我向上或向下移动鼠标或滚动鼠标滚轮时,相机会靠近或远离A

//frontal movement
Vector3 frontal = transform.forward * 
                  (Input.GetAxis("Mouse Y") + Input.mouseScrollDelta.y) * 
                  0.3f;

//distance from the camera to the object
if(Vector3.Distance(A.position, transform.position + frontal) > minDistance)
    transform.position += frontal;

重点是:我不希望相机离A 太近,所以我定义了一个浮点数minDistance 来说明相机与物体之间的最小距离。

问题:我的代码简单地说:“如果最终位置比minDistance 更近,请不要移动”。这不是我想要的行为。如果最终位置比minDist 更近,我希望它移动到距离正好为minDist 的点。我该怎么做?

【问题讨论】:

    标签: c# unity3d camera game-physics


    【解决方案1】:

    您可以找到相机和对象之间相对于对象的归一化矢量差异(这给出了“角度”矢量)。检查距离是否小于minDistance,如果是,将相机移动到目标偏移angle * minDistance的位置:

    Vector3 newPosition = transform.position + frontal;
    Vector3 difference = newPosition - A.position;
    float distance = difference.magnitude;
    
    if (distance < minDistance) 
    {
      Vector3 angle = difference.normalized;
      transform.position = A.position + (angle * minDistance);
    }
    else
    {
      transform.position = newPosition;
    }
    

    (有几种方法可以对此进行优化,例如比较距离平方而不是距离,这消除了不必要的平方根运算。)

    【讨论】:

    • 事实上我正在寻找最优化的选项,因为我会在每一帧都运行这个测试。
    • 我刚刚编辑了您对一些工作正常且看起来更小一些的答案。你认为这可以优化吗?你认为实时创建前向向量(减去A.position - newPosition 并归一化)比调用transform.forward 更快吗?
    • @Daniel 您的编辑有几个拼写错误,并且没有对差异向量进行规范化,因此即使编译该代码也无法正常工作。虽然这种减少在技术上算作一种优化,但我会将它直接标记为“微优化”类别,除非基准测试认为它是绝对必要的,否则代码整洁性和可读性优于简洁性和减少几纳秒。为了将来参考,编辑答案只是为了给出您自己对解决方案的“个人看法”被认为是非常不礼貌的。如果您有改进建议,请发表评论。
    • 是的,它可以工作并且没有错别字,事实上这是我现在使用的代码,它工作正常。 transform.forward 是一个法向量,不需要归一化。我对可读性不是很感兴趣,因为这是我自己的项目,我最关注的是速度。
    • @Daniel 我愿意。这可能是一个主观的陈述,但事实上我不得不盯着它看 15 到 20 秒来拼凑它的作用,这意味着你的代码不是自我记录的,这意味着它不是很可读,除非你已经知道它是什么做。同样,不要寻求微优化。我提出了距离平方的距离优化,因为用简单的算术替换平方根是一个巨大的优化,如果可能的话总是值得做的。消除一些变量赋值不是。 (具有讽刺意味的是,我建议的是您没有采用的一项优化。)
    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2013-12-23
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多