在我正在制作的当前应用中,我在目标上使用了一个大炮射击球,但是大炮旋转太快了。当我触摸屏幕时,大炮快速逆时针旋转,我想降低旋转速度。我将角度阻尼设置为100,但速度似乎没有变化。
function charge()
cannon.angularDamping = 100
cannon.rotation = cannon.rotation - 5
impulse=impulse-0.2
if(cannon.rotation < -46) then
cannon.rotation = -46
impulse = -3.2
end
end
答案 0 :(得分:0)
angularDamping
会降低物理体角速度。
如果你直接设置身体旋转,它将什么都不做。
尝试使用canon:applyAngularImpulse(-5)
来旋转它,看看angularDamping如何降低旋转速度。请勿手动触摸旋转。
您也可以使用电机或旋转接头,精确控制佳能旋转。
答案 1 :(得分:0)
你的大炮的当前旋转速度是每帧5度(假设你将charge()
称为enterFrame
处理程序的一部分)因为你有这个:
cannon.rotation = cannon.rotation - 5
因此,如果您希望它更慢地旋转,请尝试以下任何一种方法:
local degreesPerFrame = 1 -- or 0.1 or whatever, try several
cannon.rotation = cannon.rotation - degreesPerFrame
如果您想要特定的速度,那么您可以通过enterFrame
获取自上次event.time - appStartTime
以来的时间。然后你会用
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 -- or 0.1 or whatever, try several
cannon.rotation = cannon.rotation - degreesPerSec * deltaTime
...
end
或者你可以让你的物体成为一个运动物理体(注意:不是动态的):
physics.addBody(cannon, "kinematic", {isSensor = false})
cannon.angularVelocity = 1 -- deg/s
但是,您的代码中似乎有动态。如果您的对象是“动态”物理对象(使用“动态”而不是“运动”创建),则必须施加扭矩才能使其转动。恒定扭矩将导致非零角加速度,即只要施加扭矩就会导致角速度增加,除非存在速度相关阻尼,那么通常存在最大阻尼抵消扭矩并且物体到达的最大值稳定的角速度。
使用动态对象将为您提供更平滑,更真实的更改,但在大炮的情况下可能会过度杀伤。我会坚持运动学或根本没有物理学,只是改变旋转值。