Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
15-1136303672
X9
2006-01-03 18:54
2006.01.29
Помогите с OpenOffice


2-1136824870
ZeFiR
2006-01-09 19:41
2006.01.29
Как узнать, запустилась ли программа впервые?


2-1137152908
SarDoX
2006-01-13 14:48
2006.01.29
IE и delphi


2-1136973884
Nafania
2006-01-11 13:04
2006.01.29
SOS!!!


15-1136466461
Ломброзо
2006-01-05 16:07
2006.01.29
Тоже хочу интерпретатор, но SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский