基于 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 中的对象。但请注意,此处还考虑了对象的缩放比例。所以这可能不会像预期的那样表现。
我正在尝试在基于模拟摇杆输入的 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 中的对象。但请注意,此处还考虑了对象的缩放比例。所以这可能不会像预期的那样表现。