我如何在Unity中进行这种3D摄像机运动?

问题描述 投票:0回答:1

这是一个学校项目。我有一个像行星的大立方体。我有一个可以在立方体星球的每一侧移动的小立方体。播放器会在其本地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。问题在于,由于我不告诉程序上和右向量(我认为),它会自行将它们设置为一些随机数,因此相机有时会像回旋轮一样做自己的事情。

接下来我尝试了这个:

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

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

您有任何想法如何使它起作用?希望您了解我想要实现的目标。我试图将相机设置为始终显示,当我按Up时,我的立方体向上移动,当我按Right时,我的立方体总是向右移动,等等。当我到达侧面的边缘时,相机会稍微偏向我要移动到的一面。

c# unity3d quaternions
1个回答
0
投票

我认为您正在寻找的是Vector3.Slerp(Vector3 a, Vector3 b, float t)功能,在[1]下有详细说明。使用此功能,您可以先设置相机位置,然后使用Transform.LookAt(Transform target)将其指向您选择的对象。

Vector3.Slerp定义-在两个向量之间进行球面插值-在a和b之间插值t。此插值与线性插值(也称为“ lerp”)之间的区别在于,矢量被视为方向,而不是空间中的点。返回的矢量的方向按角度进行插值,其幅度插在from和to的幅度之间。

[1] https://docs.unity3d.com/ScriptReference/Vector3.Slerp.html

© www.soinside.com 2019 - 2024. All rights reserved.