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

Вниз

Нужна помощь!   Найти похожие ветки 

 
hellfire   (2006-06-21 14:02) [0]

Скачал пример "Basic 3D Engine" (http://delphigfx.mastak.ru/samples/samp60.rar).

Как сделать чтобы камера отталкивалась от стенок?


 
Johnmen ©   (2006-06-21 14:07) [1]

У меня камера висит в гараже. На крючке...


 
hellfire   (2006-06-21 14:53) [2]

А если серьёзно... помогите плз!


 
syte_ser78 ©   (2006-06-21 15:01) [3]

hellfire   (21.06.06 14:53) [2]
Высылай исходник, свои пожелания, и куда твой копирайт вставить


 
hellfire   (2006-06-21 15:04) [4]

Как в данном примере сделать чтобы камера отталкивалась от стенок?

Исходник тут: http://delphigfx.mastak.ru/samples/samp60.rar


 
syte_ser78 ©   (2006-06-21 15:06) [5]

Johnmen ©   (21.06.06 14:07) [1]
А она от стен отталкивается?


 
syte_ser78 ©   (2006-06-21 15:09) [6]

С инетом напряг. Сколько файл весит?
Если меньше полуметра, дам мыло - скинеш


 
hellfire   (2006-06-21 15:35) [7]

106 KB, могу скинуть


 
syte_ser78 ©   (2006-06-21 15:35) [8]

syte_ser78@mail.ru


 
Prohodil Mimo ©   (2006-06-21 15:36) [9]

syte_ser78 ©   (06.06.21 15:06) [5]
А она от стен отталкивается?


если кинуть - наверняка оттолкнётся :о)


 
hellfire   (2006-06-21 15:40) [10]

syte_ser78, я скинул

Prohodil Mimo, а по делу можете подсказать! Хватит шутить!


 
Ketmar ©   (2006-06-21 16:08) [11]

а по делу -- это в институт. там много интересного рассказывают. если, конечно, учиться, а не пиво пить.


 
hellfire   (2006-06-21 16:09) [12]

там она проходит сковзь стены... а нужно чтоб отталкивалась


 
syte_ser78 ©   (2006-06-21 16:12) [13]

Процедура procedure ProcessKeys отвечает за положение камеры по координатам Х, У. твоя задача чтобы камера не прошла через стену. тоесть ее координаты не стали равны координате какойлибо точке стены.
Координаты какойлибо точки стены вычисляем по эллементарной формуле за 5 класс по данным файла map.txt

В процедуре ProcessKeys все строки изменения координат
X := X - sin(Heading*pi/180)*FrameTime/600;   // FrameTime/600=movement speed
Z := Z + cos(Heading*pi/180)*FrameTime/600;   // FrameTime/600=movement speed
......
меняем на
X := X + dX(keys,x,z);
Z := Z + dZ(keys,x,z);

где функция dX возвращает
-sin(Heading*pi/180)*FrameTime/600 для Keys=UK_UP
аналогично для других здачений Keys, при условии что мы не уперлись в стену и 0 при условии что уперлись.

Подозреваю что есть более простой вариант, с графикой я практически не работал.


 
Cerberus ©   (2006-06-21 16:13) [14]

> [12] hellfire   (21.06.06 16:09)
> там она проходит сковзь стены... а нужно чтоб отталкивалась

Это надо значть хотябы теорию 3д. А в данном случае алгоритмы работы с опенжл.


 
Ketmar ©   (2006-06-21 16:19) [15]

>Cerberus ©   (21.06.06 16:13) [14]
при чём тут OpenGL? математика, простая математика. без знания которой нечего делать в 3d.


 
hellfire   (2006-06-21 17:02) [16]

А можно отрывок кода... а то у меня не получается :(


 
Ega23 ©   (2006-06-21 17:10) [17]


> А можно отрывок кода... а то у меня не получается :(


Дык сначала учиться надо...


 
hellfire   (2006-06-21 17:12) [18]

блин... похоже я помощи не дождусь....


 
syte_ser78 ©   (2006-06-21 17:23) [19]

Помощь нужно уметь искать.
Решения типа
камера.отскакивает_от_стен:=true;
не существует.


 
Cash ©   (2006-06-21 17:36) [20]

похоже я помощи не дождусь
Ты просто не туда обратился... (та-ска-ать ни в то дупло :))) )

60-й семпл... так, дай вспомнить...
Так... там же этот, примерчик опеновский... а ну да,
там короче смотри в сторону map.txt, в енй информация о помещении, при
загрузке она кда то подгружается (э- не помню...), а при перемещении надо
сделать процедурку, которая по умному проверяет расположение камеры
внутри этого трехмерного объекта (помещения т. е.).

Самый тупой вариант - это перебор всех ребер, самый умный (и не
накладный по ресурсам компа) - это Oct. Tree, но это ж... эту технологию
знать надо. Третий вариант - там при проецировании граней делается отсев
вневизорных (не видимых в окуляр камеры) граней, после отсева, вроде,
лист выйти должен, в в нем тотальным перебором ребер можно будет
отловить выход камеры за пределы комнаты (помещения) и сделать нужные
коррекции.


 
syte_ser78 ©   (2006-06-22 10:01) [21]

Да а задачка и правда интересная.
Вчера минут за сорок вник в протокол файла map.txt. Свою квартиру хочу затридешить, обои уже сфотографировал :)


 
syte_ser78 ©   (2006-06-23 12:00) [22]

procedure ProcessKeys;
var
stena:boolean;
i: integer;
z1,z2,x1,x2,rez,a,b,c,rast1,rast2,rast3:real;
point1, point2, point3, point4:integer;
begin
 if Keys[VK_UP] then
 begin
   stena:=false;
      for i:=0 to FaceCount-1 do
      begin
        point1:=Face[i].V1;
        point2:=Face[i].V2;
        point3:=Face[i].V3;
        point4:=Face[i].V4;
        x1:=Vertex[point1-1].X;
        z1:=Vertex[point1-1].Z;
        x2:=Vertex[point2-1].X;
        z2:=Vertex[point2-1].Z;
        a:=z2-z1;
        b:=x1-x2;
        c:=-z1*b-x1*a;
        rez:=-a*x-b*z+c;
        if abs(rez)<0.3 then
        begin                   // находишься ли ты между точками отрезка стены
          rast1:=sqrt(sqr(x2+x)+sqr(z2+z));
          rast2:=sqrt(sqr(x1+x)+sqr(z1+z));
          rast3:=sqrt(sqr(x1-x2)+sqr(z1-z2));
          if abs(rast3-rast2-rast1)<0.2 then
          begin
            stena:=true;
          end;{if}
        end;{if}
      end;{for}
   if not stena then
     begin
     Z := Z + cos(Heading*pi/180)*FrameTime/600;   // FrameTime/600=movement speed
     X := X - sin(Heading*pi/180)*FrameTime/600;   // FrameTime/600=movement speed
     end
   else
     begin
     X := X + sin(Heading*pi/180)*FrameTime/600;   // FrameTime/600=movement speed
     Z := Z - cos(Heading*pi/180)*FrameTime/600;
     end;
   HeadMovAngle :=HeadMovAngle + 5;
   HeadMovement :=0.025*sin(HeadMovAngle*pi/180);
 end;

 if Keys[VK_DOWN] then
   begin
   stena:=false;
      for i:=0 to FaceCount-1 do
      begin
        point1:=Face[i].V1;
        point2:=Face[i].V2;
        point3:=Face[i].V3;
        point4:=Face[i].V4;
        x1:=Vertex[point1-1].X;
        z1:=Vertex[point1-1].Z;
        x2:=Vertex[point2-1].X;
        z2:=Vertex[point2-1].Z;
        a:=z2-z1;
        b:=x1-x2;
        c:=-z1*b-x1*a;
        rez:=-a*x-b*z+c;
        if abs(rez)<0.3 then
        begin                   // находишься ли ты между точками отрезка стены
          rast1:=sqrt(sqr(x2+x)+sqr(z2+z));
          rast2:=sqrt(sqr(x1+x)+sqr(z1+z));
          rast3:=sqrt(sqr(x1-x2)+sqr(z1-z2));
          if abs(rast3-rast2-rast1)<0.2 then
          begin
            stena:=true;
          end;{if}
        end;{if}
      end;{for}
   if not stena then
     begin
     X := X + sin(Heading*pi/180)*FrameTime/600;
     Z := Z - cos(Heading*pi/180)*FrameTime/600;
     end
   else
     begin
     X := X - sin(Heading*pi/180)*FrameTime/600;
     Z := Z + cos(Heading*pi/180)*FrameTime/600;
     end;
   HeadMovAngle :=HeadMovAngle - 5;
   HeadMovement :=0.025*sin(HeadMovAngle*pi/180);
 end;
 if Keys[VK_LEFT] then
   begin
   stena:=false;
      for i:=0 to FaceCount-1 do
      begin
        point1:=Face[i].V1;
        point2:=Face[i].V2;
        point3:=Face[i].V3;
        point4:=Face[i].V4;
        x1:=Vertex[point1-1].X;
        z1:=Vertex[point1-1].Z;
        x2:=Vertex[point2-1].X;
        z2:=Vertex[point2-1].Z;
        a:=z2-z1;
        b:=x1-x2;
        c:=-z1*b-x1*a;
        rez:=-a*x-b*z+c;
        if abs(rez)<0.3 then
        begin                   // находишься ли ты между точками отрезка стены
          rast1:=sqrt(sqr(x2+x)+sqr(z2+z));
          rast2:=sqrt(sqr(x1+x)+sqr(z1+z));
          rast3:=sqrt(sqr(x1-x2)+sqr(z1-z2));
          if abs(rast3-rast2-rast1)<0.2 then
          begin
            stena:=true;
          end;{if}
        end;{if}
      end;{for}
   if not stena then
     begin
     X := X + deltaX(VK_LEFT,X,Z);  // FrameTime/900=movement speed
     Z := Z - cos((Heading+90)*pi/180)*FrameTime/900;  // straffing = 50% slower
     end
   else
     begin
     X := X - deltaX(VK_LEFT,X,Z);  // FrameTime/900=movement speed
     Z := Z + cos((Heading+90)*pi/180)*FrameTime/900;  // straffing = 50% slower
     end
 end;
 if Keys[VK_RIGHT] then
   begin
   stena:=false;
      for i:=0 to FaceCount-1 do
      begin
        point1:=Face[i].V1;
        point2:=Face[i].V2;
        point3:=Face[i].V3;
        point4:=Face[i].V4;
        x1:=Vertex[point1-1].X;
        z1:=Vertex[point1-1].Z;
        x2:=Vertex[point2-1].X;
        z2:=Vertex[point2-1].Z;
        a:=z2-z1;
        b:=x1-x2;
        c:=-z1*b-x1*a;
        rez:=-a*x-b*z+c;
        if abs(rez)<0.3 then
        begin                   // находишься ли ты между точками отрезка стены
          rast1:=sqrt(sqr(x2+x)+sqr(z2+z));
          rast2:=sqrt(sqr(x1+x)+sqr(z1+z));
          rast3:=sqrt(sqr(x1-x2)+sqr(z1-z2));
          if abs(rast3-rast2-rast1)<0.2 then
          begin
            stena:=true;
          end;{if}
        end;{if}
      end;{for}
   if not stena then
     begin
     X := X + deltaX(VK_RIGHT,X,Z);
     Z := Z + cos((Heading+90)*pi/180)*FrameTime/900;
     end
   else
     begin
     X := X - deltaX(VK_RIGHT,X,Z);
     Z := Z - cos((Heading+90)*pi/180)*FrameTime/900;
     end;
 end;
end;


 
hellfire   (2006-06-25 14:25) [23]

а полностью можешь выложить код?


 
syte_ser78 ©   (2006-06-26 12:58) [24]

hellfire   (25.06.06 14:25) [23]
полностью выложен на http://www.sourse.ru/forum
раздел "создание игр"



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

Форум: "Прочее";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.178 c
15-1151242133
dmitry99
2006-06-25 17:28
2006.07.23
Новосибирску 113 лет!


15-1151135169
Verg
2006-06-24 11:46
2006.07.23
Задачка. Надой найти кратчайшее решение.


15-1151164272
DillerXX
2006-06-24 19:51
2006.07.23
forgot-me-not


15-1150545629
ОГО!!!
2006-06-17 16:00
2006.07.23
vs2005


15-1150910869
Piter
2006-06-21 21:27
2006.07.23
Теплообмен в трубах





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