#1 09-01-2007 20:33

reinstal
Registered: 08-12-2006
Posts: 45

Прикрепление тачек

я тут хочу такой скрипт сделать, типа подъехал ГГ на тачке к стоящему Андрому нажал кнопку "ДА" и тачка прилепилась к нему, и на нём можно будет перевезти тачку куда надо, потом сесть в тачку нажать "НЕТ" и уехать.

вообщем получилось, но только 1 проблема, тачка прилепает в самый центр самолёта, так вот как мне сделать чтоб тачку не переносила в центр, а она оставалась на том месте, где я нажал на кнопку

:AH124
wait 2000
thread 'NRG'
Model.Load(#ANDROM)

:AH124_1
wait 0
if AND
Model.Available(#ANDROM)
jf @AH124
1@ = Car.Create(#ANDROM, 1417.2065, 1621.3806, 19.1275)


:AH124_2
wait 0
if and
00DF:   actor $PLAYER_ACTOR driving            
not Actor.InCar($PLAYER_ACTOR, 1@)
jf @AH124_2
03C0: 2@ = actor $PLAYER_ACTOR car
if and            
00E1:   key_pressed 0 11
0204:   actor $PLAYER_ACTOR near_car_in_car 1@ radius 50.0 50.0 unknown 0
jf @AH124_2  
0683: attach_car 2@ to_car 1@ at_offset 3.0 0.0 0.0  rotation 0.0 0.0 0.0
02D4: unknown_turn_off_car 2@ engine
if
00E1:   key_pressed 0 10
jf @AH124_2
0684: detach_car 2@ 3.0 0.0 0.0 collision_detection 0
jump @AH124_2

Offline

#2 10-01-2007 10:15

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Прикрепление тачек

0683: attach_car 2@ to_car 1@ at_offset 3.0 0.0 0.0  rotation 0.0 0.0 0.0

Попробуй поменять оффсет, видимо они отсчитываются от центра  самолета.

Offline

#3 18-01-2010 14:53

doxtop
Registered: 29-09-2009
Posts: 12

Re: Прикрепление тачек

подобный вопрос, хочу прилепить тачку к пакеру

0683: attach_car @ to_car@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0

опкод справляеться хорошо, вот только не понятен механизм оффсетов.
по z спокойно подходит разница между координатами z пакера и автомобиля.
а вот по х и y ваще какая-то фигня.

offset по х - тачка находиться на пакере только в случае если он 0. в других случаях висит в воздухе, странный оффсет.

по у разница у-ковых координат работает только на первых местах пакера, ближе к хвосту начитаеться хрень...

подскажите плиз где про эти координаты и офсеты вообще почитать можно.

Offline

#4 18-01-2010 21:45

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Прикрепление тачек

0683: attach_car 1@ to_car 0@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0

Оффсеты (смещения) отсчитываются от опорной точки машины 0@ в системе координат, связанной с этой машиной, а не в мировой системе координат. В общем случае эти оффсеты не совпадают с разницей мировых координат машин (для равенства необходимо учесть углы поворота относительно мировых осей). Если все углы поворота машины относительно мировых осей равны нулю, то направления мировых осей совпадают с направлениями собственных осей машины. Отсюда становится ясно, что в 0683 (и других подобных опкодах) X оффсет отсчитывается по боковому направлению от центра машины (>0 - вправо, <0 - влево), Y оффсет отсчитывается по продольному направлению (>0 вперед, <0 назад), с Z всё понятно - отсчитывается вверх (или вниз, если <0). Углы поворота отсчитываются также относительно осей машины.

Last edited by Den_spb (18-01-2010 21:50)

Offline

#5 22-01-2010 00:29

doxtop
Registered: 29-09-2009
Posts: 12

Re: Прикрепление тачек

Благодарю за разьяснения, действительно то что оффсеты относительно пакера считаються нужно было догадаться сразу после того как с глобальными координатами ниче не получилось smile

вобщем начал пробовать прикреплять, к сожалению самое правильное расстояние получаеться банальной теоремой пифагора. к сожалению потому что расстояние беззнаковое, и не прокатит за оффсет
а у меня чето мозк не работает уже сеня smile

0407: store_coords_to 7@ 8@ 9@ from_car 5@ with_offset 0.0 0.0 0.0
0407: store_coords_to 10@ 11@ 12@ from_car 6@ with_offset 0.0 0.0 0.0

0063: 9@ -= 12@ // (float)    //- z difference
077D: 14@ = car 5@ x_angle

//0087: 22@ = 10@ // (float) 
0063: 10@ -= 7@ // (float)    //- x difference
0063: 11@ -= 8@ // (float)    //- y difference

0087: 23@ = 10@ // (float)
006B: 10@ *= 23@ // (float) x2 // почему-то работало только так

0087: 24@ = 11@ // (float)
006B: 11@ *= 24@ // (float) y2

005B: 10@ += 11@ // (float) //x2+y2
01FB: 25@ = square_root 10@ // - идеальное расстояние, но не известен знак

...
тут нужно как-то выкупить знак 
...
0683: attach_car 5@ to_car 6@ with_offset 0.0 25@ 9@ rotation 14@ 0.0 0.0

потом я уже нашел в хелпе коды для квадратов sqr($var) и все такое, но не стал менять рабочее smile

вспомнилось что нужно только перенести и повернуть и получить нахаляву новые координаты, а учитывая что по х всегда 0, потому как крепим пока не как поставили, а на линии на пакере, то вообще получаеться одно уравнение

и родился вророй вариант

0063: 9@ -= 12@ // (float)    //- z difference
077D: 14@ = car 5@ x_angle    

0174: 10@ = car 6@ Z_angle 
02F7: 13@ = sine 10@ // (float) 

0063: 8@ -= 11@ // (float)    //y - y0
0073: 8@ /= 13@ // (float) y-y0/sin()

wait 500
0683: attach_car 5@ to_car 6@ with_offset 0.0 8@ 9@ rotation 14@ 0.0 0.0  // 2nd bottom place
wait 500

во втором варианте получаеться отличный оффсет, сразу со знаком и всем. Но на практике в некоторых местах на втором этаже пакера присудсвует некоторая погрешность и выглядит некрасиво немножко.

Так что приходиться пока считать 1м вариантом число, а из второго брать знак оффсета, рачно короче. Если кто поможет тыкнуть в готовую реализацию подобного аттачмента, либо помочь советом милости просим. Погрешность там действительно не совсем значительная, но пифагор ваще идеально ставит.

У меня угол ротейшена береться x_angle с текущей машины подозревая что она станет где нажали кнопку, а если сдвигаеться немного то колеса какбы немного утопшие в пакере.

ну и понятно что пока задом заезжать на пакер я не рискую, угол атача еще не высчитывал smile

кстати координаты это кул, но заметил еще один потенциальный деффект, если прижать пакер немного грузом, то координаты по z тоже не совсем правильно считаються. Видимо уровень сжатия подвески тоже нужно учитывать в идеальном варианте smile
Смотрел в структуры, suspension height может или level to the ground хз, тут тоже нуждаюсь в подсказках smile

Last edited by doxtop (22-01-2010 00:39)

Offline

#6 23-01-2010 21:30

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Прикрепление тачек

насколько я помню, указывается оффсет относительно центра машины с уже учтённым углом...


GIMS developer

Offline

#7 23-01-2010 22:14

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Прикрепление тачек

вобщем начал пробовать прикреплять, к сожалению самое правильное расстояние получаеться банальной теоремой пифагора. к сожалению потому что расстояние беззнаковое, и не прокатит за оффсет

Тут вообще-то матрица преобразования координат нужна.

Offline

#8 23-01-2010 22:59

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Прикрепление тачек

Не забываем что
02F7: 13@ = sine 45.0 // (float)  на самом деле cos.
а для cos наоборот.


I know everything and nothing...

Offline

#9 25-01-2010 11:14

doxtop
Registered: 29-09-2009
Posts: 12

Re: Прикрепление тачек

Den_spb wrote:

Тут вообще-то матрица преобразования координат нужна.

А как в скриптах реализована работа с матрицами? насколько я понимаю что никак,
все равно раскладывать по уравнениям

x = x1*cos A  + y1*sinA + x0
y = x1*sin A  + y1*cosA + y0

учитывая что в новых координатах x1 =0

x = y1*sinA + x0
y = y1*cosA + y0

y1 = y-y0/cosA

- что и написано выше с учетом того что 02F7: 13@ = sine 10@ // (float)  это косинус

я просто изначально подумао грешным делом обойтись двухмерными преобразованиями, а за растояние по Z взять разницу координат по Z.

к сожалению ничего не получилось, после долгого катания на пакере в разных местах, особенно в сельской местности в горах, рухнули надежды не только на разницу по Z smile но и на угол поворота x_angle машины в качестве ротейшена  smile

придеться таки сделать полный перенос по всем понятиям и узнать все координаты smile

а вот с углами rotation  в

0683: attach_car 5@ to_car 6@ with_offset 0.0 25@ 9@ rotation 14@ 0.0 0.0

не все так просто, по сути канечно можно по Z проигнорировать и оставить 0, чтобы машина прилипала правильно без перегибов, это если оставлять возможность прикреплять тачку только правильно заехав на пакер.

по Y нужно чтобы определить задом заехал или передом, думаю можно четко весь угол не знать, а просто 180 либо 0.

ну и по Х это полюбому нужно, но банальный угол наклона машины не пройдет когда пакер тоже наклонен вниз

вот думаю хватит ли мне разниц углов пакера и машины или тоже мудрить в сторону преобразования координат в сферических системах...

Last edited by doxtop (25-01-2010 11:16)

Offline

#10 25-01-2010 11:31

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Прикрепление тачек

doxtop wrote:

по Y нужно чтобы определить задом заехал или передом, думаю можно четко весь угол не знать, а просто 180 либо 0.

При Y угле, равном 0, машина будет стоять на колёсах, а при 180 - будет перевёрнута вверх дном. А вокруг вертикальной оси отсчитывается угол Z.

Offline

Board footer

Powered by FluxBB