|
|
|||||
Регистрация: Feb 2012
Сообщений: 212
|
Сбить машиной конус
Здравствуйте, предположим, что машина движется и поворачивает с максимальной скоростью, наматывая круги вокруг конуса. Как узнать на сколько нужно сбросить/увеличить скорость, что бы сбить конус. Пока не будем брать в расчет ускорение, так как я и сейчас даже не знаю с какого бока подступиться к проблеме.
|
|
|||||
А какие данные известны, скорость движения, координаты и угол поворота машины?
Можно сделать таким образом, написать скрипт который находит координаты и радиус круга по которому ездит машинка при заданных параметрах. А далее через цикл подогнать необходимые параметры, для сбития конуса. Скрипт для нахождения координат и радиуса окружности: var posX:Number = 100; // Позиция машинки X var posY:Number = 100; // Позиция машинки Y var speed:Number = 4; // Скорость машинки var angle:Number = 0; // Текущий угол поворота машинки в радианах var angularVel:Number = -0.1; // Изменение угла машинки за 1 кадр, радианы var radius:Number = Math.abs((Math.PI * 2) / angularVel * speed) / (Math.PI * 2); var circleX:Number = 0; var circleY:Number = 0; if(angularVel > 0){ circleX = posX + Math.cos(angle + Math.PI / 2) * radius; circleY = posY + Math.sin(angle + Math.PI / 2) * radius; }else if(angularVel < 0){ circleX = posX + Math.cos(angle - Math.PI / 2) * radius; circleY = posY + Math.sin(angle - Math.PI / 2) * radius; } trace("radius", radius); trace("circleX", circleX); trace("circleY", circleY); Манипулировать вы можете значениями: скорость, скорость разворота.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Feb 2012
Сообщений: 212
|
Да, именно эти данные, но к сожалению подгонять циклом - не вариант, так как дюже затратно. Мне бы формулу какую нибудь. Вообще, меня удивляет столь малое количество информации в интернете по этому вопросу, так как, ИМХО, подобная проблема возникает на начальном этапе в каждой четвертой игре.
|
|
|||||
Цитата:
Я не говорю что моё решение единственное и идеальное, наверняка можно вывести какую-то формулу, если посидеть и подумать подольше. Я описал вам один из путей возможного решения. Для подгонки нужных значений циклом понадобится от силы 10 итераций. Это абсолютно ничтожная нагрузка для одной машинки. Если-бы вам нужно было найти значения сразу для 300 зомби, вот тогда бы ещё стоило задуматься над производительностью.
__________________
Дети не должны знать о своих родителях |
|
|||||
Циклом это более затратнее, чем формулой, да и точность будет меньше. Но я думаю если у вас будет одна машинка и несколько конусов, то нет вообще смысла об этом задумываться, что у вас там че-то тормозить будет или, что это "очень большая нагрузка".
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Странный вы. Вот если бы я делал подобную игру, об оптимизации я бы задумывался в последнюю очередь.
Пусть для начала работает как надо. Пока оно действительно не затормаживает работу - всё в порядке.
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Пусть m - это изменение угла машинки за кадр, n - ваша частота кадров (к/с). Тогда выводимое на экран изменение скорости будет равно V-mn*((xмашинки - xконуса)2 + (yмашинки - yконуса)2)
Если что, то a2 - это a в квадрате. Скорость по идее измеряться должна в пикселях в секунду(пиксель/секунда). Может, я ошибаюсь. Необходимо создать условие для положительного значения выражения выше, при котором будет выводиться + перед изменением скорости (в случае с отрицательным и так будет минус) Последний раз редактировалось Wormhole; 16.06.2014 в 13:30. |
|
|||||
Регистрация: Feb 2012
Сообщений: 212
|
Я много почерпнул из этого видео http://youtu.be/7YwBNRuBvjw в частности формулу ω = vr Из нее нашел радиус окружности пути. Центр окружности нашел путем поворота вектора скорости на 90 градусов в строну поворота, нормализовал его, умножил на радиус окружности и прибавил позицию ТС. Хоть окружность и отражает проделываемый путь, но почему то она "гуляет" туда-суда.
https://www.youtube.com/watch?v=1p_4...ature=youtu.be Так и должно быть? Это какая то допустимая погрешность вычислений или просто баг? ТС точно движется по правильной траектории это именно позиция окружности шалит |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Всё верно найти радиус окружности, затем посчитать угловую скорость. Позиция шалит скорее всего потому что используешь дисплейные координаты, там точность 0.2 или потому что ты рисуешь окружность после того как посчитал положение машинки.
var carAngle:Number = (car.rotation - 90) * Math.PI / 180; var carX:Number = car.x; var carY:Number = car.y; var coneX:Number = cone.x; var coneY:Number = cone.y; var v:Number = 2; stage.addEventListener(MouseEvent.CLICK, onClick); stage.addEventListener(Event.ENTER_FRAME, onFrame); function onClick (event:MouseEvent):void { coneX = cone.x = stage.mouseX; coneY = cone.y = stage.mouseY; } function onFrame (event:Event):void { var dx:Number = coneX - carX; var dy:Number = coneY - carY; var f:Number = Math.sqrt(dx * dx + dy * dy); if(f >= v) { var d:Number = carAngle - Math.PI / 2; var r:Number = f / 2 / Math.cos(d - Math.atan2(dy, dx)); graphics.clear(); graphics.lineStyle(1); graphics.drawCircle(car.x + r * Math.cos(d), car.y + r * Math.sin(d), r); carAngle -= v / r; car.x = carX += v * Math.cos(carAngle); car.y = carY += v * Math.sin(carAngle); car.rotation = carAngle * 180 / Math.PI + 90; } } Последний раз редактировалось Nooob; 11.07.2014 в 21:52. |
|
|||||
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
то рано или поздно произойдет то, что на видео. И чем больше скорость вращения, тем быстрее будет ЭТО. Решение - постоянно пересчитывать. Добавлено через 4 минуты И ещё первым делом, при работе с вращением, нужно откинуть все понятия "динамичности". Точка сместилась, рассчитал радиус, сохранил и на его основе всегда пересчитываешь. А если радиус после каждого витка рассчитывать, то вот такой слет с орбиты и будет. |
Часовой пояс GMT +4, время: 15:32. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|