如何在等距平面上计算子弹的轨迹?

时间:2014-01-15 16:26:14

标签: lua corona isometric

我需要一些“iso guru”的帮助。我正在摆弄一个有两个大炮放在等距网格上的游戏。当一个大炮发射子弹时,它应该以弯曲的轨迹飞行,如下图所示。虽然这在x / y平面上是一项简单的任务,但我不知道如何在等距平面上计算弯曲路径(具有可变高度)。

有人能指出我正确的方向吗?我需要从一个场地向任何其他场地发射子弹,而子弹的飞行高度(曲线的“强度”)取决于给定的击球力量。

任何提示? :(

图片:http://postimg.org/image/6lcqnwcrr/

2 个答案:

答案 0 :(得分:2)

这可能会有所帮助。轨迹函数采用一些轨迹参数(速度,高度,起始位置和重力)并返回一个函数,该函数从世界空间中的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

答案 1 :(得分:0)

如果没有横向力,你可以在XZ平面上使用2D方程进行弹道运动(所以y = 0),然后通过围绕z轴的3D变换进行旋转,以考虑到3D空间中正面的实际方向。这个变换矩阵非常简单,你可以展开乘法(写出乘以的项)来得到三维方程。