Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пересечения 3D объектов


pasha676 ©   (2002-09-13 09:28:00) 

Вот туточки покрутил GLScene, понравилось. Очень понравилась фишка по коллизиям трехмерных объектов. Особенно простота с которой это организуется. Можно ли пересечение трехмерных объектов отслеживать в DXDelphi примерно такими же встроенными средствами?

Вариант просчитывать баундингбоксы и их пересечения вручную не предлагать. Мне проще всю прогу под GLScene переписать чем таким гемором заниматься.


pasha676   (2002-09-13 14:00:00) [1]

Пасибо. Чичас некогда, сдача проекта (мое пермементное состояние в последнее время :(), потом покручу.


Sapersky_   (2002-09-13 13:32:00) [2]

Вот, я даже пример нашёл:

function IsCollided(SceneFrame, PickFrame : IDirect3DRMFrame3): IDirect3DRMFrame3;
// sceneframe - фрейм сцены
// pickframe - фрейм объекта, который проверяется на столкновение с другими
// возвращаем фрейм, с кот. столкнулись или nil, если столкновения нет
Var ray : TD3DRMRay;
pickarr : IDirect3DRMPicked2Array;
pickdesc : TD3DRMPickDesc2;
dist : Single;
farr : IDirect3DRMFrameArray;
visual : IDirect3DRMVisual;
up,pos,dir : TD3DVector;
begin
Result:=nil;
PickFrame.GetPosition(SceneFrame,pos);
PickFrame.GetOrientation(SceneFrame,dir,up);
ray.dvDir:=dir;
ray.dvPos:=pos;
SceneFrame.RayPick(SceneFrame,ray,D3DRMRAYPICK_IGNOREFURTHERPRIMITIVES,pickarr);
pickarr.GetPick(0,visual,farr,pickdesc);
If visual<>nil then begin
dist:=Sqrt(Sqr(pos.x-pickdesc.dvPosition.x)+Sqr(pos.y-pickdesc.dvPosition.y)+
Sqr(pos.z-pickdesc.dvPosition.z));
If dist<1 then farr.GetElement(farr.GetSize-1,Result);
// если расстояние до грани объекта,
// в которую мы воткнулись <1,
// произошло столкновение
end;

visual:=nil;
farr:=nil; pickarr:=nil;
end;


Sapersky_   (2002-09-13 11:32:00) [3]

DXDelphi - это DelphiX? Тогда никак, я же писал уже - он контролирует только 2D-графику, а для 3D делает только инициализацию (тоже немало, впрочем :)).
Но не всё так страшно :) - в самом D3DRM есть функция RayPick, задаёшь луч и он находит все пересечения с объектами. Причём функции можно задать, чтобы работала либо с б.боксами, либо проверяла точно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо