Показать сообщение отдельно
  #9  
Старый 24.06.2012, 14:48
Anklav Anklav вне форума
Прохожий
 
Регистрация: 10.06.2011
Адрес: Харьков
Сообщения: 22
Версия Delphi: 7
Репутация: 10
По умолчанию

Как бы физический движок это компонент который устанавливается допустим в делфи, или идет в комплекте с каким нибудь 3д движком..

Лично сам делал без сторонних физических движков.
Алгоритм следующий, создается массив из элеметов (целочисленных переменных допустим) допустим 15х15, то есть в 224 элемента. Это будет карта, суть следующая: при значении 0 мы данный квадрат проезжаем, при 1 - нет.

Для начала нужно разделить этот массив в плоскость. Делаем это следующими функциями

Код:
...
var
map:array [0..224] of integer; //наша карта
NtoX,NtoY:integer;

...

//Тут все понятно, вводишь x и y и тебе выдают номер квадрата
//15 - это число квадратов на карте
Function TForm1.XYToN(x,y:integer):integer;
var
N:integer;
begin
N:=(x+y*15);
Result:=N;
end;

//для этой функции понадобится 2 глобальные переменные
//так как вывести нам нужно 2 значения
//15 - это число квадратов на карте
//Здесь эти перменные: "NtoX" - это собственно Х и "NtoY" - это Y.
Procedure TForm1.NToXY(N:integer);
var
NtoXDemo:Extended;
begin
NtoY:=Trunc(N/15);
NtoXDemo:=Frac(N/15)*15;
NtoX:=Round(NtoXDemo);
end;

//Допустим тебе известны координаты квадрата (это будут переменные 
// X,Y) и тебе нужно изменить значение матрицы 


procedure TForm1.Button1Click(Sender: TObject);
begin
map[XYtoN(X,Y)]:=0;
end;

//Или тебе известен номер квадрата 
//и тебе нужно узнать где он находится
//NomerK это будет известный тебе номер квадрата 
//X и Y искомые кординаты

procedure TForm1.Button2Click(Sender: TObject);
begin
NtoXY(NomerK);
X:=NtoX;
Y:=NtoY;
end;

Но это мы просто работаем с массивом, для связи координат того же OpenGL и нашей карты нужны следующие функции:

Код:
//Данная функция переводит X или Y OpenGL в X или Y карты (map)
//у нас 1 квадрат имеет длину и ширину в 0.25 

Function TForm1.PixToK(K:Extended):integer;
var
i:integer;
MasPix:array [0..14] of Extended; //Длинна или ширина карты
begin
MasPix[0]:=0;
For i:=1 to 14 do
  begin
    MasPix[i]:=MasPix[i-1]+0.25;//0.25 это длинна квадрата в OpenGL
  end;

For i:=0 to 14 do
  begin
    If (MasPix[i]<=K) and (MasPix[i]+0.25>K) then Result:=i;
  end;
end;

//Данная функция переводит X или Y (map) в X или Y OpenGL
//у нас 1 квадрат имеет длину и ширину в 0.25 
Function TForm1.KToPix(p:integer):Extended;
var
i:integer;
NPix:Extended;
begin
NPix:=0;
For i:=0 to p-1 do NPix:=NPix+0.25;
Result:=NPix;
end;

//Примеры X Y - координаты(в OpenGL) нашего героя 
//0.01 шаг его ходьбы
//Angle - угол движения героя
procedure TForm1.Button1Click(Sender: TObject);
begin
//если с следующем шаге 
//мы поападаем в квадрат с значением 0, то идем дальше
If Map[XYToN(PixToK(X+0.01*cos(Angle)),PixToK(Y+0.01*sin(Angle)))] = 0 then 
      begin
        X:=X+0.01*cos(angle);
        Y:=Y+0.01*sin(angle);
      end;
end;

P.S. Видел эту программу в исходниках на сайте..
P.S.S. И по моему для рисования каждой грани объекта нужно заново объявлять glBegin(GL_QUADS); .. glEnd; там достаточно 1 раз указать цвет.
Т.к. скорее всего будут проблемы с нормалями, а они нужны для правильного освещения.
Ответить с цитированием