Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Collision Detection сфера - полигон, ну или полигон-полигон   Найти похожие ветки 

 
MasacreAnt   (2005-08-20 09:23) [0]

Мля вот решил разобраться в GLScene... Вродь потихоньку пошло, но запоролся на проверке столкновений...
Я гружу две модели в сцену, одна модель это поверхность(неровная) по которой должен тусоваться герой, а другая это собсно сам герой (без анимации)... Но как мне сделать проверку столкновения героя с поверхностью то???  Я открывал пример с какими-то Octo-Tree (пример называется boxedin), там шарик блестящий летает по комнате и рикошетит от всех предметов... Вот хочу такую же систему, но не могу догнать как именно работает этот пример...

вот исходняк моей работы, там есть процедура procedure TMesh.MyActions, дык вот в ней я и пробую проверять колижн, но тока он не пашет у меня(герйо пролетает сквозь поверхность), помогите плиз... :
unit res;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, GLMisc, GLScene, GLWin32Viewer, GLCadencer, GLTexture,
 GLVectorFileObjects, jpeg, GLCollision, DXInput, {DXInput,}
 Geometry, GLObjects,
 ExtCtrls, StdCtrls, GLNavigator, ComCtrls;

type
 Tresourse = class(TForm)
   GLSceneViewer: TGLSceneViewer;
   GLScene: TGLScene;
   GLMaterialLibrary: TGLMaterialLibrary;
   cadencer: TGLCadencer;
   camera: TGLCamera;
   AnimationControler: TAnimationControler;
   mainLight: TGLLightSource;
   CollManage: TCollisionManager;
   procedure FormCreate(Sender: TObject);
   procedure GLSceneViewerMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure GLSceneViewerMouseMove(Sender: TObject; Shift: TShiftState;
     X, Y: Integer);
   procedure cadencerProgress(Sender: TObject; const deltaTime,
     newTime: Double);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TMesh=class
 private
  fmodel:TFreeForm;
 public
  collided:boolean;
  property model:TFreeForm read fmodel write fmodel;
  procedure LoadMesh(path:String);
  procedure LoadTexture(path:String);
  procedure MyActions();
  constructor Create(cadencer:TGLCadencer);
 end;

var
 resourse: Tresourse;
 meshes: array [1..10] of TMesh;
 mx,my:integer;

implementation
{$R *.dfm}

procedure TMesh.LoadMesh(path:String);
 BEGIN
  fmodel.LoadFromFile(path);
 END;
procedure TMesh.LoadTexture(path:String);
 BEGIN
  fmodel.Material.Texture.Image.LoadFromFile(path);
  fmodel.Material.Texture.TextureMode:=tmModulate;
  fmodel.Material.Texture.Enabled:=True;
 END;
constructor TMesh.Create(cadencer:TGLCadencer);
 BEGIN
  fmodel:=TFreeForm(cadencer.Scene.Objects.AddNewChild(TFreeForm));
  fmodel.Scale.Scale(0.2);
  collided:=false;
 END;
procedure TMesh.MyActions();
var
  rayStart, rayVector : TVector;
  pPoint : TVector;
  pNormal : TVector;
 BEGIN
 //!!!!!!!! Collision Detection !!!!!!!!!!//
  SetVector(rayStart, model.AbsolutePosition);
  SetVector(rayVector, model.Position.x,model.Position.y-10,model.Position.z);
  NormalizeVector(rayVector);
   if model.OctreeSphereIntersect(raystart, rayvector, 0.1, 10,
                              @pPoint, @pNormal)=true then collided:=true else collided:=false;

  if collided=false then model.Move(-0.1);
  //if (isDown in resourse.input.States) then model.position.x:=model.position.x+0.05;
  //if (isUp in resourse.input.States) then model.position.x:=model.position.x-0.05;
  //if (isLeft in resourse.input.States) then model.position.z:=model.position.z+0.05;
  //if (isRight in resourse.input.States) then model.position.z:=model.position.z-0.05;
 END;

procedure Tresourse.FormCreate(Sender: TObject);
begin
meshes[1]:=TMesh.Create(cadencer);
meshes[1].LoadMesh("resources\ground.3DS");
meshes[1].LoadTexture("resources\groundTEX.JPG");
meshes[1].model.RotateAbsolute(-90,0,0);

meshes[2]:=TMesh.Create(cadencer);
meshes[2].LoadMesh("resources\kuchaka.3DS");
meshes[2].LoadTexture("resources\kuch.bmp");
meshes[2].model.RotateAbsolute(-90,0,0);
meshes[2].model.scale.scale(0.2);
meshes[2].model.position.x:=-0.5;
meshes[2].model.position.y:=25;
meshes[2].model.position.z:=1.2;

meshes[2].model.BuildOctree;

camera.TargetObject:=meshes[1].model;
camera.Position.X:=15;
camera.Position.Y:=15;
camera.Position.Z:=15;

end;

procedure Tresourse.GLSceneViewerMouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
mx:=x;
my:=y;
end;

procedure Tresourse.GLSceneViewerMouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
begin
if Shift<>[] then
begin
camera.MoveAroundTarget(my-y, mx-x);
mx:=x;
my:=y;
end;
end;

procedure Tresourse.cadencerProgress(Sender: TObject; const deltaTime,
 newTime: Double);
begin
//input.Update;
meshes[2].MyActions();
end;

end.


 
Fosgen   (2005-08-20 11:47) [1]

Очень интересно... Вообще, если мне память не изменяет, в столкновении участвуют ДВА объекта, а где здесь второй?
"//!!!!!!!! Collision Detection !!!!!!!!!!//
 SetVector(rayStart, model.AbsolutePosition);
 SetVector(rayVector, model.Position.x,model.Position.y-10,model.Position.z);
 NormalizeVector(rayVector);
  if model.OctreeSphereIntersect(raystart, rayvector, 0.1, 10,@pPoint, @pNormal)=true then collided:=true else collided:=false;"


Я вижу, обращения только к одному объекту. Вычисляется его вектор позиции SetVector(rayStart, model.AbsolutePosition);
, вычисляется его вектор направленный вниз SetVector(rayVector, model.Position.x,model.Position.y-10,model.Position.z);
, а потом проверяется его же пересечение с этим вектором model.OctreeSphereIntersect(raystart, rayvector, 0.1, 10,@pPoint, @pNormal). Ничего странного не находишь? Где второй объект с которым проверяется столкновение?


 
MasacreAnt   (2005-08-20 16:29) [2]

мля мэн огромное пасибо что обьяснил...
я то думал что эта функция проверяет колижн обьекта с любыми не принадлежащими ему полигонами (тобишь без явного указания с каким именно обьектом он должен сталкиваться)...

А нету ли в сцене функции еще колижна с движением по неровному рельефу, или это надо самому все таки доканывать (если самому, то может статейку подскажешь)?


 
Домовенок ©   (2005-08-20 16:49) [3]

>А нету ли в сцене функции еще колижна с движением по
> неровному рельефу, или это надо самому все таки доканывать
> (если самому, то может статейку подскажешь)?

То что тебе нужно прячется здесь: C:\...\GLScene\Demos\behaviours\DCEDemo\



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1137041877
DmitriyR
2006-01-12 07:57
2006.01.29
Координаты мыши в чужом окне


15-1136572004
Yerlan Dossanov
2006-01-06 21:26
2006.01.29
Сам не пойму что со мной


2-1136799037
softmaster
2006-01-09 12:30
2006.01.29
DBLookupComboBoxEh


15-1136454216
Новичоккк
2006-01-05 12:43
2006.01.29
Разбираюсь с OllyDbg


15-1136651927
Pazitron_Brain
2006-01-07 19:38
2006.01.29
Можно ли создать ИИ?