|
3D-программирование Вопросы, касающиеся программирования 3D мира |
09.08.2009, 20:58
|
#1
|
Знающий
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений (для 6 пользователей)
|
EntityCollided, при движущихся навстречу друг другу объектах
В игре физ-двиг полностью основан на блитц-коллизиях. Меня они полностью устраивают - удобные, не тормозят, а по возможностям как-раз то что необходимо для моего сромненького проекта.
Единственное пока я не могу замутить на них, это определять столкновение, когда объекты движутся НАВСТРЕЧУ ДРУГ ДРУГУ!
Ну а надо делать движущиеся препятствия, двигающиеся колючки, враги в конце концов. Как-то можно обойтись кончено и entitydistance`ом. Но это очень ограничивает меня! А если припятствие вытянутое, или вообще форма какая-нибудь непростая + с отверстиями.
А блитц-коллизии глючат лично у меня в выше описанном случае. Наверно надо как-нибудь выдумывать искусственный метод обхода такой четровщины. Хотелось бы узнать если кто с этим встречался, то что получилось изобрести на этот счет. Или просто мнение каждого из вас что может быть полезнам в этом случае?..
Использовать сторонние ДЛЛ крайне не желательно. Ведь такая казалось ерунда осталось, а так весь физ-двиг уже готов.
|
(Offline)
|
|
09.08.2009, 22:10
|
#2
|
Проектировщик
Регистрация: 25.03.2007
Сообщений: 536
Написано 252 полезных сообщений (для 715 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
1) В 1-м кадре перемещай врагов, во втором угрока - в итоге получаем коллизию со статичными обьектами.
2) На сильновытянутых обьектах можно расставить виртуальные точки (если лень перещитывать координаты, или в уровне мало энтити, то можно использовать пивоты), и измерять дистанцию между ними и игроком.
3) Чтото пока больше ниче в голову не приходит
|
(Offline)
|
|
29.08.2009, 18:18
|
#3
|
Знающий
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Не получилось ничего(((
Вот семпл-код
Graphics3D 800, 600, 16, 2
lit=CreateLight()
cam=CreateCamera()
Collisions 1,2,2,3
player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1
enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType player, 2
MoveEntity enemy, 0,0, 300
PositionEntity cam, 0,700,00
PointEntity cam, player
Repeat
If KeyDown(200) Then MoveEntity player,0,0,1
If KeyDown(208) Then MoveEntity enemy,0,0,-1
UpdateWorld
RenderWorld
If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
Flip 60
Until KeyHit(1)
End
сфера-игрок, в коллизиях он является эллипсоидом.
куб-враг, он должен просчитываться в коллизиях по полигонам.
существует три основных ситуации:
1) враг стоит, игрок движется на него.
2) враг движется на игрока, игрок стоит.
3) враг и игрок движутся навстречу друг другу.
Ну и надо чтобы в любом из этих случаев безошибочно определялся момент когда игрок и враг сколлизились. В дангом семпле нужно чтобы высвечивались соотвествующие надписи.
В этом семпле, странно, вообще чего то не получилось...((( А в игре у меня коллизии определяются в 1 и 3 случаях, а вот во 2, если игрок стоит - то враг проходит сквозь игрока - и ничего ((
Ну вообщем, прошу поправить код таким образом, чтобы все три случая определялись. Пользоваться внешними длл - нельзя, только блитц коллижн.
Заранее спасибо!
|
(Offline)
|
|
29.08.2009, 21:08
|
#4
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Graphics3D 800, 600, 16, 2
lit=CreateLight()
cam=CreateCamera()
player=CreateSphere()
ScaleMesh player, 50,50,50
EntityRadius player, 50
EntityType player, 1
enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType enemy, 2
EntityRadius enemy, 50
MoveEntity enemy, 0,0, 300
PositionEntity cam, 0,700,00
PointEntity cam, player
Collisions 1,2,2,3
Collisions 2,1,2,3
Repeat
UpdateWorld
If KeyDown(200) Then MoveEntity player,0,0,1
If KeyDown(208) Then MoveEntity enemy,0,0,-1
RenderWorld
If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
Flip 60
Until KeyHit(1)
End
__________________
|
(Offline)
|
|
30.08.2009, 00:00
|
#5
|
Знающий
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
tormoz, спасибо, но мне нужно чтобы враг по полигонам просчитывался... это ту простой пример - а на деле будут враги не совсем правильной формы + в большей части это даже будет использоваться для различных колючек - ну а они уж будут совсем разнообразной формы и при этом ещё будут двигаться.
Так что условие
враг должен просчитываться в коллизиях по полигонам
очень важно
Ещё могут быть варианты, или при таком раскладе это уже выходит за границы блитца???
Мне кстати понравилась идея ЧерногоДракона про
1) В 1-м кадре перемещай врагов, во втором угрока - в итоге получаем коллизию со статичными обьектами.
Но у меня не получилось сделать такое, к примеру этот же самый код, как бы я реализовывал идею ЧерногоДракона:
Graphics3D 800, 600, 16, 2
lit=CreateLight()
cam=CreateCamera()
Collisions 1,2,2,3
player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1
enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType player, 2
MoveEntity enemy, 0,0, 300
PositionEntity cam, 0,700,00
PointEntity cam, player
Repeat
val=Not val
If KeyDown(200) And val=0 Then MoveEntity player,0,0,1
If val=1 Then MoveEntity enemy,0,0,-1
UpdateWorld
RenderWorld
If EntityCollided(player,2)>0 Then Text 20,20, "Игрок сколлизился с врагом!"
If EntityCollided(enemy,1)>0 Then Text 20,40, "Враг сколлизился с игрком!"
Flip 60
Until KeyHit(1)
End
вот так. ну почему то не работает. почему??? у меня по этому поводу вообще идей нет!!! что за странности...
|
(Offline)
|
|
30.08.2009, 00:07
|
#6
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Коллизии для движущегося объекта в блитце всегда должны проверяться по сфере.
Если уж очень надо используй MeshesIntersect и упрощенные меши для своих моделей. А то тормозить будет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.08.2009, 00:21
|
#7
|
Проектировщик
Регистрация: 25.03.2007
Сообщений: 536
Написано 252 полезных сообщений (для 715 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Collisions 1,2,2,3
Collisions 2,1,2,3 <- Во-вторых, враг во время своего хода может поглотить сферу игрока и коллизи не будет
player=CreateSphere() : ScaleMesh player, 50,50,50
EntityRadius player, 50 : EntityType player, 1
enemy=CreateCube() : ScaleMesh enemy, 50,50,50
EntityType enemy, 2 <- Во-первых внимательнее надо быть
EntityRadius enemy, 50<- Во-вторых, враг во время своего хода может поглотить сферу игрока и коллизи не будет
Ну а если враги очень сложной формы, то надо извратиться и написать свой коллижен детекше. Все зависит от конкретных условий.
UPD: Вообщем фигня какаято получается, подумай сам.
Последний раз редактировалось BlackDragon, 30.08.2009 в 00:32.
Причина: Прозрение
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.08.2009, 12:04
|
#8
|
Знающий
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Спасибо, BlackDragon, а я совсем не так понимал раньше коллизии... я думал что они как раз и проверяют пересечение 3-х мерных фигур, теперь все ясно - теперь понятно почему код не работает...Именно из-за взаимного проникновения мешей... Да и невнимательность, особенно с копи-пастом - часто подводит ))
MiXaeL, спасибо, за эту штуковину, я раньше и не знал о такой команде!!! MeshIntersect - вот мое спасение!!! В этом коде получилось все устроить как нужно, сейчас буду с игрой заниматься - посмотрим на сколько производительность упадет... надеюсь несильно. а насчет упрощенных мешей - это само собой понятно, ещё с моддерства на gta vice city это знаю и активно использую в игре - все что можно упрощаю ))
Кстати вопрос...В блитце коллизиях вместо "сфера" говорится "эллипсоид" - ну а я так понял что сферу вытянуть в нем нельзя, хотя очень бы хотелось...
|
(Offline)
|
|
30.08.2009, 15:09
|
#9
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Сферу коллизии можно вытягивать в блитце (с версии 1.69, если не ошибаюсь) но только по одной оси - Y. Почитай хелп к EntityRadius.
Последний раз редактировалось MiXaeL, 30.08.2009 в 15:14.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.08.2009, 16:54
|
#10
|
Знающий
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Точно! спасибо, михаил!
|
(Offline)
|
|
30.08.2009, 23:16
|
#11
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
хмм... а чегоэто тока по У?
EntityRadius entity,x_radius#,y_radius#
вытягивай хоть по х хоть по у
или я не прав О_О
|
(Offline)
|
|
31.08.2009, 13:53
|
#12
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Первый параметр растягивает в двух осях - х и z
Т.е. вытянуть в сторону не получится
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
31.08.2009, 15:06
|
#13
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
ну если вытянуть по конкретно оси Х или З то получился коечно похожее на Х...
|
(Offline)
|
|
31.08.2009, 16:38
|
#14
|
Нуждающийся
Регистрация: 29.08.2009
Адрес: Україна, Донецьк
Сообщений: 71
Написано 13 полезных сообщений (для 45 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Оу, люди... Если вы не против... То у меня проблема аналогичного плана. Как сделать так чтобы один объект мог толкать другой? Ну например, как лифт поднимает игрока вверх. Вариант с проверкой коллизии и последующим движением игрока со скоростью лифта в соответствующем направлении не катит, так как возможно использование параллельно других типов объектов, типа каких нибудь поинтов висящих в воздухе. Да и вообще имхо маразм прицепиться к лифту сбоку и взмыть на небеса =^)
|
(Offline)
|
|
31.08.2009, 17:23
|
#15
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Ответ: EntityCollided, при движущихся навстречу друг другу объектах
Используйте физикс и не парьтесь зря)
Но если физикс совсем не хочется юзать, и круче лифтов ничего не надо, то можно посмотреть сюда - http://forum.boolean.name/showthread.php?t=38
УПД. Ссылка там битая, у Импера в личку попросите, если надо.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:13.
|