如何为我的物体(黑色)行进方向(绿色)计算有效范围(红色)。绿色是 Vector2,其中 x 和 y 范围为 -1 到 1。
我在这里要做的是创造火箭燃料燃烧效果。所以我得到的是
- 火箭速度(浮动)
- 火箭方向(Vector2 x = [-1, 1], y = [-1, 1])
我可能认为火箭速度无关紧要,因为燃料燃烧效果(粒子)是在其自身速度的位置上产生的。
如何为我的物体(黑色)行进方向(绿色)计算有效范围(红色)。绿色是 Vector2,其中 x 和 y 范围为 -1 到 1。
我在这里要做的是创造火箭燃料燃烧效果。所以我得到的是
我可能认为火箭速度无关紧要,因为燃料燃烧效果(粒子)是在其自身速度的位置上产生的。
使用 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
应该在你的范围内的某个地方给你一个随机的方向向量(没有标准化,但足够接近这些目的)。然后,您可以将该结果乘以一个随机数,具体取决于您想要尾巴的长度。
如果要花费 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 返回零时,再次调用它”)。