旋转对象时使用math.atan2的问题

时间:2015-04-22 14:46:19

标签: math lua rotation corona joystick

嗯......我的问题来自于诚实的生活品质偏好。我目前正在工作,所以我不能提供具体的代码;但是,我现在可以给出伪代码,并在我回家时提供实际的代码。

我创建了一个虚拟操纵杆,我希望将屏幕上的对象映射到math.atan2角度。

如果我使用obj.rotation = angle,这非常有效。

我想要做的事情(并且整夜熬夜试图弄明白)是让对象的过渡顺利进入操纵杆角度,而不仅仅是等于它,这样就不会让人感到紧张。我能想到的唯一想法是得到2的delta并从delta / 4中减去obj.rotation。

大部分都有效,但是当math.atan2的角度从359变为0时,它会让一切都变得混乱。

有没有人碰到这个和/或愿意帮助我?有没有办法让math.atan2吐出数字> 360?我已经在键盘上敲了很长时间。

非常感谢提前。

local function movePaddle(event)
local obj = right
local mMin = math.min;
local mCos = math.cos;
local mSin = math.sin;
local mAtan2 = math.atan2;
local mSqrt = math.sqrt;
local mFloor = math.floor;
local mPi = math.pi;
local radToDeg = 180/mPi;
local degToRad = mPi/180;
local radius = 40
if event.phase == "began" then
display.getCurrentStage():setFocus(obj)
--startMoveX = obj.x; startMoveY = obj.y;
local parent = obj.parent;
    local posX, posY = parent:contentToLocal(event.x, event.y)
    obj.x = posX; obj.y = posY;
    local angle = (mAtan2( posX, posY )*radToDeg)-90;
    local testAngle = angle + 360

    --paddleAnchor:applyTorque(delta*100)
         if angle < 0 then angle = 360 + angle end;
         if angle > 360 then angle = angle - 360 end
         if paddleAnchor.rotation < 0 then paddleAnchor.rotation =      paddleAnchor.rotation + 360 end
         if paddleAnchor.rotation > 360 then paddleAnchor.rotation =   paddleAnchor.rotation - 360 end
         local delta = (angle)-paddleAnchor.rotation

         if delta < angle then 
            paddleAnchor.rotation = paddleAnchor.rotation + delta/5
        elseif paddleAnchor.rotation > angle then 
            paddleAnchor.rotation = paddleAnchor.rotation - delta/5
        end
            print(delta)
            local distance = mSqrt((posX*posX)+(posY*posY));
            if distance >= radius then
                local radAngle = angle*degToRad;
                distance = radius;
                obj.x, obj.y = distance*mCos(radAngle), -    distance*mSin(radAngle)
            else
                obj.x, obj.y = posX, posY;
            end

elseif event.phase == "moved" then
    local parent = obj.parent;
    local posX, posY = parent:contentToLocal(event.x, event.y)
        obj.x = (event.x - event.xStart) + posX
        obj.y = (event.y - event.yStart) + posY
    local angle = (mAtan2( posX, posY )*radToDeg)-90;
    --local testAngle = angle + 360
    --if (paddleAnchor.rotation ~= -angle - 90) then
        --if (paddleAnchor.rotation < -angle - 90) then 
            --paddleAnchor.rotation = (paddleAnchor.rotation + (-angle-90)/2)
    --  elseif

    --end
    --paddleAnchor.rotation = -angle - 90
      if angle < 0 then angle = angle +360 end;
      if angle > 360 then angle = angle - 360 end
      if paddleAnchor.rotation < 0 then paddleAnchor.rotation = paddleAnchor.rotation + 360 end
      if paddleAnchor.rotation > 360 then paddleAnchor.rotation = paddleAnchor.rotation - 360 end
      local testAngle = angle + 360

        --if (-angle-90) >= 0 then angle = 270 end



    local delta = angle-paddleAnchor.rotation
      print(delta)
         if paddleAnchor.rotation < angle then 
            paddleAnchor.rotation = paddleAnchor.rotation + delta/5
        elseif paddleAnchor.rotation > angle then 
            paddleAnchor.rotation = paddleAnchor.rotation - delta/5
        end
    --paddleAnchor:applyTorque(delta)

            local distance = mSqrt((posX*posX)+(posY*posY));
            if distance >= radius then
                local radAngle = angle*degToRad;
                distance = radius;
                obj.x, obj.y = distance*mCos(radAngle), -distance*mSin(radAngle)
            else
                obj.x, obj.y = posX, posY;
            end
elseif event.phase == "ended" or event.phase == "cancelled" then
    obj.y = obj.startMoveY
    obj.x = obj.startMoveX
    display.getCurrentStage():setFocus(nil)
end
return true
end

1 个答案:

答案 0 :(得分:1)

atan2(y, x)给出arg的角度或参数x + i * y。在具有正向的笛卡尔平面中。屏幕坐标不同。

两点之间的角度arg2 - arg1是分数(x2+i*y2)/(x1+i*y1)的参数。由于论证不依赖于实际的积极因素,因此这与

的论证相同
(x2+i*y2)*(x1-i*y1) = (x1*x2+y1*y2) + i*(x1*y2-y1*x2)

因此可以计算为

delta_angle = atan2(x1*y2-y1*x2, x1*x2+y1*y2)

因此,始终计算从最后位置(x1, y1)到新位置(x2, y2)的角度增量,并将其添加到总角度

angle += delta_angle. 

这应该给出一个非跳跃角度测量。