Текущий архив: 2005.03.20;
Скачать: CL | DM;
Вниз
Космические объекты... Найти похожие ветки
← →
Zak3D[@Tm] © (2004-12-12 23:37) [0]Подскажите кто-небудь, как считать движение объектов в космосе?
Мне очень понравилось, как это осуществлено у Wiz"а в его космической игре rust_25. Подскажите, какими формулами подсчитывается движение объекта в космическом просторанстве(в частности корабля)...
← →
wiz © (2004-12-13 10:16) [1]я это делаю через второй закон Ньютона :)
каждый объект имеет: вектор ускорения (a), вектор скорости (v), вектор положения (r).
при просчёте фрейма засекаем время, прошедшее от предыдущего - dt.
тогда:
with object do
begin
a.x := ...; //ускорение (гравитация, двигатели, сопротивление "воздуха" итд)
a.y := ...;
a.z := ...;
v.x := v.x + a.x * dt;
v.y := v.y + a.y * dt;
v.z := v.z + a.z * dt;
r.x := r.x + v.x * dt;
r.y := r.y + v.y * dt;
r.z := r.z + v.z * dt;
end;
это конечно не самые лучшие формулы для "считания" интегралов, но для игрушки imho очень даже ничего.
для поворота(-ов) (вообще говоря) точно такие же формулы. Только всё "про углы" :) - угол поворота, угловая скорость и угловое ускорение.
← →
NailMan © (2004-12-13 16:29) [2]Я сейчас псевдоинерцию мучу. Там и масса учавствует и параметры маневровых движков и прочее. Но без всяких решений уравнений. И 2 системы координат используется. Сложновато, но зато полная свобода по осям.
---
WBR, NailMan aka 2:5020/3337.13
← →
FRick © (2004-12-14 18:57) [3]NailMan
А как создавать сгустки и тому подобныё вещи как у
тебя в Universal ... (дальше непомню)
← →
NailMan © (2004-12-14 19:27) [4]FRick ©
Системы частиц что ли?
Да вобщем-то очень просто. Есть эмиттер с вектором выброса, и есть набор "точек"-частиц. Частица генерируется с некоторым отклонением направления(задаештся величина хаоса) от вектора(текущего) направления эмиттера с с некоторыми. Они в течение времени изменяют свою координату в свободном движении(реальная частица) или всегда движется вдоль текущего направления эмиттера(относительная). При рендере каждая такая "частица" подменяется нужным спрайтом.
Техническую реализацию могу предоставить, но придется самому тебе ее переделывать под сабя, так как все мои модули UT завязаны друг на друга.
---
WBR, NailMan aka 2:5020/3337.13
← →
FRick © (2004-12-14 20:18) [5]Да надо предоставить!
Спасибо!
Можеш на Email!
← →
Zak (2004-12-18 17:44) [6]Вот вроде замутил свой алгоритм движения объекта в космосе. Точнее переделал чужой написанный на С++, только вот не работает он : (. Скорее всего руки у меня кудрявые, собственно поэтому и выкладываю алгоритм. Подскажите где ошибся...
type
hero=record
PosX,PosY : single; //Позиция игрока
VelX,VelY : single; //Ускорение
AccX,AccY : single; //Направление по Х и У отдельно
Angle : integer; //Угол поворота
scaleAngleX,scaleAngleY : integer;
if "НАЖАТ ГАЗ" then
begin
hero.scaleAngleX := cos(Hero.Angle);
hero.scaleAngleY := sin(Hero.Angle);
hero.accx := hero.scaleAngleX*10 ;
hero.accy := hero.scaleAngleY*10 ;
end;
Процедура движения героя (обрабатывается постоянно)
Hero.velx := Hero.velx - Hero.accx;
Hero.vely := Hero.vely - Hero.accy;
Hero.posx := Hero.posx + Hero.velx;
Hero.posy := Hero.posy + Hero.vely;
← →
DeadMeat © (2004-12-19 03:09) [7]Честно говоря (видимо к моему стыду) не видел игру wiz-а... И может поэтому не совсем догоняю чего нужно. Но всеже, если я правильно понял, то вот мой вариант.
const
accelspeed=1; //скорость ускорения
decelspeed=1; //скорость тормжения
approxer=1/10000; //плавность
.....
var
accel:single=0;
.....
if iskeydown ("w") then accel:=accel+accelspeed else if accel>0 then accel:=accel-decelspeed;
if iskeydown ("s") then accel:=accel-accelspeed else if accel<0 then accel:=accel+decelspeed;
.....
x:=x+accel/approxer;
.....
---
...Death Is Only The Begining...
← →
Zak (2004-12-19 09:10) [8]DeadMeat
А угловые скорости? как суда прикрутить правильные повороты?
← →
NailMan © (2004-12-19 11:36) [9]Zak
Блин, ты провоцируешь меня на написание статьи по реализации псевдоинерционного двежения в космосе через угловые скорости.... ;-)
Надо будет сегодня заняться.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
Zak (2004-12-19 13:06) [10]NailMan
: ) было бы здорово : )
← →
ыароплногл (2004-12-19 15:01) [11]Посмотреть-бы игру wizaбб или скрины.
← →
Zak (2004-12-19 17:09) [12]ыароплногл
http://gnar.fatal.ru/ - любуйся
← →
Zak (2004-12-21 15:46) [13]NailMan
А когда ты напишешь эту статью? (сгораю от нетерпения : ))
← →
NailMan © (2004-12-21 22:29) [14]Zak
Да там будет фактически 2 статьи, вот сейчас куски исходников вкорячиваю. Долбанный dreamwaver инет что-то подвешивает постоянно :-(
Завтра и послезавтра я в отпуске, закончу обязательно максимум в четверг.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
Zak (2004-12-24 15:41) [15]NailMan
Уже пятница, может хотябы первую статью выложишь?
← →
NailMan © (2004-12-24 17:19) [16]Zak
Седня вечером(моим) выкладываю на сайт, там в статьях смотри
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
NailMan © (2004-12-24 22:32) [17]Zak
Вот пожалуйста, комментарии, пожелания и какие недочеты можно высказывать - исправим.
http://nailman.cyborghome.ru/ut_article2_1.htm
ЗЫ: Сразу скажу писал несколько спеша, так что возможно что-то будет непонятно. Спрашивай не стесняйся.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
Zak (2004-12-26 09:25) [18]NailMan, огромное спасибо, буду изучать : )
← →
Cash © (2004-12-26 17:22) [19]Парни. Знаете, кто естественно сидит, под Linux {KDE} есть вещь
KSpaceDuel (две машены по орбитам вокруг планеты крутятся)
Физика на УРОВНЕ, как и все остальное, этож линух.
Дак, подумав решил я смонстрячить такую на Omega9.f.
Как Wiz сказал, понадобилось три вектора перемещения, и еще два - на орбиту и двигатели. (это отдельно от вектора скорости)
Можно подсчет скорости сделать (фактически длина отрезка (x,y,dx,dy)) - теорема пифогора.
{Сумма квадратов гепатинуз равна квадрату катета} :)
Изменять направление плавно - dx,dy изменять согласно углу объекта
dx - cos(DegToRad(aUnit.Angle360-90)),
dy - sin(DegToRad(aUnit.Angle360-90)),
если при Angle360 = 0 юнит смотрит вверх.
Angle360, само собой, в пределах [0..359]
Его можно получить так: Angle360:=round(360/256 * Angle256);
Мы же спрайты вращаем по 256-и градусам.
Градусы обязательно в радианы переводить надо, и именно 360, не 256!
Страницы: 1 вся ветка
Текущий архив: 2005.03.20;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.042 c