|
3D-программирование Вопросы, касающиеся программирования 3D мира |
01.04.2009, 21:17
|
#1
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Памагитяяяяяяяяяя...
Народ...
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 НЕ ПРЕДЛАГАТЬ!уже все перечитал...
|
(Offline)
|
|
01.04.2009, 21:22
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
что вы вкладываете в термин "заметил"?
1) ваше попадние на ось аппликат бота
2) 1+необохдимое расстояние
3) видимость в конусе камеры
4) 2+3
...
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
01.04.2009, 22:01
|
#3
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
ССЫЛКИ НА HELP НЕ ПРЕДЛАГАТЬ!уже все перечитал...
|
Ок не предложу честное слово
Оптимально имхо в данном случае конус видимости бота + расстояние
Ссылки:
О да, я ърутален
Кстати сказать в своё время ответы на те же самые вопросы именно там и нашёл И у меня был с зелёненькой обложкой...
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
01.04.2009, 22:06
|
#4
|
Знающий
Регистрация: 04.10.2008
Адрес: Киев
Сообщений: 230
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от impersonalis
что вы вкладываете в термин "заметил"?
1) ваше попадние на ось аппликат бота
2) 1+необохдимое расстояние
3) видимость в конусе камеры
4) 2+3
...
|
всмысле если я попадаю в зону видимости бота...ну чтоб Вы сделали?
|
(Offline)
|
|
01.04.2009, 23:11
|
#5
|
|
Ответ: Памагитяяяяяяяяяя...
Последний раз редактировалось jimon, 01.04.2009 в 23:24.
|
|
|
01.04.2009, 23:44
|
#6
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
у тебя нет ниодного конкретного вопроса... ну вот ябы сделал конус, припарентил-бы его к голове бота, сделалбы колизийй с игроком, если коллизится то типа заметил, потом включил-бы анимацию бега, заморозил-бы оси y и z сделалбы pointentity на игрока, начал-бы двигать по нормализованному вектору на себя... ну что помогло ?
|
(Offline)
|
|
02.04.2009, 09:55
|
#7
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от NitE
ну вот ябы сделал конус, припарентил-бы его к голове бота, сделалбы колизийй с игроком, если коллизится то типа заметил
|
Зачем же извращатся так Как-то мне приходилось решать эту задачу. Математика выручила Надо найти скалярное произведение вектора между наблюдающим и наблюдаемым обьектов и вектора из матрицы трансформации наблюдаемого обьекта:
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
правка: опечатка
Последний раз редактировалось Venom, 02.04.2009 в 17:01.
|
(Offline)
|
|
02.04.2009, 16:23
|
#8
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
блин, извращенцы одни
yaw#=DeltaYaw(bot,player)
If abs(yaw)<ang
включаем боту режим атаки. (естественно обрабатываем анимацию и тд)
EndIf
Где ang# - половина угла обзора бота. у человека обзор обычно равен 60 градусам
аффтар, рано тебе еще такие игры писать. ты спотыкаешся на самом начале лестницы, а впереди километровые скалы.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.04.2009, 17:01
|
#9
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от tormoz
блин, извращенцы одни
yaw#=DeltaYaw(bot,player)
If abs(yaw)<ang
включаем боту режим атаки. (естественно обрабатываем анимацию и тд)
EndIf
|
Ага, а еще DeltaPitch и EntityDistance и получишь тоже самое, только медленее раз в *цать.
|
(Offline)
|
|
02.04.2009, 17:49
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
да не. не медленнее.
эти команды-же в рантаймах а не на скриптах. значит скорость будет такой-же. +\- 20%.
|
(Offline)
|
|
02.04.2009, 18:49
|
#11
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от HolyDel
да не. не медленнее.
эти команды-же в рантаймах а не на скриптах. значит скорость будет такой-же. +\- 20%.
|
Какие еще скрипты?
Я конечно преувеличил насчет "*цать раз", в 2.25 раза быстрее, я не поленился и проверил (хотя и так понятно было что быстрее) все варианты:
Код на BlitzBasic: 200 мс.
Код на PureBasic: 78 мс.
Код на Pelles C (макс. опт.): 19 мс.
Код на VS9 (макс. опт.): 21 мс.
EntityDistance+DeltaYaw+DeltaPitch: 450 мс.
Замерял на P-IV 3000, 1000000 вызовов, как с RDTSC, так и с Millisecs()
ЗЫ
Такой прирост в данной задаче, имхо, существенен
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.04.2009, 19:12
|
#12
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от Venom
Какие еще скрипты?
Я конечно преувеличил насчет "*цать раз", в 2.25 раза быстрее, я не поленился и проверил (хотя и так понятно было что быстрее) все варианты:
Код на BlitzBasic: 200 мс.
Код на PureBasic: 78 мс.
Код на Pelles C (макс. опт.): 19 мс.
Код на VS9 (макс. опт.): 21 мс.
EntityDistance+DeltaYaw+DeltaPitch: 450 мс.
Замерял на P-IV 3000, 1000000 вызовов, как с RDTSC, так и с Millisecs()
ЗЫ
Такой прирост в данной задаче, имхо, существенен
|
Ну точно извращенцы
Для особенно тугих математиков: разводить геммор с кучей вычислений есть смысл на действительно медленных функциях, а не на тех, которые выполняются 1 млн за 400 мс.
Нет АБСОЛЮТНО никакого смысла во всех ваших "ускорениях" на 300-400 строк с мозголомными формулами в реальном проекте.
__________________
|
(Offline)
|
|
02.04.2009, 19:25
|
#13
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Сообщение от tormoz
Ну точно извращенцы
Для особенно тугих математиков: разводить геммор с кучей вычислений есть смысл на действительно медленных функциях, а не на тех, которые выполняются 1 млн за 400 мс.
Нет АБСОЛЮТНО никакого смысла во всех ваших "ускорениях" на 300-400 строк с мозголомными формулами в реальном проекте.
|
Ну и где же ты там увидел мозголомные формулы, тугой "дэвелопер" ты наш? В школе учился? Математику, геометрию проходил? Формулы и код элементарны. Лично у меня по математике выше тройки никогда и не было, но мне это как видишь не помешало
Тем более что это часть ИИ как я понял, а его оптимизировать не помешает (иначе что еще то? )
Гонору то сколько, вроде далеко не маленький уже, должен соображать что к чему
|
(Offline)
|
|
02.04.2009, 20:03
|
#14
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
Товарищ, я по математике не блистал познаниями, да и прогером формально никогда не был, но уже начало вашего кода уныло чуть боее чем полностью.
Откуда эти константы (в плане - хрен ли так оформлено, а не - откуда взяты значения)? Где переменные? Почему код настолько конкретен (простая смена разрешения рушит всё к чертям)?
Вызов функции Text сжирает производительность многократно.
Уважайте чужой труд - ссылка на Carmack’s Unusual Inverse Square Root (game/code/q_math.c) не помешает
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
02.04.2009, 20:25
|
#15
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Памагитяяяяяяяяяя...
интересно. не покажешь функцию на блице?
похоже я переоценил скорость EntityDistance, DeltaYaw и DeltaPitch и они сделаны криво уже в рантаймах.
Вызов функции Text сжирает производительность многократно.
|
об этом можно много спорить, но 24x это очень круто. все таки эта функция не один раз за кадр будет вызываться.
в вартиче например обработка юнитов (а там было довольно много всяких EntityDistance и DeltaYaw-ов) занимала 5-6 мс за кадр. если бы удалось снизить до 1-2 значит в сцене (не в кадре) могло быть на 20-50% больше юнитов. плохо чтоли?
Последний раз редактировалось HolyDel, 02.04.2009 в 20:32.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:09.
|