![]() |
|
||||||||||
|
|||||
|
Здравствуйте.
Подскажите пожалуйста правильное описание законов которые заставляют держаться Луне на орбите Земли. Использую Box2D и радиальную гравитацию но этого оказалось не достаточно или же я задаю не правильно координаты (1тыс.км=1пиксель, остальные данные беру из гугла (радиус земли/луны и расстояния между ними)), после чего наделяю импульсом Луну, но как задать правильно его силу и направление остаётся лишь загадкой. Если кто использовал уже или видел мануал по описи законов орбит земли и луны буду очень признателен. p.s. Заточка под Box2D не обязательно. p.p.s. Заранее благодарю Добавлено через 4 минуты Отличный донор http://armorgames.com/play/2016/orbitrunner
__________________
return this... |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 38
|
Для каждого тела создаешь параметры масса, скоростьХ и скоростьУ.
каждый кадр высчитываешь новые значения скорости для каждого обекта: угол между вектором скорости и осью Х: РасстояниеХ и РасстояниеУ - разности координат по Х и по У между объектами. скоростьХ += коэффициент*(объект_N.масса / (масса*расстояние)) * Math.cos(угол); скоростьУ += коэффициент*(объект_N.масса / (масса*расстояние)) * Math.sin(угол); Ну а скорости каждый кадр можно просто складывать с координатами объектов. Если в процессе участвует несколько объектов - через цикл перебираются все объекты с этими формулами. Последний раз редактировалось MAPUTO; 10.06.2011 в 01:43. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
MAPUTO, откуда блин эта формула? %)
Закон всемирного тяготения, параметры орбит и масс из тырнета, считать методом Эйлера. Никаких подгонок, всё честно и так получается.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Цитата:
Боюсь раздел могут перенести в API var eS:b2CircleShape = CreateCircleShape(6.378); // 6378км радиус земли var eF:b2FixtureDef = CreateFix(eS,1); var eB:b2Body = CreateBody(eF,400,200); var lS:b2CircleShape = CreateCircleShape(1.737); // 1737 радиус луны var lF:b2FixtureDef = CreateFix(lS,1); var lB:b2Body = CreateBody(lF,384.467+400,200); // 384467 расстояние между ихними центрами m_world.SetGravity(new b2Vec2(0,0)); m_world.AddController( cosmicgravity);
__________________
return this... Последний раз редактировалось AlexCooper; 10.06.2011 в 02:04. |
|
|||||
|
Добавил исходник.
Если не сложно помогите правильно задать вектор направления Тела задаются в VirtualLabs.as начиная с строки 286 Гравитация просчитывается \Box2D\Dynamics\Controllers\b2GravityController.as
__________________
return this... |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
MAPUTO, какое отношение имеет эта хрень к движению планет?
У меня можно запустив их изначально найти период обращения и перигей и они таки совпадут с тем, что реально есть) public var moon:Sprite = new Sprite(); public var moonA:Point = new Point();//в км/сек^2 public var moonV:Point = new Point();////в км/сек public var moonPos:Point = new Point();//в км public const G:Number = 6.6725e-11 /*это в м^3/(кг*сек^2), а нам нужны километры, потому множим на*/ * 1e-9; public const M:Number = 5.9736e24;//в кг public var timeStep:Number = 3600;//шаг по времени, в секундах, чем меньше, тем точнее. Луна меедленно крутится) public const orbitScreenCenter:Point = new Point(200, 200); public const orbitScale:Point = new Point(1/2000, 1/2000);//масштаб, в 1 пикселе 2000 км public var apo:Number = 0;//используем для подсчета апогея private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point addEventListener(Event.ENTER_FRAME, update); graphics.lineStyle(0); moon.graphics.lineStyle(0); moon.graphics.drawCircle(0, 0, 10); addChild(moon); var Earth:Sprite = new Sprite(); Earth.graphics.lineStyle(0); Earth.graphics.drawCircle(0, 0, 20); addChild(Earth); Earth.x = orbitScreenCenter.x; Earth.y = orbitScreenCenter.y; //начальное положение (апогей), данные НАСА http://nssdc.gsfc.nasa.gov/planetary.../moonfact.html moonPos.x = 0.4055e6; moonPos.y = 0; moonV.x = 0;//супермозг нужен, чтоб понять, что тут нули, лол moonV.y = 0.964; moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x; moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y; } public function update(event:Event):void { var moonDist:Number = moonPos.length; moonA.x = - G * M * moonPos.x / (moonDist * moonDist * moonDist);//з-н всемирного тяготения в проекции на ось х, обе части разделены на массу Луны (ибо нам нужна не сила, а ускорение) moonA.y = - G * M * moonPos.y / (moonDist * moonDist * moonDist); //в box2d можно лепить это ускорение каждый кадр, положение и скорости оно посчитает само, ну мне и самому не сложно, внимание, Метод Эйлера) moonV.x += timeStep * moonA.x; moonV.y += timeStep * moonA.y; moonPos.x += timeStep * moonV.x; moonPos.y += timeStep * moonV.y; graphics.moveTo(moon.x, moon.y); moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x; moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y; graphics.lineTo(moon.x, moon.y); if (moonPos.x < apo) { apo = moonPos.x; trace(-apo); } }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ну вот как Document Class. Не думаю, что исходники без .fla чем-то помогут) Если проблемы и с этим, то читать как использовать примеры от адоба, читать про классы в AS3.
package { import flash.display.*; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; import flash.utils.*; /** * ... * @author de */ public class Main extends Sprite { public var shape2:Shape = new Shape(); public var moon:Sprite = new Sprite(); public var moonA:Point = new Point();//в км/сек^2 public var moonV:Point = new Point();////в км/сек public var moonPos:Point = new Point();//в км public const G:Number = 6.6725e-11 /*это в м^3/(кг*сек^2), а нам нужны километры, потому множим на*/ * 1e-9; public const M:Number = 5.9736e24;//в кг public var timeStep:Number = 3600;//шаг по времени, в секундах, чем меньше, тем точнее. Луна меедленно крутится) public const orbitScreenCenter:Point = new Point(200, 200); public const orbitScale:Point = new Point(1 / 2000, 1 / 2000);//масштаб, в 1 пикселе 2000 км public var apo:Number = 0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point addEventListener(Event.ENTER_FRAME, update); graphics.lineStyle(0); moon.graphics.lineStyle(0); moon.graphics.drawCircle(0, 0, 10); addChild(moon); var Earth:Sprite = new Sprite(); Earth.graphics.lineStyle(0); Earth.graphics.drawCircle(0, 0, 20); addChild(Earth); Earth.x = orbitScreenCenter.x; Earth.y = orbitScreenCenter.y; //начальное положение (апогей), данные НАСА http://nssdc.gsfc.nasa.gov/planetary.../moonfact.html moonPos.x = 0.4055e6; moonPos.y = 0; moonV.x = 0; moonV.y = 0.964; moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x; moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y; } public function update(event:Event):void { var moonDist:Number = moonPos.length; moonA.x = - G * M * moonPos.x / (moonDist * moonDist * moonDist);//з-н всемирного тяготения в проекции на ось х, обе части разделены на массу Луны (ибо нам нужна не сила, а ускорение) moonA.y = - G * M * moonPos.y / (moonDist * moonDist * moonDist); //в box2d можно лепить это ускорение каждый кадр, положение и скорости оно посчитает само, ну мне и самому не сложно, внимание, Метод Эйлера) moonV.x += timeStep * moonA.x; moonV.y += timeStep * moonA.y; moonPos.x += timeStep * moonV.x; moonPos.y += timeStep * moonV.y; graphics.moveTo(moon.x, moon.y); moon.x = moonPos.x * orbitScale.x + orbitScreenCenter.x; moon.y = moonPos.y * orbitScale.y + orbitScreenCenter.y; graphics.lineTo(moon.x, moon.y); if (moonPos.x < apo) { apo = moonPos.x; trace(-apo); } } } }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Спасибо) Помоему лучший на сегодня подарок ко дню рождения))
Добавлено через 3 часа 0 минут -De- Пример действительно хорош, но при статическом положения Земли, дополнив функцию Update этими строчками меня ожидало разочарование, так как Луна остаётся стабильна относительно своей орбиты около Земли и при изменении положения Земли выход из орбиты невозможен, а это не то к чему я стремился.
__________________
return this... Последний раз редактировалось AlexCooper; 10.06.2011 в 16:36. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|