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

Вниз

Проверка столкновений   Найти похожие ветки 

 
Sword-Fish ©   (2003-10-04 00:35) [0]

Доброй ночи ВАМ !!!
Не могли бы вы мне ответить вот на какой вопрос:
Я пишу шутер на чистом WIN API (на OpenGL) и загружаю уровень вот так из файла:

******************************************************

type
TCoord = Record
X, Y, Z : glFLoat;
end;

TFace = Record
V1, V2, V3, V4 : Integer;
U, V : glFloat;
TextureIndex : Integer;
end;

var
Texture : Array of glUint;

TextureCount : Integer;
VertexCount  : Integer;
FaceCount    : Integer;
Vertex : Array of TCoord;
Face   : Array of TFace;

procedure LoadMap;
var F : Textfile;
   Tex : Array of String;
   S : String;
   I, J : Integer;
begin
 AssignFile(F, "Demo.fzm");
 Reset(F);

 // Load the textures
 Readln(F, TextureCount);
 SetLength(Tex, TextureCount);
 SetLength(Texture, TextureCount);
 for I :=0 to TextureCount-1 do
 begin
   Readln(F, S);
   Tex[i] :=Copy(S, 1, Pos(" ", S)-1);
   S :=Copy(S, Pos(" ", S)+1, length(S));
   LoadTexture(S, Texture[i],false);
 end;

 // Load the vertices
 Readln(F, VertexCount);
 SetLength(Vertex, VertexCount);
 for I :=0 to VertexCount-1 do
   Readln(F, Vertex[i].X, Vertex[i].Y, Vertex[i].Z);

 // Load the faces
 Readln(F, FaceCount);
 SetLength(Face, FaceCount);
 for I :=0 to FaceCount-1 do
 begin
   Readln(F, Face[i].V1, Face[i].V2, Face[i].V3, Face[i].V4, Face[i].U, Face[i].V, S);
   S :=Trim(Copy(S, 1, 12));

   for J :=0 to TextureCount-1 do
     if Tex[J] = S then
       Face[i].TextureIndex :=J;
 end;
 CloseFile(F);
end;

******************************************************

И потом отрисовываю его в процедуре отрисовки экрана:

 For I :=0 to FaceCount-1 do
 with face[i] do
 begin
   glBindTexture(GL_TEXTURE_2D, Texture[TextureIndex]);
   glBegin(GL_QUADS);
     glTexCoord(0, 0);  glVertex3fv(@Vertex[V1-1]);
     glTexCoord(U, 0);  glVertex3fv(@Vertex[V2-1]);
     glTexCoord(U, V);  glVertex3fv(@Vertex[V3-1]);
     glTexCoord(0, V);  glVertex3fv(@Vertex[V4-1]);
   glEnd();
 end;

******************************************************

Ну вообщем у меня есть моя координата x,y,z и я нажимая стрелки на клаве могу двигаться и вертеть головой мышью а мне надо чтобы и сквозь стены не проходил !!!
Как мне связать текущие координаты и координаты стен и всего другого ?
Или есть более легкий способ загрузки уровней в игре и отслеживанию столкновений ?
Заранее СПАСИБО ОГРОМНОЕ !!!


 
Sword-Fish ©   (2003-10-04 11:04) [1]

Ну кто-нибудь помогите мне, пожалуйста !!!
Мне это очень надо ...
Ну пожалуйста ответьте кто-нить ???


 
Sapersky ©   (2003-10-04 11:06) [2]

Вообще-то и проверять столкновения,и рисовать удобнее и быстрее, если уровень представляет собой не просто кучу полигонов, а какую-то упорядоченную структуру. Существует много методов - различного рода деревья (BSP-tree, octtree), порталы (portals), PVS (potentially visible sets). См., например, http://www.delphi3d.net/articles.php
Если уж не хочется с этим разбираться, можно сделать простую проверку на пересечение вектора направления камеры (точнее, луча) со всеми полигонами. Если пересеклись и расстояние до полигона меньше определённого значения, значит, упираемся в стену. Но будет уровень чуть побольше - и тормоза обеспечены, и при проверке, и при прорисовке.


 
Sword-Fish ©   (2003-10-04 11:36) [3]

Спасибо за ответ !!!
А есть что-нибудь на русском и попроще чуть-чуть ???


 
Sapersky ©   (2003-10-04 11:53) [4]

http://www.gamedev.ru
Но там на C++ :)


 
Sword-Fish ©   (2003-10-04 11:53) [5]

А может есть готовый примерчик для загрузки bsp-уровней в мою игру и проверки там столкновений, а то я однажды нашел в нете такой примерчик: карта из КВАКИ 2, помоему, грузилась и там проверялись collision"s (комнатка такая небольшая и лестница) !!!
А то я с другом решил заняться созданием игры вплотную и вложиться в это дело хорошенько ...


 
Sapersky ©   (2003-10-04 12:08) [6]

ИМХО, по статье проще разбираться, чем по исходникам, поэтому я всё-таки рекомендую GameDev (там в новостях прямо перед носом будет ссылка на статью).
Примеры на Дельфи:
http://www.cs.sun.ac.za/~henri/advgfx.html


 
Landgraph   (2003-10-05 14:33) [7]

Еще вариант, тормознутый правда:
Проверять, перед перемещением в точку, принадлежит ли эта точка какому-либо треугольнику пола или нет. Если нет - тогда никуда не идем.
Но тогда надо разграничивать треугольники пола и всего остального (в принципе ничего сложного). И, опять же, желательно сначала определить - виден ли треугольник или нет.


 
VitGun ©   (2003-10-06 17:06) [8]

2 Sapersky. ОГРОМНОЕ. ВСЕЛЕНСКОЕ НЕЧЕЛОВЕЧЕСКОЕ СПАСИБО ЗА ССЫЛКУ. Я мучался с BSP-collision месяц, но так ничего и не добился.
З.Ы. Сорри за флейм...


 
Sword-Fish ©   (2003-10-07 00:11) [9]

Спасибо ВАМ большое за ссылку на примеры по Delphi !!!
Все просто классно (спасибо еще раз) !!!



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

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

Наверх




Память: 0.49 MB
Время: 0.028 c
1-1079965607
naiman_de
2004-03-22 17:26
2004.04.11
Как сделать так,чтобы приложение копировало само себя


3-1079012632
Evyshka
2004-03-11 16:43
2004.04.11
Перевод xml в БД


14-1082296866
q13
2004-04-18 18:01
2004.04.11
задача:распределить число между элементами массива


14-1079824599
GetIt
2004-03-21 02:16
2004.04.11
ADOConnection


3-1081753897
L_G
2004-04-12 11:11
2004.04.11
Enter в OnKeyDown в DBEdit`e