【问题标题】:How can I do this kind of 3D camera movement in Unity?如何在 Unity 中进行这种 3D 摄像机移动?
【发布时间】:2020-02-24 17:42:04
【问题描述】:

这是一个学校项目。我有一个像行星一样的大立方体。我有一个小立方体,可以在立方体星球的每一侧移动。玩家在其局部 z 轴上自动向前移动,我将其旋转 90 或 -90 度以向左或向右移动 - 但玩家可以像上下左右移动一样控制它(制作了一个脚本,所以他们不不必用 2 个键旋转立方体)。这就像一个 Tron 游戏,所以如果我按向上键,我不能立即按下,因为我留下了痕迹,所以我必须按向左或向右键。我的相机移动有问题。摄像机从上方跟随小立方体,但我希望它在小立方体播放器靠近一侧边缘时稍微倾斜,以便让我看到另一侧——我打算去的地方。

我有一个脚本,其中我使用立方体星球的中心和玩家的中心作为方向向量,并将其与相机-玩家距离相乘。

Vector3 direction = (target.position - center.position).normalized;         
transform.position = target.position + direction * distance;

然后我将相机的前向矢量指向玩家立方体的方向。我尝试了两个代码,但没有一个能完美运行。首先,我尝试使用以下方式旋转相机:

transform.rotation = Quaternion.LookRotation(-direction); 

Shown in video。这样做的问题是,由于我没有告诉程序 Up 和 Right 向量(我认为),它会为自己设置一些随机数,因此相机有时会像旋转一样做自己的事情。

接下来我尝试了这个:

Quaternion rot = Quaternion.FromToRotation(transform.forward, -direction);                                                                          
transform.Rotate(rot.eulerAngles, Space.World); 

Shown in video。这几乎是好的,但随着小立方体的移动,相机开始轻微转向,并且变得越来越糟。

您有什么想法可以让它发挥作用吗?我希望你明白我想要达到的目标。我正在尝试将相机设置为始终显示当我按下 Up 时,我的立方体向上移动,当我按下 Right 时,我的立方体总是向右移动等等。当我到达我身边的边缘时,相机会稍微倾斜一点我要去的那一边。

【问题讨论】:

    标签: c# unity3d quaternions


    【解决方案1】:

    使用点积找出立方体的哪个正交方向最接近相机的当前向上。

    Vector3 closestToUp;
    float greatestDot = 0f;
    foreach (Vector3 dir in new Vector3[]{
            target.forward, target.right, -target.forward, -target.right})
    {
        float curDot = Vector3.Dot(dir,transform.up);
        if (curDot > greatestDot) 
        {
            greatestDot = curDot;
            closestToUp = dir;
        }
    }
    

    然后,将该方向用作Quaternion.LookRotation 的第二个参数。考虑到任何新的前进方向,这将使其局部向上方向尽可能与立方体的“顶部”对齐:

    transform.rotation = Quaternion.LookRotation(-direction, closestToUp); 
    

    【讨论】:

    • 您的编辑工作完美,这正是我想做的,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多