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=263)

Fant 29.10.2005 13:17

Очень стыдно, но есть вопрос (я уверен, что ответ прост, но НИКАК не могу допереть до исины) :wallbash:

Код:


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

Const typecube1=1
Const typecube2=2


camera=CreateCamera()
PositionEntity camera,0,0,-20

cube1=CreateCube()
PositionEntity cube1,10,0,0
EntityType cube1,typecube1
EntityColor cube1,0,200,60

cube2=CreateCube()
PositionEntity cube2,0,0,0
EntityType cube2,typecube2
EntityColor cube2,250,00,0


Collisions typecube1,typecube2,2,3


Repeat
MoveEntity cube1,-.1,0,0

If KeyHit (57) Then End

UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End

Ну как сделать так, что бы по нажатию пробела они НЕ коллиделись????

то есть если нет события - коллизия.
если событие произошло, то коллизии быть не может случиться!!!

и...как код втыкать в текст :@

:SOS:

jimon 29.10.2005 13:31

хе

предлагаю по нажатию пробела присваивать обектам тип 0 (entitytype mazaf**a,0)

а код ты практически правильно втыкнул , просто надо не [\code] а [/code]!

Fant 29.10.2005 13:58

спасибо. работает. Тему не закрываем. Возможно писать сюда продолжу еще я про коллизии!

ZanoZa 29.10.2005 14:19

Как колизить animmesh

axel186 29.10.2005 14:25

Цитата:

Как колизить animmesh
меня тоже интересует этот вопрос :)

Жека 29.10.2005 14:59

Создаешь Пивот для своего анимированного объекта - сферу!
piv = CreateSphere()

a модель перентишь к пивоту
EntityParent animMesh,piv

еще не помешает сделать при помощи масштабирования из сферы эллипсоид
ScaleMesh piv,1,3,1 - например так

Потом устанавливаешь радиус коллизии и тип
EntityRadius piv,1,3
EntityType piv,col_type

Все, остальное знаете.

KRIK 29.10.2005 16:20

А ПО МОЕМУ МОЖНО И БЕЗ СФЕРЫ ОБОЙТИСЬ, ВЕДЬ У МЕНЯ ГЕРОЙ И ТАК БЕГАЕТ.

Fant 29.10.2005 16:37

Так...приплыли сюда

Кнопка пробел - убирает все коллизии
Enter - двигает куб в противоположную сторону
1 на клаве - ставит коллизии.

Итак пример. Игрок берет приз и проходит сквозь "пробиваемые" стены. ЧЕРЕЗ непробиваемые пройти не может. То есть как сделать так, что бы при нажатии пробел ИГРОК проходил сквозь КРАСНЫЙ кубик, а сквозь ФИОЛЕТОВЫЙ пройти не смог.

ПС. шутка: успеть нажать 1 на клаве не принимается. Я серьезно!

вот код:
Код:


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

Const typecube1=1
Const typecube2=2
Const typecube3=3

camera=CreateCamera()
PositionEntity camera,0,0,-20

cube1=CreateCube()
PositionEntity cube1,10,0,0
EntityType cube1,typecube1
EntityColor cube1,0,200,60

cube2=CreateCube()
PositionEntity cube2,0,0,0
EntityType cube2,typecube2
EntityColor cube2,250,00,0

cube3=CreateCube()
PositionEntity cube3,-15,0,0
EntityType cube3,typecube3
EntityColor cube3,250,100,600


Collisions typecube1,typecube2,2,3
Collisions typecube1,typecube3,2,3


Repeat
MoveEntity cube1,-.1,0,0
If KeyDown (28) Then MoveEntity cube1,.2,0,0

If KeyHit (57) Then ClearCollisions

If KeyHit (2)
Collisions typecube1,typecube2,2,3
Collisions typecube1,typecube3,2,3
End If

UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


jimon 29.10.2005 16:49

а я в будущем планирую добавить потдержку anim обектов в jode :)

jimon 29.10.2005 17:00

** *** ****** ***, ***** ***** *** ***** *** !

Код:

If KeyHit (57) Then
ClearCollisions
Collisions typecube1,typecube3,2,3
End If

говорилже - ВОСОЗДАВАТЬ КОЛОЗИИ НАДО!

ZanoZa 29.10.2005 19:21

Цитата:

Originally posted by Жека@Oct 29 2005, 12:59 PM
Создаешь Пивот для своего анимированного объекта - сферу!
piv = CreateSphere()

a модель перентишь к пивоту
EntityParent animMesh,piv

еще не помешает сделать при помощи масштабирования из сферы эллипсоид
ScaleMesh piv,1,3,1 - например так

Потом устанавливаешь радиус коллизии и тип
EntityRadius piv,1,3
EntityType piv,col_type

Все, остальное знаете.

Как всё запущенно:blink: неужели не могли сделать как с обычным meshem? :??
p.s.кто знает подскажите, я сделал анимацию в максе для модели через biped,
а в blitze видно biped и не идёт анимации.Тоже самое с костями. :dontknow:

pax 29.10.2005 20:40

Для этого надо экспортровать правильно и в правильный формат... если ты натягивал кости модификатором Skin, то можеш экспортировать Pipeline'ом в b3d формат, если меш сборный, то в 3ds формат экспортируется анимация только с TCB контроллером.

Akima 31.10.2005 08:25

а можно сделать облости коллизий (EntityRadius, EntityBox), видимыми.

НУБ 31.10.2005 09:15

Цитата:

Originally posted by Akima@Oct 31 2005, 07:25 AM
а можно сделать облости коллизий (EntityRadius, EntityBox), видимыми.
Да, CreateSphere(), CreateCube() :)

Akima 31.10.2005 09:18

я так делал но у меня вакое впечатление что коллизии гдето в другом месте (смещенно) появляются

Diplomat 01.11.2005 12:02

Цитата:

Создаешь Пивот для своего анимированного объекта - сферу!
piv = CreateSphere()

Зачем это? Лишние "пивоты-сферы" в Блице, который начинает скрипеть на второй тысяче обьектов? :dontknow:

Развернутый ответ класса "не совсем в тему":
Суть в том, что анимМеш- это группа, иначе- "дерево" обьектов. Хендл АнимМеша, который ты получаешь при загрузке- это, собственно говоря, и есть "главный" Пивот, к которому припарентены все остальные составляющие. Вот ему-то, Пивоту, (а не видимой-полигональной части меша!) и назначаются все коллизии. Т.к. полигонов в нем нет по определению, то коллизии "сфера-полигон" работать не будут. Чтоб создать такую коллизию, следует найти нужную часть меша GetChild()-ом или FindChild()-ом и присвоить коллизийные параметры ей. Всё.
По той же теме проходят вопросы "Почему АнимМешу не задается EntityAlpha, EntityShininess etc.?" и "Почему при попытке применить Animate на модель с костяной анимацией анимируются только кости, а модель стоит на месте?"
Ответ: "Всё потому же: находим нужную часть модели и применяем команду на нее"

P.S. Подобную тему надо создать в ЧаВо. Иначе вопросы эти будут повторяться бесконечно. Я сам ими когда-то задавался, пока не подсмотрел ответ на этот вопрос от другого новичка. :)

Жека 01.11.2005 13:56

Со сферой я перегнул... Тогда просто пивот создать...

Насчет назначения колизий чайлдам: колизия будет проверяться с чайлдом, а двигать мы будем главный пивот. При столкновении получится, что пивот продолжает двигаться, а чайлд как и должен уперся в стенку!
И они сместятся относительно друг друга.
Или нет?
У меня что-то подобное было просто...

Diplomat 01.11.2005 16:41

Хм... нет... почему? :dontknow:
Всё нормально будет. Тут логику понять надо.
Ну представь, есть у тебя анимированная модель. Танк, к примеру. Его Пивоту ("главному", не нужно создавать еще один) ты присвоил коллизийный тип "ТАНК", чтоб он коллизился к земле ("ЗЕМЛЯ") типом сфера-к-полигону: Collisions TANK,GROUND,2,3
Естественно, этот пивот отлично сработает коллизийной сферой.
Танковой броне ты присвоил тип "АРМОР". Но ей никакие коллизийные параметры задавать не надо. В самом деле, к чему ей коллизиться?
А вот танковому снаряду или там автоматной пуле ты присвоил тип "ПУЛЯ" и задал коллизию сфера-к-полигону с броней: Collisions BULLET,ARMOR,2,1.
И всё рулит: пивот коллизится к земле, а земля- НЕ коллизится к Пивоту. Пули коллизятся к броне, а броня к ним- нет.
А коллизий с обратной связью конечно нужно избегать. :)

ZanoZa 01.11.2005 16:44

Так чё испльзовать пивот?

Lexa 02.11.2005 17:23

не подскажите какая разница жеду записями
Код:

If EntityCollided(tank,2)=q\zvezda
и
Код:

If EntityCollided(TANK_T,PRIZ_T)
если

Код:

Type zvezda
        Field zvezda
End Type

Collisions TANK_T,PRIZ_T,2,1


alcosholik 02.11.2005 20:34

Разница большая.
EntityCollided возвращает 0, если объекты не столкнусь, и 1 в противном случае. Т.е. это условие:
Код:

If EntityCollided(TANK_T,PRIZ_T)
будет выполняться в том случае, когда объекты столкнутся.

В то время как это условие:
Код:

If EntityCollided(tank,2)=q\zvezda
будет выполняться, если объекты НЕ столкнуться, так как q\zvezda по умолчанию равно 0.

Diplomat 02.11.2005 22:11

Скажу даже больше, условие "If EntityCollided(TANK_T,PRIZ_T)" не будет выполняться вообще никак и вылетать с сообщением "Entity does not exists"... Потому как первым параметром ф-и должен быть хендл модели, а не константа коллизийного типа...

2Шолик: в случае столкновения ф-я возвращает не 1, а хендл коллизящейся ёнтити. Проверено эмпирически и по Хелпу. :)

alcosholik 02.11.2005 22:49

Цитата:

Originally posted by Diplomat@Nov 2 2005, 08:11 PM
2Шолик: в случае столкновения ф-я возвращает не 1, а хендл коллизящейся ёнтити. Проверено эмпирически и по Хелпу. :)
Сегодня просто не мой день. :dontknow:

Lexa 03.11.2005 02:07

Цитата:

Diplomat
Скажу даже больше, условие "If EntityCollided(TANK_T,PRIZ_T)" не будет выполняться вообще никак и вылетать с сообщением "Entity does not exists"... Потому как первым параметром ф-и должен быть хендл модели, а не константа коллизийного типа...

Дипломат. Согласен, писал прям в браузере на память поэтому ошыбка, насамом деле в коде
Код:

If EntityCollided(q\zvezda,TANK_T)
хех :( хотя всё равно не работает. :rolleyes: буду разбиратся. :wallbash:


ps: alcoSHoLiK спасиб доходчего.
pps: Diplomat :)) ну ты каАк, чёнить, ляпниш, этокае, млин, я потом пережовываю неделю :?? но всеравно молодца, спасиб, мож запомню, как это все хоть называется млин. :)

Guest 03.11.2005 10:34

Цитата:

Всё нормально будет. Тут логику понять надо.
Ну представь, есть у тебя

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


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

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