Форум: "Игры";
Текущий архив: 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