我需要"iso guru"的帮助。我正在摆弄一个游戏,其中有两门大炮放置在等距网格上。当一门大炮发射子弹时,它应该以弯曲的轨迹飞行,如下所示。虽然这在 x/y 平面上是一件容易的事,但我不知道如何在等轴测平面上计算曲线路径(具有可变高度)。
有人可以指出我正确的方向吗?我需要从一个区域向任何给定的领域发射子弹,而子弹的飞行高度(曲线的"强度")取决于给定的射击功率。
有什么提示吗?:(
图片:http://postimg.org/image/6lcqnwcrr/
这可能会有所帮助。轨迹函数采用一些轨迹参数(速度、海拔、起始位置和重力),并返回一个函数,该函数从世界空间中的 x 位置计算 y 位置。转换器返回一个函数,该函数在给定投影角度的世界坐标和屏幕坐标之间进行转换。下面是一个用于计算屏幕空间中某些点的轨迹的示例。这实际上是出于指示目的。它有一堆被零除以的潜力,但它生成的轨迹看起来适合合理的高度、投影和速度。
-- A trajectory in world space
function trajectory(v,elevation,x0,y0,g)
x0 = x0 or 0
y0 = y0 or 0
local th = math.rad(elevation or 45)
g = g or 9.81
return function(x)
x = x-x0
local a = x*math.tan(th)
local b = (g*x^2)/(2*(v*math.cos(th))^2)
return y0+a-b
end
end
-- convert between screen and world
function converter(iso)
iso = math.rad(iso or 0)
return function(toscreen,x,y)
if toscreen then
y = y+x*math.sin(iso)
x = x*math.cos(iso)
else
x = x/math.cos(iso)
y = y-x*math.sin(iso)
end
return x,y
end
end
-- velocity 60m/s at an angle of 70 deg
t = trajectory(60,70,0,0)
-- iso projection of 30 deg
c = converter(30)
-- x in screen co-ords
for x = 0,255 do
local xx = c(false,x,0) -- x in world co-ords
local y = t(xx) -- y in world co-ords
local _,yy = c(true,xx,y) -- y in screen co-ords
local _,y0 = c(true,xx,0) --ground in screen co-ords
yy = math.floor(yy) -- not needed
if yy>y0 then print(x,yy) end -- if it's above ground
end
如果没有侧向力,则可以使用 2D 方程在 XZ 平面中进行弹道运动(因此始终 y=0),然后通过围绕 z 轴的 3D 变换旋转以考虑佳能在 3D 空间中的实际方向。这个变换矩阵非常简单,你可以展开乘法(写出乘法的项)得到 3D 方程。