我如何在 Unity 中进行这种 3D 相机移动?
How can I do this kind of 3D camera movement in Unity?
这是一个学校项目。我有一个像行星一样的大立方体。我有一个小立方体,可以在立方体星球的每一面移动。播放器在其本地 z 轴上自动向前移动,我将其旋转 90 或 -90 度以向左或向右移动 - 但播放器可以控制它,就像它是上下左右移动一样(制作脚本所以他们不' 必须用 2 个键旋转立方体)。这就像一个 Tron 游戏,所以如果我按下向上键,我不能立即按下,因为我会留下痕迹,所以我必须按向左或向右键。我的相机运动有问题。摄像机从上方跟随小立方体,但我希望当小立方体玩家靠近一侧的边缘时它稍微倾斜一点,这样我就可以看到另一侧 - 我打算去的地方。
我有一个脚本,我使用立方体行星的中心和玩家的中心作为方向向量,并将其乘以相机-玩家距离。
Vector3 direction = (target.position - center.position).normalized;
transform.position = target.position + direction * distance;
然后我将相机的前向矢量指向玩家立方体的方向。我尝试了两个代码,但其中 none 完美运行。首先,我尝试使用以下方式旋转相机:
transform.rotation = Quaternion.LookRotation(-direction);
Shown in video。这个问题是因为我没有告诉程序向上和向右向量(我认为),它会为自己设置一些随机数所以相机有时会像旋转一样做自己的事情。
接下来我尝试了这个:
Quaternion rot = Quaternion.FromToRotation(transform.forward, -direction);
transform.Rotate(rot.eulerAngles, Space.World);
Shown in video。这几乎是好的,但是随着小立方体的移动,摄像机开始开始轻微转向,而且越来越差。
你有什么办法让它发挥作用吗?我希望你明白我想要达到的目标。我正在尝试将相机设置为始终显示当我按下向上时,我的立方体向上移动,当我按下右时,我的立方体总是向右移动等等,当我到达我身边的边缘时,相机稍微向我要去的那一边。
使用点积找出立方体的哪个正交方向最接近相机的当前向上。
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
的第二个参数。这将使它的局部向上方向尽可能与立方体的 "top" 对齐,无论新的前向是什么:
transform.rotation = Quaternion.LookRotation(-direction, closestToUp);
这是一个学校项目。我有一个像行星一样的大立方体。我有一个小立方体,可以在立方体星球的每一面移动。播放器在其本地 z 轴上自动向前移动,我将其旋转 90 或 -90 度以向左或向右移动 - 但播放器可以控制它,就像它是上下左右移动一样(制作脚本所以他们不' 必须用 2 个键旋转立方体)。这就像一个 Tron 游戏,所以如果我按下向上键,我不能立即按下,因为我会留下痕迹,所以我必须按向左或向右键。我的相机运动有问题。摄像机从上方跟随小立方体,但我希望当小立方体玩家靠近一侧的边缘时它稍微倾斜一点,这样我就可以看到另一侧 - 我打算去的地方。
我有一个脚本,我使用立方体行星的中心和玩家的中心作为方向向量,并将其乘以相机-玩家距离。
Vector3 direction = (target.position - center.position).normalized;
transform.position = target.position + direction * distance;
然后我将相机的前向矢量指向玩家立方体的方向。我尝试了两个代码,但其中 none 完美运行。首先,我尝试使用以下方式旋转相机:
transform.rotation = Quaternion.LookRotation(-direction);
Shown in video。这个问题是因为我没有告诉程序向上和向右向量(我认为),它会为自己设置一些随机数所以相机有时会像旋转一样做自己的事情。
接下来我尝试了这个:
Quaternion rot = Quaternion.FromToRotation(transform.forward, -direction);
transform.Rotate(rot.eulerAngles, Space.World);
Shown in video。这几乎是好的,但是随着小立方体的移动,摄像机开始开始轻微转向,而且越来越差。
你有什么办法让它发挥作用吗?我希望你明白我想要达到的目标。我正在尝试将相机设置为始终显示当我按下向上时,我的立方体向上移动,当我按下右时,我的立方体总是向右移动等等,当我到达我身边的边缘时,相机稍微向我要去的那一边。
使用点积找出立方体的哪个正交方向最接近相机的当前向上。
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
的第二个参数。这将使它的局部向上方向尽可能与立方体的 "top" 对齐,无论新的前向是什么:
transform.rotation = Quaternion.LookRotation(-direction, closestToUp);