火炮的旋转速度

在我正在制作的当前应用程序中,我正在使用一门大炮向目标发射球,但是大炮旋转得太快了。当我触摸屏幕时,大炮会快速逆时针旋转,我想减少旋转速度。我将角阻尼设置为100,但速度似乎没有改变。

function charge() 
     cannon.angularDamping = 100 
     cannon.rotation = cannon.rotation - 5 
     impulse = impulse-0.2 

     ifcannon.rotation < -46)then 
          cannon.rotation = -46 
          impulse = -3.2 
     end 
end 
点赞
用户1601606
用户1601606

angularDamping 减慢物理刚体的角速度。

如果您直接设置物体旋转,它将起不到作用。请尝试使用 canon:applyAngularImpulse(-5),以旋转它并看一看 angularDamping 如何减少旋转速度。不要手动旋转。

您还可以使用电动机或旋转关节,精确控制炮台的旋转。

2014-03-17 19:07:30
用户869951
用户869951

你的加农炮当前每帧旋转 5 度(假设你把 charge() 当作 enterFrame 处理器的一部分)。这是因为你设置了这个值:

cannon.rotation = cannon.rotation - 5

如果你想要它旋转得更慢,可以尝试以下任何一种方法:

local degreesPerFrame = 1 -- 或者 0.1 或其他值,可以试试多种数值
cannon.rotation = cannon.rotation - degreesPerFrame

如果你想要一个特定的旋转速度,可以通过 event.time - appStartTime 得到上一次 enterFrame 的时间差。然后你可以使用:

function enterFrame(event)
    if appStartTime == nil then
         appStartTime = event.time
    else
         deltaTime = event.time - appStartTime
         charge(deltaTime)
    end
end

function charge(deltaTime)
    local degreesPerSec = 1 -- 或者 0.1 或其他值,可以试试多种数值
    cannon.rotation = cannon.rotation - degreesPerSec * deltaTime
    ...
end

或者你可以把你的对象设置成一个动能物理体(注意:不是动态物理体):

physics.addBody(cannon, "kinematic", {isSensor = false})
cannon.angularVelocity = 1 -- deg/s

但是你的代码中似乎涉及到了动态物理体。如果你的物体是一个“动态”物理体(使用“dynamic”而不是“kinematic”创建的),那么你必须施加一个扭矩才能使它旋转。一个恒定的扭矩会导致非零的角加速度,即只要扭矩施加,角速度就会增加,除非有速度依赖的阻尼,然后通常会到达一个极限,阻尼恰好抵消扭矩,物体到达一个稳定的角速度。

使用一个动态物体会给你更平滑、更真实的变化,但在这种情况下,这可能有些过头。我建议你使用动能物理体或根本不使用物理体,只改变旋转值。

2014-03-17 21:37:52