Форум: "Прочее";
Текущий архив: 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.015 c