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

Вниз

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

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

Наверх




Память: 0.47 MB
Время: 0.046 c
4-1078674335
Shutov
2004-03-07 18:45
2004.04.11
Печать


1-1082645647
alienserg
2004-04-22 18:54
2004.04.11
Кнопка динамической формы на панели задач.


1-1082375157
wicked
2004-04-19 15:45
2004.04.11
virtual vs не-virtual


14-1082030205
Knight
2004-04-15 15:56
2004.04.11
Кто помнит астрономию?


3-1081483877
Mery
2004-04-09 08:11
2004.04.11
Сумма в запросе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский