forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Памагитяяяяяяяяяя... (http://forum.boolean.name/showthread.php?t=8098)

Mark Castle 01.04.2009 21:17

Памагитяяяяяяяяяя...
 
Народ...
Код:

ExtractAnimSeq(a\entity,1,32 ) ; 1- idle
ExtractAnimSeq(a\entity,33,83 ) ; 2- look_around
ExtractAnimSeq(a\entity,84,117 ) ; 3- walk
ExtractAnimSeq(a\entity,118,134 ) ; 4- run
ExtractAnimSeq(a\entity,135,150 ) ; 5- arm
ExtractAnimSeq(a\entity,150,159 ) ; 6- shoot_forward
ExtractAnimSeq(a\entity,161,181 ) ; 7- disarm
ExtractAnimSeq(a\entity,182,197 ) ; 8- shoot_down
ExtractAnimSeq(a\entity,198,213 ) ; 9- shoot_up
ExtractAnimSeq(a\entity,214,239 ) ; 10- reload
ExtractAnimSeq(a\entity,240,270 ) ; 11- die1
ExtractAnimSeq(a\entity,271,311 ) ; 12- die2
ExtractAnimSeq(a\entity,312,325 ) ; 13- die3

Код:

Function update_bot()
        For w.bot = Each bot
MoveEntity w\entity,0,0,-0.01
If EntityCollided(w\entity,wall_type)
TurnEntity w\entity,0,Rnd(360),0
EndIf
If EntityDistance(w\entity,user)=5
Animate w\entity,1,0.3,st2,1
End If
Next
End Function

как сделать так,чтоб если враг(w\entity) меня заметил,то поворачивался в мою сторону фейсом,и анимировался
ExtractAnimSeq(a\entity,33,83 ) ; 2- look_around
ССЫЛКИ НА HELP НЕ ПРЕДЛАГАТЬ!уже все перечитал...

impersonalis 01.04.2009 21:22

Ответ: Памагитяяяяяяяяяя...
 
что вы вкладываете в термин "заметил"?
1) ваше попадние на ось аппликат бота
2) 1+необохдимое расстояние
3) видимость в конусе камеры
4) 2+3
...

ABTOMAT 01.04.2009 22:01

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

ССЫЛКИ НА HELP НЕ ПРЕДЛАГАТЬ!уже все перечитал...
Ок не предложу честное слово ;)
Оптимально имхо в данном случае конус видимости бота + расстояние
Ссылки:

О да, я ърутален
Кстати сказать в своё время ответы на те же самые вопросы именно там и нашёл ;) И у меня был с зелёненькой обложкой...

Mark Castle 01.04.2009 22:06

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от impersonalis (Сообщение 102481)
что вы вкладываете в термин "заметил"?
1) ваше попадние на ось аппликат бота
2) 1+необохдимое расстояние
3) видимость в конусе камеры
4) 2+3
...

всмысле если я попадаю в зону видимости бота...ну чтоб Вы сделали?

jimon 01.04.2009 23:11

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

ну чтоб Вы сделали?

поспал бы :/

NitE 01.04.2009 23:44

Ответ: Памагитяяяяяяяяяя...
 
у тебя нет ниодного конкретного вопроса... ну вот ябы сделал конус, припарентил-бы его к голове бота, сделалбы колизийй с игроком, если коллизится то типа заметил, потом включил-бы анимацию бега, заморозил-бы оси y и z сделалбы pointentity на игрока, начал-бы двигать по нормализованному вектору на себя... ну что помогло ?

Venom 02.04.2009 09:55

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от NitE (Сообщение 102508)
ну вот ябы сделал конус, припарентил-бы его к голове бота, сделалбы колизийй с игроком, если коллизится то типа заметил

Зачем же извращатся так :) Как-то мне приходилось решать эту задачу. Математика выручила :) Надо найти скалярное произведение вектора между наблюдающим и наблюдаемым обьектов и вектора из матрицы трансформации наблюдаемого обьекта:
Код:

Local xang#, yang#
Local what%, from%, temp#, view#, dist#

Graphics3D(800, 600, 0, 2)
SetBuffer(BackBuffer())

;Наблюдаемый обьект
what = CreateSphere()
PositionEntity(what, 0.0, 0.0, 5.0)

;Наблюдающий обьект (для наглядности - камера)
from = CreateCamera()

;Угол обзора +\- 25 градусов
;косинус нужен т.к. сравниваем со скалярным произведением (фактически косинусом угла между векторами)
view = Cos(25)

;Квадат дистанции "видимости" (сравнивать будет тоже с квадратом для оптимизации)
dist = 100 ;10 ^ 2

;Для наглядности установим такой же угол обзора у камеры
CameraZoom(from, 1.0 / Tan(25))

Repeat
   
    ;Управление камерой
    ;-------------------------------------
    xang = xang - MouseXSpeed() * 0.35
    yang = yang + MouseYSpeed() * 0.35
    MoveMouse(400, 300)
    xang = xang - Int(xang * 0.00277778) * 360.0
    If (xang < 0.0) Then
        xang = 360 + xang
    EndIf
    If (yang > +85.0) Then
        yang = +85.0
    EndIf
    If (yang < -85.0) Then
        yang = -85.0
    EndIf
    RotateEntity(from, yang, xang, 0.0)
    If (KeyDown(200)) Then
        MoveEntity(from, 0.0, 0.0, +0.5)
    EndIf
    If (KeyDown(208)) Then
        MoveEntity(from, 0.0, 0.0, -0.5)
    EndIf
    ;-------------------------------------
   
    RenderWorld()
   
    ;-------------------------------------
    ;Матрица трансформации
    ;  0  1  2
    ;0 xx xy xz \
    ;1 yx yy yz  - матрица трансформации (поворот + масштаб)
    ;2 zx zy zz /
    ;3 tx ty tz - вектор сдвига
    ;Вектор из from в what
    xsub = EntityX(what) - EntityX(from);GetMatElement(what, 3, 0) - GetMatElement(from, 3, 0)
    ysub = EntityY(what) - EntityY(from);GetMatElement(what, 3, 1) - GetMatElement(from, 3, 1)
    zsub = EntityZ(what) - EntityZ(from);GetMatElement(what, 3, 2) - GetMatElement(from, 3, 2)
    ;Квадрат длины вектора (квадрат дистанции между обьектами)
    temp = xsub * xsub + ysub * ysub + zsub * zsub
    ;Проверяем квадрат дистанции
    If (temp < dist) Then
       
        Text(10, 10, "Центр обьекта на расстоянии обзора")
       
        ;Обьект на расстоянии видимости, можно вычислять дальше
        ;квадратный корень и обратная величина(чтобы заменить деления умножениями)
        temp = 1.0 / Sqr(temp)
        ;Нормализация
        xsub = xsub * temp
        ysub = ysub * temp
        zsub = zsub * temp
        ;Скалярное произведение с последней строкой from матрицы трансформации
        temp = xsub * GetMatElement(from, 2, 0) + ysub * GetMatElement(from, 2, 1) + zsub * GetMatElement(from, 2, 2)
        ;Сравниваем углы и выводим сообщение
        If (temp > view) Then
       
            Text(10, 20, "Центр обьекта в поле зрения")
           
        EndIf
    EndIf
    ;-------------------------------------
   
    Flip()
Until (KeyDown(1))
End

лучше заюзать вариант на С, т.к. квадратный корень и деление не есть хорошо и можно заменить их быстрым float-magic трюком :)
Код:

extern long entity_in_view(float *from, float *what, float dist, float view) {
    float xsub, ysub, zsub, temp, half;
    long conv;
    xsub = what[16] - from[16];
    ysub = what[17] - from[17];
    zsub = what[18] - from[18];
    temp = xsub * xsub + ysub * ysub + zsub * zsub;
    if (dist < dist) {
        half = temp * 0.5F;
        conv = *(long*)&temp;
        conv = 0x5F3759DF - (conv >> 1);
        temp = *(float*)&conv;
        temp = temp * (1.5F - half * temp * temp);
        xsub *= temp;
        ysub *= temp;
        zsub *= temp;
        return ((xsub * from[28] + ysub * from[29] + zsub * from[30]) > view) ? 1 : 0;
    }
    return 0;
}

И на PureBasic, кому С не в радость :)
Код:

Structure FPTR
    f.f[0]
EndStructure

ProcedureDLL entity_in_view(*from.FPTR, *what.FPTR, dist.f, view.f)
    Static xsub.f, ysub.f, zsub.f, temp.f, half.f, conv, *int.LONG, *flt.FLOAT
    xsub = *what\f[16] - *from\f[16]
    ysub = *what\f[17] - *from\f[17]
    zsub = *what\f[18] - *from\f[18]
    temp = xsub * xsub + ysub * ysub + zsub * zsub
    If (temp < dist)
        half = temp * 0.5
        *int = @temp
        conv = *int\l
        conv = $5F3759DF - (conv >> 1)
        *flt = @conv
        temp = *flt\f
        temp * (1.5 - half * temp * temp)
        xsub * temp
        ysub * temp
        zsub * temp
        temp = xsub * *from\f[28] + ysub * *from\f[29] + zsub * *from\f[30]
        If (temp > view)
            ProcedureReturn 1
        EndIf
    EndIf
    ProcedureReturn 0
EndProcedure

правка: опечатка

tormoz 02.04.2009 16:23

Ответ: Памагитяяяяяяяяяя...
 
блин, извращенцы одни

Код:

yaw#=DeltaYaw(bot,player)

If abs(yaw)<ang
  включаем боту режим атаки. (естественно обрабатываем анимацию и тд)
EndIf

Где ang# - половина угла обзора бота. у человека обзор обычно равен 60 градусам

аффтар, рано тебе еще такие игры писать. ты спотыкаешся на самом начале лестницы, а впереди километровые скалы.

Venom 02.04.2009 17:01

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от tormoz (Сообщение 102555)
блин, извращенцы одни

Код:

yaw#=DeltaYaw(bot,player)

If abs(yaw)<ang
  включаем боту режим атаки. (естественно обрабатываем анимацию и тд)
EndIf


Ага, а еще DeltaPitch и EntityDistance и получишь тоже самое, только медленее раз в *цать. :)

HolyDel 02.04.2009 17:49

Ответ: Памагитяяяяяяяяяя...
 
да не. не медленнее.
эти команды-же в рантаймах а не на скриптах. значит скорость будет такой-же. +\- 20%.

Venom 02.04.2009 18:49

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от HolyDel (Сообщение 102564)
да не. не медленнее.
эти команды-же в рантаймах а не на скриптах. значит скорость будет такой-же. +\- 20%.

Какие еще скрипты?:)
Я конечно преувеличил насчет "*цать раз", в 2.25 раза быстрее, я не поленился и проверил (хотя и так понятно было что быстрее) все варианты:
Код:


Код на BlitzBasic:  200 мс.
Код на PureBasic:  78 мс.
Код на Pelles C (макс. опт.): 19 мс.
Код на VS9 (макс. опт.):  21 мс.
EntityDistance+DeltaYaw+DeltaPitch: 450 мс.

Замерял на P-IV 3000, 1000000 вызовов, как с RDTSC, так и с Millisecs()
ЗЫ
Такой прирост в данной задаче, имхо, существенен

tormoz 02.04.2009 19:12

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от Venom (Сообщение 102571)
Какие еще скрипты?:)
Я конечно преувеличил насчет "*цать раз", в 2.25 раза быстрее, я не поленился и проверил (хотя и так понятно было что быстрее) все варианты:
Код:


Код на BlitzBasic:  200 мс.
Код на PureBasic:  78 мс.
Код на Pelles C (макс. опт.): 19 мс.
Код на VS9 (макс. опт.):  21 мс.
EntityDistance+DeltaYaw+DeltaPitch: 450 мс.

Замерял на P-IV 3000, 1000000 вызовов, как с RDTSC, так и с Millisecs()
ЗЫ
Такой прирост в данной задаче, имхо, существенен

Ну точно извращенцы :-D

Для особенно тугих математиков: разводить геммор с кучей вычислений есть смысл на действительно медленных функциях, а не на тех, которые выполняются 1 млн за 400 мс.

Нет АБСОЛЮТНО никакого смысла во всех ваших "ускорениях" на 300-400 строк с мозголомными формулами в реальном проекте.:wallbash:

Venom 02.04.2009 19:25

Ответ: Памагитяяяяяяяяяя...
 
Цитата:

Сообщение от tormoz (Сообщение 102576)
Ну точно извращенцы :-D

Для особенно тугих математиков: разводить геммор с кучей вычислений есть смысл на действительно медленных функциях, а не на тех, которые выполняются 1 млн за 400 мс.

Нет АБСОЛЮТНО никакого смысла во всех ваших "ускорениях" на 300-400 строк с мозголомными формулами в реальном проекте.:wallbash:

Ну и где же ты там увидел мозголомные формулы, тугой "дэвелопер" ты наш?:) В школе учился? Математику, геометрию проходил? Формулы и код элементарны. Лично у меня по математике выше тройки никогда и не было, но мне это как видишь не помешало :)
Тем более что это часть ИИ как я понял, а его оптимизировать не помешает (иначе что еще то? :))
Гонору то сколько, вроде далеко не маленький уже, должен соображать что к чему :)

impersonalis 02.04.2009 20:03

Ответ: Памагитяяяяяяяяяя...
 
Товарищ, я по математике не блистал познаниями, да и прогером формально никогда не был, но уже начало вашего кода уныло чуть боее чем полностью.
Откуда эти константы (в плане - хрен ли так оформлено, а не - откуда взяты значения)? Где переменные? Почему код настолько конкретен (простая смена разрешения рушит всё к чертям)?
Вызов функции Text сжирает производительность многократно.
Уважайте чужой труд - ссылка на Carmack’s Unusual Inverse Square Root (game/code/q_math.c) не помешает

HolyDel 02.04.2009 20:25

Ответ: Памагитяяяяяяяяяя...
 
интересно. не покажешь функцию на блице?
похоже я переоценил скорость EntityDistance, DeltaYaw и DeltaPitch и они сделаны криво уже в рантаймах.
Цитата:

Вызов функции Text сжирает производительность многократно.
об этом можно много спорить, но 24x это очень круто. все таки эта функция не один раз за кадр будет вызываться.

в вартиче например обработка юнитов (а там было довольно много всяких EntityDistance и DeltaYaw-ов) занимала 5-6 мс за кадр. если бы удалось снизить до 1-2 значит в сцене (не в кадре) могло быть на 20-50% больше юнитов. плохо чтоли?


Часовой пояс GMT +4, время: 08:28.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot