You are not logged in.
Здраствуйте!
Нужно осуществить лазерный прицел на снайперскую винтовку. Как подсчитать координаты проекции точки прицеливания на препятствия (стены, машины, актеров и тд)? Для того чтобы потом зоздать в них красную точку прицела
04D5: create_corona_at x@ y@ z@ radius 0.05 type 0 flare 0 RGB 255 0 0
ЗЫ или объясните как это осуществлено (подсчет) в моде acessory.cs, но хотелось бы попроще чем в нем
Last edited by _Luft_ (05-09-2009 09:21)
Offline
Присоединяюсь к вопросу)
Offline
Если ты знаешь, ка и где уже сделали это, то зачем спрашивать. Возможно есть способ легче, но если тебе известно, то зачем облегчать работу? Есть так есть
100 постов - 27 августа;
Offline
Можно посмотреть в моде portal gun.
Там есть "обработчик" нажатия кнопки мыши и после него какраз идут вычисления.
Offline
Тоже интересно как это сделать без мат вычислений.
А так, вот примерный алгоритм вычислений, если
известна точка откуда будет выстрел и направление.
(примерно так у меня реализована лазерная пушка)
Основан на методе деления на 2. Но это больше
подходит для одиночного выстрела, иначе
будет притормаживать при высокой точности.
const ITERATIONS = 8 // Точность 2^(ITERATIONS+1) end 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 1.0 0.6 // BULLET START POINT 04C4: store_coords_to 7@ 8@ 9@ from_actor $PLAYER_ACTOR with_offset 0.0 500.0 0.6 // BULLET MAX POINT if 86BD: not no_obstacles_between 1@ 2@ 3@ and 7@ 8@ 9@ solid 1 car 0 actor 0 object 0 particle 0 then for 0@ = 1 to ITERATIONS 0087: 4@ = 1@ // Находим центр отрезка 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 if 86BD: not no_obstacles_between 1@ 2@ 3@ and 4@ 5@ 6@ solid 1 car 0 actor 0 object 0 particle 0 then 0087: 7@ = 4@ // Если пересекается на 1й половине 0087: 8@ = 5@ // То дальше берём 1й отрезок 0087: 9@ = 6@ else 0087: 1@ = 4@ // Иначе берём 2й отрезок 0087: 2@ = 5@ 0087: 3@ = 6@ end end 0087: 4@ = 1@ // Еще раз делим на 2 для большей точности 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 // Координаты = 4@,5@,6@ else // Нет пересечений end
Offline
метод деления на 2 сработал !!!
Дениска респект, плюсы и левел + стопиццот!!!
теперь осталось решить проблему направления отрезка. Если делать сохранение координат:
04C4: store_coords_to 7@ 8@ 9@ from_actor $PLAYER_ACTOR with_offset 0.0 500.0 0.6 // BULLET MAX POINT
068D: get_camera_position_to 1@ 2@ 3@
точка лазера будет ходить в горизонтальной плоскости и не подниматься и не опускаться как на скриншоте (я поднимал и опускал прицел а точка на месте, только по горизонтали движется). Нужно както задавать оввсет точек отрезка с учетом наклона из скрипта acessory.cs я только понял что там это делается при помощи прикрепления объекта к кости (руки) игрока, но у меня не получалось серавно и с объектом
Offline
Извините за оффтоп. Вопрос может быть и глупый, но как так прицел снайперки несимметричен? :wow:
_Luft_, скинь свой hud.txd в папке Models.
И выложите пожалуйста финальную версию лазерного прицела, если все получится и будет закончено.
Offline
Извините за оффтоп. Вопрос может быть и глупый, но как так прицел снайперки несимметричен?
скорее всего, на скрине видна работа скрипта, добавляющего при прицеливании текстуру шкалы на экран
GIMS developer
Offline
_Luft_, скинь свой hud.txd в папке Models.
мод конечно на ассиметричный прицел на:
Скачать файл Dalva_Custom_Scope_v2.20.zip
(ридми на инглише в архиве по установке)
3д-думмер прав это клео мод + замена текстур. а над лазером еще колдую
Offline
точка лазера будет ходить в горизонтальной плоскости и не подниматься и не опускаться как на скриншоте (я поднимал и опускал прицел а точка на месте, только по горизонтали движется). Нужно както задавать оввсет точек отрезка с учетом наклона
из скрипта acessory.cs я только понял что там это делается при помощи прикрепления объекта к кости (руки) игрока, но у меня не получалось серавно и с объектом
Надо взять точку расположения камеры:
068D: get_camera_position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3
и точку, в которую нацелена камера:
068E: get_camera_target_point_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3
Тогда можно будет точно узнать направление.
Last edited by Den_spb (16-03-2010 19:49)
Offline
Немного модифицировал скрипт - теперь источник света движется во всех направлениях, в зависимости от того, куда целится игрок.
{$CLEO} const ITERATIONS = 8 // Точность 2^(ITERATIONS+1) end wait 0 while true wait 0 if not player.Defined($PLAYER_CHAR) then continue end if and 02D8: actor $PLAYER_ACTOR current_weapon == 34 00E1: key_pressed 0 6 then 068D: get_camera_position_to 7@ 8@ 9@ 068E: get_camera_target_point_to 1@ 2@ 3@ 0063: 1@ -= 7@ // (float) 0063: 2@ -= 8@ // (float) 0063: 3@ -= 9@ // (float) 1@ *= 500.0 2@ *= 500.0 3@ *= 500.0 005B: 7@ += 1@ // (float) 005B: 8@ += 2@ // (float) 005B: 9@ += 3@ // (float) 068D: get_camera_position_to 1@ 2@ 3@ if 86BD: not no_obstacles_between 1@ 2@ 3@ and 7@ 8@ 9@ solid 1 car 1 actor 1 object 1 particle 1 then for 0@ = 1 to ITERATIONS 0087: 4@ = 1@ // Находим центр отрезка 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 if 86BD: not no_obstacles_between 1@ 2@ 3@ and 4@ 5@ 6@ solid 1 car 1 actor 1 object 1 particle 1 then 0087: 7@ = 4@ // Если пересекается на 1й половине 0087: 8@ = 5@ // То дальше берём 1й отрезок 0087: 9@ = 6@ else 0087: 1@ = 4@ // Иначе берём 2й отрезок 0087: 2@ = 5@ 0087: 3@ = 6@ end end 0087: 4@ = 1@ // Еще раз делим на 2 для большей точности 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 04D5: create_corona_at 4@ 5@ 6@ radius 2.0 type 0 flare 0 RGB 255 0 0 016F: create_particle 3 rotation_factor 0.0 size 2.0 intensity 150 flags 255 0 0 at 4@ 5@ 6@ 09E5: create_flash_light_at 4@ 5@ 6@ RGB_mask 255 0 0 radius 4.0 end end end
Offline