C# 我如何在Unity中进行这种3D相机运动?

C# 我如何在Unity中进行这种3D相机运动?,c#,unity3d,quaternions,C#,Unity3d,Quaternions,这是一个学校项目。我有一个像行星一样的大立方体。我有一个小立方体,可以在立方体星球的每一边移动。玩家在其局部z轴上自动向前移动,我将其旋转90度或-90度以向左或向右移动,但玩家可以控制它,就像它是一个上下左右移动一样(制作了一个脚本,这样他们就不必用两个键旋转立方体)。这就像一个Tron游戏,所以如果我按下向上键,我不能立即按下向下键,因为我留下了一条轨迹,所以我必须按下左键或右键。我的相机移动有问题。相机从上方跟踪小立方体,但我希望当小立方体播放器靠近一侧边缘时,它稍微倾斜,这样我就可以看到

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

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

Vector3 direction = (target.position - center.position).normalized;         
transform.position = target.position + direction * distance;
然后我将相机的前向向量指向玩家立方体的方向。我试过两种代码,但没有一种工作得很好。首先,我尝试使用以下方式旋转相机:

transform.rotation = Quaternion.LookRotation(-direction); 
。问题是,由于我不告诉程序上方向和右方向向量(我想),它会将它们自身设置为一些随机数,所以相机有时会做自己的事情,就像做旋转一样

接下来我尝试了这个:

Quaternion rot = Quaternion.FromToRotation(transform.forward, -direction);                                                                          
transform.Rotate(rot.eulerAngles, Space.World); 
。这几乎是好的,但随着小立方体的移动,相机开始稍微转向,情况变得越来越糟


你有什么办法让它工作吗?我希望你理解我想要实现的目标。我试图将相机设置为始终显示,当我向上按时,我的立方体向上移动,当我向右按时,我的立方体始终向右移动等。当我到达侧面边缘时,相机向我移动的一侧倾斜一点。

使用点积查找立方体的哪个正交方向最接近相机的向上电流

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;
    }
}
然后,将该方向用作
四元数.LookRotation
的第二个参数。这将使其局部向上方向尽可能与立方体的“顶部”对齐,无论给定何种新的前进方向:

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

您的编辑工作完美,这正是我想要做的,非常感谢您的帮助!