基于 2 个不同 floats/axes 的 vector3 lerp?

vector3 lerp based on 2 different floats/axes?

我正在尝试在基于模拟摇杆输入的 2.5d sidescroller 游戏中围绕我的玩家移动一个对象。问题是,我的播放器在世界中旋转(相机固定在侧面)所以它的局部水平方向(transform.right)并不总是与局部向上方向相同的全局 x 方向(transform.up).当玩家的移动方向固定在 X 轴上时,通过设置玩家位置的偏移量并在同一轴上添加模拟,我可以很好地工作,如下所示:

 Vector3 endPoint = new Vector3(transform.position.x + inputs.x * floraDistanceMultiplier, transform.position.y + inputs.y * floraDistanceMultiplier, transform.position.z);

但现在玩家可以说是“离轴”了,这当然行不通了。

我能够让它一次在一个轴上工作:

 Vector3 h = player.transform.position + player.transform.right * floraDistanceMultiplier * inputs.x;
 Vector3 v = player.transform.position + player.transform.up * floraDistanceMultiplier * inputs.y;

但无法弄清楚如何让两个向量都影响最终位置。我假设使用 localPosition 或手动应用最终向量的 x 和 y 不起作用,因为 x 和 y 始终是全局的,而不是将 transform.right 定义为某种长的局部 X 轴。

我曾想过将这两个 lerp - 这几乎取得了成功的结果,因为终点正确地围绕玩家从左到上移动,而不是在玩家周围的一个完整圆圈中,对角线是比上方和左侧的完整范围更近。

 Vector3 endPoint = Vector3.Lerp(h, v, inputs.x + inputs.y);

有没有更好的方法来总体上做到这一点?或者有什么方法可以使用 2 个浮点数在 2 个向量之间进行 lerp? (模拟摇杆 x 和 y)还是使用向量?谢谢!

你原来是做什么的

var endPoint = new Vector3(transform.position.x + inputs.x * floraDistanceMultiplier, transform.position.y + inputs.y * floraDistanceMultiplier, transform.position.z);

基本等于使用

var endPoint = transform.position + Vector3.right * input.x * floraDistanceMultiplier + Vector3.up * input.y * floraDistanceMultiplier;

因此,为了将其转换为本地 space 只需替换全局向量 Vector3.right and Vector3.up by the local transform.right and transform.up 应该已经做到了

var endPoint = transform.position + transform.right * input.x * floraDistanceMultiplier + transform.up * input.y * floraDistanceMultiplier; 

另一种写得更短的方法是

var endPoint = transform.position + (Vector3)input * floraDistanceMultiplier;

为了将这个转换成局部 space 只需将运动矢量与玩家的旋转相乘 (Quaternion * Vector3 operator)

var endPoint = transform.position + transform.rotation * input * floraDistanceMultiplier;

作为替代方案,如果您不一定需要 endPoint 作为向量,您可以直接使用 transform.Translate,您可以通过第二个参数简单地决定是否要应用运动世界或当地 space

transform.Translate(input * floraDistanceMultiplier);

默认情况下,这已经移动了本地 space 中的对象。但请注意,此处还考虑了对象的缩放比例。所以这可能不会像预期的那样表现。