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% больше юнитов. плохо чтоли?

tormoz 02.04.2009 22:16

Ответ: Памагитяяяяяяяяяя...
 
Товарисч Веном, извольте выложить ваши тесты.
Я выражаю сомнение в их адекватности (хотя отдаю должное вашему математическому гению) :))))))

HolyDel 02.04.2009 22:28

Ответ: Памагитяяяяяяяяяя...
 
кстати да, тесты фстудию!

Venom 03.04.2009 10:00

Ответ: Памагитяяяяяяяяяя...
 
Вложений: 1
Цитата:

Сообщение от impersonalis (Сообщение 102590)
Товарищ, я по математике не блистал познаниями, да и прогером формально никогда не был, но уже начало вашего кода уныло чуть боее чем полностью.

И чем же оно "уныло"? Цитаты приведи с пояснениями или только ля-ля-тополя?:)
Цитата:

Сообщение от impersonalis (Сообщение 102590)
Откуда эти константы (в плане - хрен ли так оформлено, а не - откуда взяты значения)? Где переменные?

В упор не вижу констант, где ты их там нашел? Или ты иеешь ввиду угол и дальность обзора? Так я их для примера взял. Непонимаю.
Цитата:

Сообщение от impersonalis (Сообщение 102590)
Почему код настолько конкретен (простая смена разрешения рушит всё к чертям)?

Что она рушит? Прямо сейчас сменил разрешение - все работает как работало. Тоже непонимаю :)
Цитата:

Сообщение от impersonalis (Сообщение 102590)
Вызов функции Text сжирает производительность многократно.

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

Сообщение от impersonalis (Сообщение 102590)
Уважайте чужой труд - ссылка на Carmack’s Unusual Inverse Square Root (game/code/q_math.c) не помешает

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

ЗЫ
Хотите тесты? Их есть у меня! :)
Код:

;kernel32.decls:
;
;.lib "kernel32.dll"
;Sleep(time%)
;QueryPerformanceCounter(count*)
;QueryPerformanceFrequency(frequency*)

;Для расчета времени из 64-битных значений RDTSC:
;Код на PureBasic:
;ProcedureDLL.f Time(*cnt1.QUAD, *cnt2.QUAD, *freq.QUAD)
;    ProcedureReturn (*cnt2\q - *cnt1\q) * 1000.0 / *freq\q
;EndProcedure

;Оригинал
Function entity_in_view1%(from%, what%, dist#, view#)
    If (EntityDistance(from, what) < dist) Then
        If ((Abs(DeltaYaw(from, what)) < view) And (Abs(DeltaPitch(from, what)) < view)) Then
            Return 1
        EndIf
    EndIf
    Return 0
End Function

;Аналог
Function entity_in_view2%(from%, what%, dist#, view#)
    Local xsub#, ysub#, zsub#, temp#
    xsub = EntityX(what) - EntityX(from)
    ysub = EntityY(what) - EntityY(from)
    zsub = EntityZ(what) - EntityZ(from)
    temp = xsub * xsub + ysub * ysub + zsub * zsub
    If (temp < dist) Then
        temp = 1.0 / Sqr(temp)
        xsub = xsub * temp
        ysub = ysub * temp
        zsub = zsub * temp
        temp = xsub * GetMatElement(from, 2, 0) + ysub * GetMatElement(from, 2, 1) + zsub * GetMatElement(from, 2, 2)
        If (temp > view) Then
            Return 1
        EndIf
    EndIf
    Return 0
End Function

Const CDIST# = 10.0 ;Расстояние обзора
Const CVIEW# = 25.0 ;Угол обзора (+\-)

Local from%, what%, dist#, view#
Local cnt1%, cnt2%, freq%, pass%, res1#, res2#

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

;Два обьекта
from = CreateCube()
what = CreateCube()

;Отодвигаем немного
PositionEntity(from, 0.0, 0.0, +3.0)
PositionEntity(what, 0.0, 0.0, -3.0)

;Банки для RDTSC
cnt1 = CreateBank(8)
cnt2 = CreateBank(8)
freq = CreateBank(8)

;Оригинал -------------------------------------------------
dist = CDIST
view = CVIEW

Sleep(25)
QueryPerformanceCounter(cnt1)
For pass = 1 To 1000000
    entity_in_view1(from, what, dist, view)
Next
QueryPerformanceCounter(cnt2)
QueryPerformanceFrequency(freq)
res1 = Time(cnt1, cnt2, freq)
;--------------------------------------------------------

;Аналог -------------------------------------------------
dist = CDIST * CDIST
view = Cos(CVIEW)

Sleep(25)
QueryPerformanceCounter(cnt1)
For pass = 1 To 1000000
    entity_in_view2(from, what, dist, view)
Next
QueryPerformanceCounter(cnt2)
QueryPerformanceFrequency(freq)
res2 = Time(cnt1, cnt2, freq)
;--------------------------------------------------------

RuntimeError("Оригинал: " + Str(res1) + Chr(13) + "Аналог: " + Str(res2))
End

К сожалению RDTSC юзают 64-битные переменные, потому пришлось написать вспомогательную DLL для расчета, исходник на PureBasic в начале приведен, там же и нужный decls.

Ну или качайте аттач с dll и деклсами, у кого PureBasic нету или кому просто лень :)

impersonalis 03.04.2009 12:20

Ответ: Памагитяяяяяяяяяя...
 
Код:

Graphics3D(300, 400, 0, 2)
а так? окно появится в центре - мышка же упорно позиционируется за пределами окна. В фуллскирне вроде как будет работать, но при этом курсор "очень удобно" весит где-то в углу (причём в зависимости от разрешения) - проджектед по нему не взять, и ещё кучка бонусов, вызванная несимметричностью позиционирования.
Константы:
Код:

25
100
10
25
0.35
400
300
0.00277778
+85.0 (плюс! 85 целых ноль(!) десятых)
-85.0
200,208 (ладно - спишем, что это типа пример. хотя тогда непонятно, почему в других местах педантичность зашкаливает за пределы разумного)
+0.5 (опять)
-0.5

Про TEXT понтно нубам? Нет! Для кого вообще написан семпл. Код представляет собой стилистический оксюморон, который, как правило, выдаёт в авторе компилятора (в литератнуом плане) чужих работ, неспособного создать монолит кода.
Вам непонятно чем код уныл? Обзор в предыдущем посте, ещё подробнее - в настоящем.
Абстракция кода убита напрочь мощными выпадами конкретики: это и бесконечные константы (каждый раз когда я вижу все эти циферки, начинаю думать, что автору некорректно преподавли в школе - ибо концепция т.н. ленивых вычислений нервно курит; разобраться затем что и откуда и и можно ли это сократит с тем - будет чертовски сложно, это как при решении задачи сразу вместо именованных констант их значения подставить - ох веслуха. Это типа goto-стайл, единственное оправдание которому тут: http://forum.boolean.name/showthread.php?t=8035), это и ничем неоправданная избыточность:
Цитата:

If (yang > +85.0) Then
yang = +85.0
EndIf
If (yang < -85.0) Then
yang = -85.0
EndIf
у вас что - бот будет иметь несимметричны портал обзора (т.е. разный обзор левого
правого глаза, раз мы говорим про вращение вокруг ординаты)? это есть в ТЗ или описании? Может лучше всё же:
Цитата:

If (Abs(yang)>yaw_max)
yang=Sgn(yang)*yaw_max
EndIf
И тут же - хренак! Корень видите ли тормозит! Ну дак возьми сколько тебе нужно членов степенного ряда и не мучайся со сборкой и вставкой в проект ДЛЛ (ох полегчало)..
И т.д. и т.п. по-моему я и так потратил на доказательство вам того, что вы принципиально не будете воспринимать достаточно своего времени.
С уважением, Философствующее Говно :@ можете не обижаться, мой пост - реакция на ваши немеренные амбиции (т.е. я мог бы пройти мимо, но не после поста 13)

Android 03.04.2009 12:51

Ответ: Памагитяяяяяяяяяя...
 
Во молодежь пошла, не импера, не тормоза не уважают =\

Mark Castle 03.04.2009 13:10

Ответ: Памагитяяяяяяяяяя...
 
не бзди,прорвемся!:killall: :killall: :killall: :killall: :killall: :killall: :killall: :killall: :killall: :hunter: :hunter: :hunter: :hunter: :girl_witch: :bad: :winlogo: :maclogo: :russian:

Mark Castle 03.04.2009 13:14

Ответ: Памагитяяяяяяяяяя...
 
ладно сдаюсь...хелпы фстудию!...

Venom 03.04.2009 13:17

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

Сообщение от impersonalis (Сообщение 102670)
Код:

Graphics3D(300, 400, 0, 2)
а так? окно появится в центре - мышка же упорно позиционируется за пределами окна.

Издеваешься? Тямы вынести разрешение в константы и использовать в MoveMouse не хватает?
Код:

Const SCREEN_W = 300
Const SCREEN_H = 400
Const CENTER_X = SCREEN_W / 2
Const CENTER_Y = SCREEN_H / 2
...
Graphics3D(SCREEN_W, SCREEN_H, 0, 2)
...
MoveMouse(CENTER_X, CENTER_Y)

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

Цитата:

Сообщение от impersonalis (Сообщение 102670)
у вас что - бот будет иметь несимметричны портал обзора (т.е. разный обзор левого
правого глаза, раз мы говорим про вращение вокруг ординаты)?

Почему не симметричный, вверх обзор 85 градусов, вниз обзор 85.
В представлении -180...+180 это будет -85...+85 градусов.

ЗЫ
Вроде как под обсуждением находится алгоритм и его код,
а не код примера набросаный на скорую руку только чтобы показать что он работает.
Поэтому твои придирки считаю неадекватными как и тебя самого, более обьясняться не намерен,
кому надо тот поймет что к чему и использует код по назначению, а кому язык почесать - идите лесом.

impersonalis 03.04.2009 13:48

Ответ: Памагитяяяяяяяяяя...
 
кому надо тот поймёт и без твоего кода разберётся),а с твоим:
Цитата:

ладно сдаюсь...хелпы фстудию!...
Цитата:

Const SCREEN_W = 300
Const SCREEN_H = 400
Const CENTER_X = SCREEN_W / 2
Const CENTER_Y = SCREEN_H / 2
я и говорю - тут не пример на скору руку,а банальное незнание ряда базовых функций. Спорить, о том что константы зло, и про причудливого программиста, который зачем-то в примерах пишет криво, потому что это пример,а не серьёзный проект - бессмысленно - это статистика.

Цитата:

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

Вроде как под обсуждением находится алгоритм и его код,
а не код примера набросаный на скорую руку только чтобы показать что он работает.
именно! но у тебя с одной стороны черновик с другой педантичность - не понятно как его рассмаривать, то-ли копипастить как оталженный и провернный, толи с нуля переписывать. Что тебе Тормоз и сказал - у тебя классический случай "пришивание польто к пуговице","за дереьвями леса не видно".
Цитата:

а кому язык почесать - идите лесом.
ну так и почитай свои посты)
Цитата:

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

impersonalis 03.04.2009 14:13

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

Сообщение от Android (Сообщение 102671)
Во молодежь пошла, не импера, не тормоза не уважают =\


да не - я недолюбливаю систему авторитетов (кроме той, что собирается на базе статистики). Не хочу, чтоб форум стал повторением инцидента на ИзвестномФоруме.
Однако непуганные пользователи - ещё не знают, что такое придирки, но придираются сами.

tormoz 03.04.2009 16:19

Ответ: Памагитяяяяяяяяяя...
 
Собстно нормально оформленных тестов не увидел

создай бб-ешник с 2 функциями - проверка стандартны и твоим методом, сделай в цикле вызов проверки достаточное число раз (например 1000), сделай переключение между методами по клавише и вывод результата на экран.

вот это будет корректный тест

и если разница на 1000 вызовов будет менее 1 мс то я считаю что я прав, а ты изобрел очередной велосипед с квадратными колесами

HolyDel 03.04.2009 16:28

Ответ: Памагитяяяяяяяяяя...
 
меня больше смутило это - "$5F3759DF". понятно, что это как то связано с квадратным корнем, но непонятно как.

эх, ексешничков бы... а то не у всех пуребасик стоит.

Импер, я тоже думаю, что грамотно и по всем правилам оформалять исходник примера, где рассматриваются достаточно продвинутые вещи это лишнее. Любители итак разберутся а нубам нафиг не упала производительность в таких довольно специфических частях, ибо они будут косячить в другом (загружать модели в цикле, создавать камеру в цикле, использовать текстуры 2673 на 3415, и т.д).

Venom, поаккуратней на поворотах, ладно? у каждого может быть свое мнение и считать неадекватным человека только из-за того что его мнение не совпадает с твоим - это имхо невежество как минимум.

impersonalis 03.04.2009 16:36

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

Сообщение от tormoz (Сообщение 102698)
Собстно нормально оформленных тестов не увидел

создай бб-ешник с 2 функциями - проверка стандартны и твоим методом, сделай в цикле вызов проверки достаточное число раз (например 1000), сделай переключение между методами по клавише и вывод результата на экран.

вот это будет корректный тест

Надо добавить паузу от 3000 до 10000 мсек (в зависимости от производительности системы в целом, а также настройки - фулскрин\виндовед) перед началом теста в проге. Блитц тормозит в начале (отладчик + прочий стаф). Проверено многократно, после того,как на эту ошибку указал AsmLover (сорри, если ошибка в нике).
Вроде как тут это неговорено.


Цитата:

меня больше смутило это - "$5F3759DF". понятно, что это как то связано с квадратным корнем, но непонятно как.
http://en.wikipedia.org/wiki/Fast_inverse_square_root

Venom 03.04.2009 18:17

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

Сообщение от tormoz (Сообщение 102698)
Собстно нормально оформленных тестов не увидел

создай бб-ешник с 2 функциями - проверка стандартны и твоим методом, сделай в цикле вызов проверки достаточное число раз (например 1000), сделай переключение между методами по клавише и вывод результата на экран.

вот это будет корректный тест

и если разница на 1000 вызовов будет менее 1 мс то я считаю что я прав, а ты изобрел очередной велосипед с квадратными колесами

А я что привел? Может тебе к окулисту сходить, зрение проверить, а?

Вот еще один тест "риалтайм", специально для impersonalis ввел константы с понятными именами, а так-же прокомментировал (а то может по названиям непонятно *ROFL*):
Код:

; режим работы экрана
Const SCREEN_MODE% = 0

; разрешение экрана
Const SCREEN_WIDTH% = 800
Const SCREEN_HEIGHT% = 600

; центр экрана
Const SCREEN_X_CENTER% = SCREEN_WIDTH / 2
Const SCREEN_Y_CENTER% = SCREEN_HEIGHT / 2

; сдвиг наблюдаемого обьекта по оси Z от камеры
Const ENTITY_Z_OFFSET_FROM_CAMERA# = 5.0

; полный угол в градусах
Const FULL_CIRCLE_IN_DEGREES# = 360.0

; обратная величина полного угла в градусах
Const INVERSE_FULL_CIRCLE_IN_DEGREES# = 1.0 / FULL_CIRCLE_IN_DEGREES

; резкость управления мышью
Const MOUSE_X_SENSITIVITY# = 0.25
Const MOUSE_Y_SENSITIVITY# = 0.25

; ограничение угла обзора камеры по оси ординат
Const CAMERA_PITCH_THRESHOLD# = 85.0

; скорость движения камеры вперед\назад
Const CAMERA_FORWARD_VELOCITY# = 0.05
Const CAMERA_BACKWARD_VELOCITY# = -0.05

; половина угла и дистанция обзора камеры для стандартного метода
Const HALF_FIELD_OF_VIEW_FOR_STANDART_TEST# = 25.0
Const DISTANCE_OF_VIEW_FOR_STANDART_TEST# = 10.0

; половина угла и дистанция обзора камеры для собственного метода
Const HALF_FIELD_OF_VIEW_FOR_CUSTOM_TEST# = 0.906308 ;Cos(HALF_FIELD_OF_VIEW_FOR_STANDART_TEST)
Const DISTANCE_OF_VIEW_FOR_CUSTOM_TEST# = 100.0 ;DISTANCE_OF_VIEW_FOR_STANDART_TEST ^ 2

; кол-во итераций
Const ITERATION_QUANTITY% = 1000

Local xang#, yang#
Local from%, what%
Local frames%, timer%, fps%
Local method%, count%, result%

Graphics3D(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SCREEN_MODE)
SetBuffer(BackBuffer())

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

;Наблюдающий обьект
from = CreateCamera()
CameraZoom(from, 1.0 / Tan(HALF_FIELD_OF_VIEW_FOR_STANDART_TEST))
CameraRange(from, 1.0, DISTANCE_OF_VIEW_FOR_STANDART_TEST)

MoveMouse(SCREEN_X_CENTER, SCREEN_Y_CENTER)
Repeat

    ; -----------------------------------------------------
    ; Управление камерой
    ; -----------------------------------------------------
    xang = xang - MouseXSpeed() * MOUSE_X_SENSITIVITY
    yang = yang + MouseYSpeed() * MOUSE_Y_SENSITIVITY
    MoveMouse(SCREEN_X_CENTER, SCREEN_Y_CENTER)
   
    ; модуль для чисел с плавающей запятой
    xang = xang - Int(xang * INVERSE_FULL_CIRCLE_IN_DEGREES) * FULL_CIRCLE_IN_DEGREES
    ; ограничиваем отрицательное значение угла по оси абсцисс
    If (xang < 0.0) Then
        xang = FULL_CIRCLE_IN_DEGREES + xang
    EndIf
   
    ; impersonalis ты доволен? *ROFL*
    If (Abs(yang) > CAMERA_PITCH_THRESHOLD) Then
        yang = Sgn(yang) * CAMERA_PITCH_THRESHOLD
    EndIf

    RotateEntity(from, yang, xang, 0.0)
    If (KeyDown(200)) Then
        MoveEntity(from, 0.0, 0.0, CAMERA_FORWARD_VELOCITY)
    EndIf
    If (KeyDown(208)) Then
        MoveEntity(from, 0.0, 0.0, CAMERA_BACKWARD_VELOCITY)
    EndIf
    ; -----------------------------------------------------
   
    RenderWorld()
   
    If (KeyHit(57)) Then
        method = 1 Xor method
    EndIf

    If (method = 0)
        Text(10, 10, "Стандартный метод")
       
        For count = 1 To ITERATION_QUANTITY
            result = StandartTest(from, what, DISTANCE_OF_VIEW_FOR_STANDART_TEST, HALF_FIELD_OF_VIEW_FOR_STANDART_TEST)
        Next
    EndIf
   
    If (method = 1)
        Text(10, 10, "Собственный метод")
       
        For count = 1 To ITERATION_QUANTITY
            result = CustomTest(from, what, DISTANCE_OF_VIEW_FOR_CUSTOM_TEST, HALF_FIELD_OF_VIEW_FOR_CUSTOM_TEST)
        Next
    EndIf

    Text(10, 20, Str(fps))
   
    If (result) Then
        Text(10, 30, "Обьект в поле зрения")
    EndIf
   
    Flip(False)
   
    ; -----------------------------------------------------
    ; Счетчик кол-ва кадров в секунду
    ; -----------------------------------------------------
    frames = frames + 1
    If (MilliSecs() > timer) Then
        fps = frames
        frames = 0
        timer = MilliSecs() + 999
    EndIf
    ; -----------------------------------------------------
Until (KeyDown(1))
End

; -------------------------
; Стандартный метод
; -------------------------
Function StandartTest%(from%, what%, dist#, view#)
    If (EntityDistance(from, what) < dist) Then
        If ((Abs(DeltaYaw(from, what)) < view) And (Abs(DeltaPitch(from, what)) < view)) Then
            Return True
        EndIf
    EndIf
    Return False
End Function

; -------------------------
; Собственный метод
; -------------------------
Function CustomTest%(from%, what%, dist#, view#)
    Local xsub#, ysub#, zsub#, temp#
    xsub = EntityX(what) - EntityX(from)
    ysub = EntityY(what) - EntityY(from)
    zsub = EntityZ(what) - EntityZ(from)
    temp = xsub * xsub + ysub * ysub + zsub * zsub
    If (temp < dist) Then
        temp = 1.0 / Sqr(temp)
        xsub = xsub * temp
        ysub = ysub * temp
        zsub = zsub * temp
        temp = xsub * GetMatElement(from, 2, 0) + ysub * GetMatElement(from, 2, 1) + zsub * GetMatElement(from, 2, 2)
        If (temp > view) Then
            Return True
        EndIf
    EndIf
    Return False
End Function

ЗЫ
Хочу заметить что стандартным методом получается прямоугольное поле обзора (четырехугольная пирамида, из-за раздельной проверки по осям), а собственным методом конус, что имхо лучше для данной задачи.

HolyDel 03.04.2009 18:28

Ответ: Памагитяяяяяяяяяя...
 
стандартный 35-37
свой - 62

это на 100000 итераций.

tormoz 03.04.2009 19:52

Ответ: Памагитяяяяяяяяяя...
 
на 10 000 иттераций

стандарт 311
свой 408

не вижу смысла в использовании
что я и написал в первом посте этой темы.

секрет в том, что все эти "усовершенствования" с 2004-го года уже десятки раз проверены и перепроверены.
все узкие места блитца давно известны и открыть Америку не получится

Venom 03.04.2009 20:40

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

Сообщение от tormoz (Сообщение 102763)
не вижу смысла в использовании

А я не вижу смысла во всей этой глупой дискуссии.
Прекращай тупить, код быстрее и лучше подходит для данной задачи,
по-моему смысл его использовать очевиден.
Да и в конце-концов, тебя принуждают что-ли его использовать?

tormoz 04.04.2009 00:38

Ответ: Памагитяяяяяяяяяя...
 
как ты меня достал умник
чем он быстрей ?
на 0.000001 мс быстрее чем стандартный на сотню юнитов ?
ИДИОТИЗМ
и ослиное упрямство
(видит Бог я пытался быть корректным...)

Venom 04.04.2009 01:17

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

Сообщение от tormoz (Сообщение 102788)
чем он быстрей ?

Наверное скоростью выполнения, чем же еще :)

Цитата:

Сообщение от tormoz (Сообщение 102788)
на 0.000001 мс быстрее чем стандартный на сотню юнитов ?

Какая разница на сколько он быстрее, главное сам факт того что быстрее

Цитата:

Сообщение от tormoz (Сообщение 102788)
ИДИОТИЗМ

Идиотизм - с пеной у рта спорить из заведомо проигрышной позиции

Цитата:

Сообщение от tormoz (Сообщение 102788)
и ослиное упрямство

Вот-вот, уперся как баран в новые ворота. Что ты доказать-то пытаешься? И так уже перлов выкинул достаточно, уж если крыть нечем так промолчал бы.

tormoz 04.04.2009 03:52

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

Сообщение от Venom (Сообщение 102791)
Вот-вот, уперся как баран в новые ворота. Что ты доказать-то пытаешься? И так уже перлов выкинул достаточно, уж если крыть нечем так промолчал бы.

Ты уже доказал все что нужно.
За сим отбываешь в газенваген, идиот.

HolyDel 04.04.2009 04:29

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

jimon 04.04.2009 08:55

Ответ: Памагитяяяяяяяяяя...
 
HolyDel
+1
меня немного удивляют люди которые тратят недели на написание "самого быстрого кода", когда я на такой же код трачу пару часов и он работает визуально одинаково (не надо ждать годами)

HolyDel 04.04.2009 09:29

Ответ: Памагитяяяяяяяяяя...
 
jimon, но если есть два одинаковых готовых варианта, один из которых пусть немного, но быстрее, лучше юзать более быстрый. нет никакого смысла использовать более медленный.


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

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