Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 04.03.2010, 21:47   #1
battou
Нуждающийся
 
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений
(для 3 пользователей)
Коллизия без метода? Это возможно?

В общем мне надо как-то сделать что бы столкновение между объектами просчитывалось, что они объект соприкасается с другим, но при этом они могли спокойно проходить сквозь друг друга. Так можно сделать? Например вот движется куб, проходит сквозь другой куб и в этот момент считается коллизия, но куб не останавливается, а проходит насквозь.
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 21:59   #2
SKA_DIMKA
ПроЭктировщик
 
Аватар для SKA_DIMKA
 
Регистрация: 03.05.2009
Адрес: г.Волгоград
Сообщений: 136
Написано 32 полезных сообщений
(для 53 пользователей)
Ответ: Коллизия без метода? Это возможно?

Кажется тебе стоит посмотреть в сторону CountCollisions ( entity )... (Справка) Команда возвращает число столкновений за последний UpdateWorld()
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 22:01   #3
Reks888
Дэвелопер
 
Аватар для Reks888
 
Регистрация: 04.11.2009
Адрес: Украина, Днепропетровск
Сообщений: 1,480
Написано 662 полезных сообщений
(для 1,985 пользователей)
Ответ: Коллизия без метода? Это возможно?

ы? А кто мешает тебе проверять дистанцию между твоими кубами? Если все-таки нужно столкновения , то делай так:
If EntityCollided(cube1,cube2) Then ClearCollisions()
при столкновении кубов эта команда очистит список столкновений, поэтому столкновения не будут обрабатываться до следующего использования команды Collisions.
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 22:11   #4
battou
Нуждающийся
 
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений
(для 3 пользователей)
Re: Коллизия без метода? Это возможно?

Не, мне надо что бы коллизия считалась, так как она будет условием внутри цакла, триггером считайте, но кубы должны проходить сквозь друг друга. А Countcollisions только выдаст количество столкновений, оно без Collisions не работает всё равно и не поможет мне.
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 22:24   #5
Reks888
Дэвелопер
 
Аватар для Reks888
 
Регистрация: 04.11.2009
Адрес: Украина, Днепропетровск
Сообщений: 1,480
Написано 662 полезных сообщений
(для 1,985 пользователей)
Ответ: Коллизия без метода? Это возможно?

А EntityDistance не может быть условием внутри цикла?
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 22:46   #6
SKA_DIMKA
ПроЭктировщик
 
Аватар для SKA_DIMKA
 
Регистрация: 03.05.2009
Адрес: г.Волгоград
Сообщений: 136
Написано 32 полезных сообщений
(для 53 пользователей)
Ответ: Коллизия без метода? Это возможно?

Сообщение от Reks888 Посмотреть сообщение
А EntityDistance не может быть условием внутри цикла?
Еще тогда нужно учитывать и Scale модели.
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:03   #7
battou
Нуждающийся
 
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений
(для 3 пользователей)
Re: Коллизия без метода? Это возможно?

Эх, дистанция подошла бы если бы определялась дистанция до ближайшего полигона или хотя бы стороны бокса модели, а определяется до центра, а мне надо что бы при контакте с гланицами срабатывало условие.(
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:09   #8
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Коллизия без метода? Это возможно?

последний параметр отвечает за реакцию на столкновение, 0 вроде отключает реакцию.
Collisions type1, type2, method, 0
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:14   #9
battou
Нуждающийся
 
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений
(для 3 пользователей)
Re: Коллизия без метода? Это возможно?

Неа, не работает. Я тут посмотрел, а если через Entityintersect? Она очень тормозит программу?
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:45   #10
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Коллизия без метода? Это возможно?

Подключи физикс и радуйся жизни. Средствами блитца коллизии медлительны, хотя если не хочется привлекать сторонние модули - ими тоже можно обойтись...
Хитросфинктерное решение:
перед применением коллизий (вроде updateworld, да?) запоминать координаты объектов, затем применять коллизии, считать пересечения объектов и возвращать ентити в свои позиции перед рендером. Но как я понял, тебе такое не подойдет.
МешИнтерсект кажется затратный был ощутимо...
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:53   #11
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Коллизия без метода? Это возможно?

мешИнтерсект как бэ решение !!
(Offline)
 
Ответить с цитированием
Старый 04.03.2010, 23:57   #12
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений
(для 95 пользователей)
Ответ: Коллизия без метода? Это возможно?

Я как то попробовал мешинтерсект -
когда возле игрока слишком много полигонов было(относительно много) то игра начала тормозить
__________________
StimuL
Maks
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 00:21   #13
battou
Нуждающийся
 
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений
(для 3 пользователей)
Re: Коллизия без метода? Это возможно?

Ну у меня интерсект проверяется только с объектами триггерами, а они максимум 20 поликов, в основном вообще боксы всякие в максе расставленные. Просто при коллизии если без пересечения то надо что бы объект постоянно упарался в этот триггер, а не просто стоял в нём.
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 13:29   #14
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Коллизия без метода? Это возможно?

Юзай мою систему триггеров :
;============================  
 ;Title: TriggerSystem 0.1  
 ;Autor: H@non  
 ;contact: [email protected]   
 ;============================  

 Const TRIG_BOX1 = 1, TRIG_BOX2 = 2, TRIG_SPHERE = 3  

 Type TriggerInfo  
   Field x#, y#, z#  
   Field pitch#, yaw#, roll#  
   Field Tip  
   Field HandleTrig  
 End Type  

 Type TriggerBox  
   Field w#, h#, d#  
   Field mesh  
 End Type  

 Type TriggerSphere  
   Field radius#  
   Field mesh  
 End Type  

 Global TrigEnt  

 Function InitTrigger()  
   TrigEnt = CreatePivot()  
 End Function  

 Function AddTrigSphere.TriggerInfo(debug=False, x#, y#, z#, radius#=1)  
   Local t.TriggerInfo = New TriggerInfo  
   t\x=x : t\y=y : t\z=z  
   t\Tip = TRIG_SPHERE  
   Local ts.TriggerSphere = New TriggerSphere  
   If debug = True Then  
    ts\mesh = CreateSphere(16)  
    ScaleMesh ts\mesh, radius, radius, radius  
    PositionEntity ts\mesh, t\x, t\y, t\z  
    EntityAlpha ts\mesh, 0.5  
   EndIf  
   ts\radius = radius*radius  
   t\HandleTrig = Handle (ts)  
     
   Return t  
 End Function  

 Function AddTrigBox.TriggerInfo(debug=False, x#, y#, z#, w#=1, h#=1, d#=1, Tip=TRIG_BOX1, pitch#=0, yaw#=0, roll#=0)  
   Local t.TriggerInfo = New TriggerInfo  
   t\x=x : t\y=y : t\z=z  
   t\Tip = Tip  
   If Tip = TRIG_BOX2 Then  
    t\pitch=pitch : t\yaw=yaw : t\roll=roll  
   EndIf  
   Local tb.TriggerBox = New TriggerBox  
   tb\w=w : tb\h=h : tb\d=d  
   t\HandleTrig = Handle (tb)  
   If debug=True Then  
    tb\mesh = CreateCube()  
    FitMesh tb\mesh, 0, 0, 0, tb\w, tb\h, tb\d  
    PositionEntity tb\mesh, t\x, t\y, t\z  
    RotateEntity tb\mesh, t\pitch, t\yaw, t\roll  
    EntityAlpha tb\mesh, 0.5  
   EndIf  
     
     
   Return t  
 End Function  

 Function CheckEntityInTrig( ent, t.TriggerInfo )  
   Local dx#, dy#, dz#  
   Local dist#  
   Local tb.TriggerBox, ts.TriggerSphere  
     
   Select t\Tip  
    Case TRIG_SPHERE :  
     dx = EntityX(ent,1) - t\x  
     dy = EntityY(ent,1) - t\y  
     dz = EntityZ(ent,1) - t\z  
     dist = (dx*dx + dy*dy + dz*dz)  
     ts.TriggerSphere = Object.TriggerSphere( t\HandleTrig )  
     If dist <= ts\radius Then Return True  
     Return False  
    Case TRIG_BOX1 :  
     If EntityX(ent,1) >= t\x Then  
      If EntityY(ent,1) >= t\y Then  
       If EntityZ(ent,1) >= t\z Then  
        tb.TriggerBox = Object.TriggerBox( t\HandleTrig )  
        If EntityX(ent,1) <= t\x+tb\w Then  
         If EntityY(ent,1) <= t\y+tb\h Then  
          If EntityZ(ent,1) <= t\z+tb\d Then  
           Return True  
          EndIf  
         EndIf  
        EndIf  
       EndIf  
      EndIf  
     EndIf  
     Return False  
    Case TRIG_BOX2 :  
     tb.TriggerBox = Object.TriggerBox( t\HandleTrig )  
     PositionEntity (TrigEnt, t\x, t\y, t\z)  
     RotateEntity (TrigEnt, t\pitch, t\yaw, t\roll)  
       
     TFormPoint (EntityX(ent,1), EntityY(ent,1), EntityZ(ent,1), 0, TrigEnt)  
     If TFormedX() >= 0 Then  
      If TFormedY() >= 0 Then  
       If TFormedZ() >= 0 Then  
        If TFormedX() <= tb\w Then  
         If TFormedY() <= tb\h Then  
          If TFormedZ() <= tb\d Then  
           Return True  
          EndIf  
         EndIf  
        EndIf  
       EndIf  
      EndIf  
     EndIf  
     Return False  
   End Select  
 End Function
пример использования:
Graphics3D 800, 600, 32, 2  
 SetBuffer BackBuffer()  
 SeedRnd MilliSecs()  

 Local lit = CreateLight(1)  
 RotateEntity lit, 45, 45, 0  

 Local camera = CreateCamera()  
 PositionEntity camera, 0, 10, -10  
 RotateEntity camera, 45, 0, 0  

 Local plane = CreatePlane()  
 PositionEntity plane, 0, -1, 0  
 EntityColor plane, 0, 255, 0  
 Local texplane = CreateTexture( 128, 128 )  
 SetBuffer TextureBuffer(texplane)  
 For Y = 0 To 128  
   For X = 0 To 128  
    WritePixel X, Y, (Rand(96,160) * $010101) Or $FF000000  
   Next  
 Next  
 SetBuffer BackBuffer()  
 EntityTexture plane, texplane  
 ScaleTexture texplane, 10, 10  
 FreeTexture texplane  

 Include "TrigMain.bb"  

 Global trigSphere.triggerinfo  
 Global trigBox1.triggerinfo  
 Global trigBox2.triggerinfo  
 InitTrigger()  
 trigSphere = AddTrigSphere(True, 6, 0, 0, 2)  
 trigBox1 = AddTrigBox(True, -2, -1, -1, 4, 2, 2)  
 trigBox2 = AddTrigBox(True, -7, -1, -1, 2, 2, 2, TRIG_BOX2, 0,  45, 0)  

 Local cube = CreateCube()  
 ScaleEntity cube, 0.1, 0.1, 0.1  
 MoveEntity cube, 0, 0.5, 0  

 Local InTrigSphere, InTrigCube1, InTrigCube2  
 While Not KeyHit(1)  
     
   MoveEntity cube, (KeyDown(205)-KeyDown(203))*0.1, 0, (KeyDown(200)-KeyDown(208))*0.1  
     
    InTrigSphere = CheckEntityInTrig( cube, trigSphere )  
    InTrigCube1 = CheckEntityInTrig( cube, trigBox1 )  
    InTrigCube2 = CheckEntityInTrig( cube, trigBox2 )  
     
   RenderWorld  
     
   If InTrigSphere=True Then Text( 20, 20, "In Sphere!!!!" )  
   If InTrigCube1=True Then Text( 20, 40, "In cube1 !!!!" )  
   If InTrigCube2=True Then Text( 20, 60, "In cube2 !!!!" )  
   Flip  
 Wend  

 End
вот листинг функций:
InitTrigger() - это инициализация системы, ее нужно ставить сразу после того как вы заинклудили исходник, то есть после строки: Include "TrigMain.bb" AddTrigSphere(debug=False, x#, y#, z#, radius#=1)
Функция создает триггер, который реагиурет на расстояние, то есть если предмет ближе чем радиус триггера, тогда он сработает. Параметры функции:
debug - нужно для визуальной отладки, если равна True, тогда на месте триггера создается сфера.
x, y, z - координаты триггера
radius - это радиус реагирования триггера
AddTrigBox(debug=False, x#, y#, z#, w#=1, h#=1, d#=1, Tip=TRIG_BOX1, pitch#=0, yaw#=0, roll#=0)
Функция создается триггер ввиде коробки( параллепипеда ). Бывает двух типов, но о них ниже. Параметры:
debug - также как и в предыдущей функции нужна для отладки. Создается бокс на месте триггера нужного размера.
x, y, z - указываем координаты триггера
w, h, d - размеры, ширина, высота и глубина соответственно.
Tip : - задаем тип бокса
TRIG_BOX1 - это самая простая и самая быстрая проверка, проверка на координаты.
TRIG_BOX2 - это прповерка учитывает ориентацию бокса, то есть он может быть повернут.
Если Tip равен TRIG_BOX2, тогда учитываются следующие параметры:
pitch, yaw, roll - углы поворота бокса
CheckEntityInTrig( ent, t.TriggerInfo )
Основная функция. Она проверяет нахождение объекта в заданном триггере, если это так, тогда возвращает True иначе False.
ent - объект, который нужно проверить на пересечение с триггером
t.TriggerInfo - триггер, с которым осуществляется проверка.
Вся система крайне быстрая( проверка на расстояние сделана по быстрому методу с уходом от квадратного корня ) и удобная в обращении. Чтобы создать триггер нужно сделать следующее:
Include "TrigMain.bb" ; подключаем систему
InitTrigger() ; инициализируем триггер
Global trig.triggerinfo ; создаем переменную под триггер
x=6 : y=0 : z=0
radius = 2
trig = AddTrigSphere(True, x,y,z, radius)
if CheckEntityInTrig( Entity, trig )=true then
;.... что делать если ентити внутри тригера
endif
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
IGR (05.03.2010), Nex (08.03.2010), Reks888 (05.03.2010), tormoz (05.03.2010)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com