#1 05-09-2009 09:16

_Luft_
Registered: 01-06-2009
Posts: 25

Нужно осуществить лазерный прицел на снайперскую винтовку

Здраствуйте!
Нужно осуществить лазерный прицел на снайперскую винтовку. Как подсчитать координаты проекции точки прицеливания на препятствия (стены, машины, актеров и тд)? Для того чтобы потом зоздать в них красную точку  прицела
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

#2 06-09-2009 17:05

Wire
From: Днепр
Registered: 19-08-2009
Posts: 56

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

Присоединяюсь к вопросу)

Offline

#3 06-09-2009 17:18

PIT
Registered: 08-09-2008
Posts: 224

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

Если ты знаешь, ка и где уже сделали это, то зачем спрашивать. Возможно есть способ легче, но если тебе известно, то зачем облегчать работу? Есть так есть wink


100 постов - 27 августа;

Offline

#4 06-09-2009 20:21

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

Можно посмотреть в моде portal gun.
Там есть "обработчик" нажатия кнопки мыши и после него какраз идут вычисления.

Offline

#5 06-09-2009 20:56

Deniska
Registered: 23-08-2009
Posts: 18

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

Тоже интересно как это сделать без мат вычислений.
А так, вот примерный алгоритм вычислений, если
известна точка откуда будет выстрел и направление.
(примерно так у меня реализована лазерная пушка)

Основан на методе деления на 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

#6 07-09-2009 18:08

_Luft_
Registered: 01-06-2009
Posts: 25

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

метод деления на 2 сработал !!! grin good  Дениска респект, плюсы и левел + стопиццот!!!  grin
теперь осталось решить проблему направления отрезка. Если делать сохранение координат:

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@

точка лазера будет ходить в горизонтальной плоскости и не подниматься и не опускаться как на скриншоте (я поднимал и опускал прицел а точка на месте, только по горизонтали движется). Нужно както задавать оввсет точек отрезка с учетом наклона blush из скрипта acessory.cs я только понял что там это делается при помощи прикрепления объекта к кости (руки) игрока, но у меня не получалось серавно и с объектом sad

254133372a87t.jpg 89d3b4433721t.jpg

Offline

#7 07-09-2009 19:13

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

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

просто от прикреплённого объекта направляй поиск солкновения и всё) так все углы учитываются


GIMS developer

Offline

#8 21-09-2009 05:38

GTASA
Registered: 13-09-2008
Posts: 476

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

Извините за оффтоп. Вопрос может быть и глупый, но как так прицел снайперки несимметричен? :wow:
_Luft_, скинь свой hud.txd в папке Models.
И выложите пожалуйста финальную версию лазерного прицела, если все получится и будет закончено.

Offline

#9 21-09-2009 15:24

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

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

GTASA wrote:

Извините за оффтоп. Вопрос может быть и глупый, но как так прицел снайперки несимметричен?

скорее всего, на скрине видна работа скрипта, добавляющего при прицеливании текстуру шкалы на экран


GIMS developer

Offline

#10 06-10-2009 07:38

_Luft_
Registered: 01-06-2009
Posts: 25

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

GTASA wrote:

_Luft_, скинь свой hud.txd в папке Models.

мод конечно на ассиметричный прицел на:
Скачать файл Dalva_Custom_Scope_v2.20.zip
(ридми на инглише в архиве по установке)
3д-думмер прав это клео мод + замена текстур. а над лазером еще колдую

Offline

#11 16-03-2010 19:48

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

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

_Luft_ wrote:

точка лазера будет ходить в горизонтальной плоскости и не подниматься и не опускаться как на скриншоте (я поднимал и опускал прицел а точка на месте, только по горизонтали движется). Нужно както задавать оввсет точек отрезка с учетом наклона blush из скрипта acessory.cs я только понял что там это делается при помощи прикрепления объекта к кости (руки) игрока, но у меня не получалось серавно и с объектом sad

Надо взять точку расположения камеры:

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

#12 04-01-2011 02:31

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

Re: Нужно осуществить лазерный прицел на снайперскую винтовку

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

{$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

Board footer

Powered by FluxBB