1

在此处输入图像描述

如何为我的物体(黑色)行进方向(绿色)计算有效范围(红色)。绿色是 Vector2,其中 x 和 y 范围为 -1 到 1。

我在这里要做的是创造火箭燃料燃烧效果。所以我得到的是

  • 火箭速度(浮动)
  • 火箭方向(Vector2 x = [-1, 1], y = [-1, 1])

我可能认为火箭速度无关紧要,因为燃料燃烧效果(粒子)是在其自身速度的位置上产生的。

4

2 回答 2

4

使用 2D 向量的一个便宜又有趣的技巧是转置 x 和 y,然后翻转其中一个上的符号以获得垂直向量(伪代码):

Vector2 perpendicular ( -original.y, original.x ) // Or original.y, -original.x

然后你可以做类似的事情:

direction + perpendicular * rand(-0.3 , 0.3)

更新:意识到问题要求相反的向量(太忙于看图片!)我想我最好也回答一下。将“方向”乘以 -1 得到相反的向量。所以这:

perpendicular * rand(-0.3 , 0.3) - direction

应该在你的范围内的某个地方给你一个随机的方向向量(没有标准化,但足够接近这些目的)。然后,您可以将该结果乘以一个随机数,具体取决于您想要尾巴的长度。

于 2012-11-13T09:31:21.090 回答
0

如果要花费 OlduwanSteve 的答案,您可以使其在物理上有些准确。

您想要创建几个代表驱逐的向量(红线)。
首先定义要表示驱逐的向量数量 - 让我们将其标记为 n。

你想得到一组 n 个数,总和为 Vx。这些数字将是驱逐向量的 x 分量。你可以这样做(半伪代码):

SumX = Vx;
for (i = 0; i < n; i++)
{
    Ax[i] = -rand(0..SumX); // Ax is the array of all expulsion vectors x components 
    SumX -= Ax[i]; 
}

现在您需要计算 Ay(驱逐向量的 y 分量)。这与计算 非常相似,只是 SumY = 0。

在这里,您需要确定一个最大的 y 分量,而不是在 n 个元素中拆分 SumY。我能想到的最好的选择方法是为排出向量定义最大允许角度,并使用以下方法定义最大 Vy:maxVy = minVx*tan(maxAlpha)。

现在你可以使用这个(半伪代码)得到 Ay:

SumY = maxVy*2; // The actual range is (-maxVy, maxVy), but using (0, 2*maxVy) is simpler IMO
for (i = 0; i < n; i++)
{
    Ay[i] = rand(0..SumY);
    SumY -= Ay[i];
}
for (i = 0; i < n; i++)
{
    Ay[i] -= maxVy; // Translate the range back to (-maxVy, maxVy) from (0, 2*maxVy)
}

现在你有了驱逐向量的 x 和 y 分量的数组。迭代两个数组并配对元素以创建向量(您不必以相同的顺序迭代两个数组)。

注意:
我在计算中对齐轴,使 X 平行于对象速度矢量(绿线)。 • maxVy 的计算保证会产生角度为 maxAlpha 的向量,它只保证不会产生更大角度的向量。• 行 Ay[i] = rand(0..SumY) 和 Ax[i] = -rand(0..SumX) 可能导致向量的大小为 0。这可能会导致烦人的情况,我建议处理这种情况(例如“当 rand 返回零时,再次调用它”)。

于 2012-11-13T11:17:02.380 回答