【问题标题】:How to move an object in the direction it's rotated?如何沿旋转方向移动对象?
【发布时间】:2013-01-04 10:19:25
【问题描述】:

我想问在物体旋转的方向上移动物体的正确方法是什么?

现在我有:

    local ang = body:getAngle() * 180 / 3.14      /// get body's rotation in degrees
    local x, y = body:getPosition();      /// get current position
    ang = ang%360

    x = x + math.sin(ang) 
    y = y + math.cos(ang)

    print(ang)

    body:setPosition(x,y)

然而,身体的移动非常奇怪。任何想法我做错了什么?

谢谢

【问题讨论】:

  • 为什么这被标记为 Java、Actionscript 和 Lua?
  • 因为我猜这个原则在所有这些语言中都是相似的。
  • 然后将其标记为与语言无关的或类似的。

标签: java android language-agnostic lua


【解决方案1】:

您需要以弧度为单位的角度,并对 x 值使用余弦函数,对 y 值使用正弦函数。 lua 中的函数(未经测试)看起来像这样:

function moveAlongAngle(body, angleInRadians, dt, speedVector)
    local x, y = body:getPosition()
    x = x + math.cos(angleInRadians) * dt * speedVector.x
    y = y + math.sin(angleInRadians) * dt * speedVector.y
    body:setPosition(x,y)
end

这是因为您将角度从极坐标转换为笛卡尔坐标:http://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates

【讨论】:

    【解决方案2】:

    您正在混合弧度和度数。首先,您将角度转换为弧度,但之后您尝试使用模数对度数进行归一化。你不需要归一化,因为 sin 和 cos 是周期函数。

    math.sin 和 math.cos 实际上期望角度以弧度而不是度为单位,因此您需要除以 180 并乘以 pi。

    这当然是假设您的初始变量 ang 以度为单位。

    【讨论】:

    • >>> 首先将角度转换为弧度,不是这样。我将它们以弧度表示,然后尝试将其转换为度数 * 180 / 3.14
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多