sir135 Posted July 23, 2011 Share Posted July 23, 2011 Всем, доброго времени суток. Допустим, начальный угол поворота объекта равен 300. Мне нужно его повернуть по кратчайшему пути так, чтобы его угол стал 5(Верная разность между ними 65(кратчайший путь), а не 295, как вы подумали). Как вы видите, простое вычитание из большего меньшее тут не пройдет. Я говорю про самый последний аргумент функции moveObject, поворот по оси Z. Известно, ели давать отрицательные значения, то объект поворачивается направо,- положительные влево. Link to comment
MX_Master Posted July 23, 2011 Share Posted July 23, 2011 хороший вопрос, примерно накидал, но явно чую есть косяки diffZ = newZ - curZ if math.abs(diffZ) > 180 then diffZ = 360 - (curZ - newZ) diffZ = diffZ - math.ceil(diffZ / 360) * 360 end Link to comment
sir135 Posted July 23, 2011 Author Share Posted July 23, 2011 Какие из переменных начальный, конечный углы? Link to comment
MX_Master Posted July 23, 2011 Share Posted July 23, 2011 newZ - конечный, curZ - начальный Link to comment
sir135 Posted July 23, 2011 Author Share Posted July 23, 2011 Мастерь, спасибо, но твоя формула неприменима ко всем случаям поворота.(не работает) Link to comment
Kernell Posted July 23, 2011 Share Posted July 23, 2011 ( 360 - CurrentZ + TargetZ ) - 360 Так норм? Link to comment
Easterdie Posted July 24, 2011 Share Posted July 24, 2011 вероятно ему надо рассчитать поворот турели на цель по кратчайшей траектории, либо направо, если 90 градусов, либо налево, если те же 90 градусов, а не 270. а вообще сравни углы до цели по модулю и вращай в нужную сторону. (дада, я такой умный, но в скриптах воще ноль ЖВ) Link to comment
MX_Master Posted July 24, 2011 Share Posted July 24, 2011 итак, вот он правильный вариант, если углы всегда положительные и не более 360 (: -- находим кратчайший угол поворота diffZ = endZ - startZ -- если нужно, подправим его слегка if diffZ > 180 then diffZ = diffZ - 360 elseif diffZ < -180 then diffZ = diffZ + 360 end если углы могут быть любым числом то -- сделаем углы положительными и не более 360 градусов. if startZ < 0 then startZ = startZ - math.ceil(startZ / 360) * 360 elseif startZ > 360 then startZ = startZ - (startZ % 360) * 360 end if endZ < 0 then endZ = endZ - math.ceil(endZ / 360) * 360 elseif endZ > 360 then endZ = endZ - (endZ % 360) * 360 end -- находим кратчайший угол поворота diffZ = endZ - startZ -- если нужно, подправим его слегка if diffZ > 180 then diffZ = diffZ - 360 elseif diffZ < -180 then diffZ = diffZ + 360 end а вот тестовый скрип целиком, его проверить можно здесь - http://www.lua.org/demo.html -- начальный и конечный углы math.randomseed( os.time() ) startZ = math.random(0,360) endZ = math.random(0,360) -- сделаем углы положительными и не более 360 градусов. if startZ < 0 then startZ = startZ - math.ceil(startZ / 360) * 360 elseif startZ > 360 then startZ = startZ - (startZ % 360) * 360 end if endZ < 0 then endZ = endZ - math.ceil(endZ / 360) * 360 elseif endZ > 360 then endZ = endZ - (endZ % 360) * 360 end -- находим кратчайший угол поворота diffZ = endZ - startZ [b][/b] -- если нужно, подправим его слегка if diffZ > 180 then diffZ = diffZ - 360 elseif diffZ < -180 then diffZ = diffZ + 360 end print( 'startZ = '..startZ..', endZ = '..endZ ) print( 'diffZ = '..diffZ ) startZ - начальный угол endZ - конечный diffZ - разница чтобы повернуть нужно startZ + diffZ Link to comment
sir135 Posted July 24, 2011 Author Share Posted July 24, 2011 Последний скрипт работает на все сто, всем спасибо за помощь, особая благодарность Easterdie, за разъяснение сути вопроса, и MX_Master за готовый скрипт. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now