Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

DELPHI / 14 Boyutlu Matrix Oyun Consolu İçin

YaSa22

Fahri Üye
Fahri Üye
Katılım
12 Temmuz 2014
Mesajlar
2,293
Tepkime puanı
2
Puanları
0
Konum
GTA
unit Matrix;

interface
type pdouble = ^double;
type clsMatrix = class
public

constructor create();


procedure loadIdentity();


procedure setMatrixValues( matrix : array of single);


procedure postMultiply( var matrix : clsMatrix );


procedure setTranslation( translation : array of single );


procedure setInverseTranslation( translation : array of single);


procedure setRotationRadians( angles : array of single );


procedure setRotationDegrees( angles : array of single );


procedure setInverseRotationRadians( angles : array of single );


procedure setInverseRotationDegrees( angles : array of single );


procedure getMatrix(var matrix : array of single);


procedure translateVect( var pVect : array of single );


procedure rotateVect( var pVect : array of single );


procedure inverseTranslateVect( var pVect : array of single );


procedure inverseRotateVect( var pVect: array of single );

private

m_matrix : array [0..15] of single;

end;


implementation


constructor clsMatrix.create;
begin
loadIdentity();
end;


procedure clsMatrix.getMatrix(var matrix : array of single);
var i : integer;
begin

for i := 0 to 15 do
matrix := m_matrix;
end;

procedure clsMatrix.inverseRotateVect(var pVect: array of single);
var vec : array [0..2] of single;
begin
vec[0] := pVect[0]*m_matrix[0]+pVect[1]*m_matrix[1]+pVect[2]*m_matrix[2];
vec[1] := pVect[0]*m_matrix[4]+pVect[1]*m_matrix[5]+pVect[2]*m_matrix[6];
vec[2] := pVect[0]*m_matrix[8]+pVect[1]*m_matrix[9]+pVect[2]*m_matrix[10];

pVect[0] := vec[0];
pVect[1] := vec[1];
pVect[2] := vec[2];
end;

procedure clsMatrix.loadIdentity;
begin
m_matrix[0] := 1;
m_matrix[1] := 0;
m_matrix[2] := 0;
m_matrix[3] := 0;

m_matrix[4] := 0;
m_matrix[5] := 1;
m_matrix[6] := 0;
m_matrix[7] := 0;

m_matrix[8] := 0;
m_matrix[9] := 0;
m_matrix[10] := 1;
m_matrix[11] := 0;

m_matrix[12] := 0;
m_matrix[13] := 0;
m_matrix[14] := 0;
m_matrix[15] := 1;
end;

procedure clsMatrix.postMultiply(var matrix: clsMatrix);
var newMatrix : array [0..15] of single;
begin

newMatrix[0] := m_matrix[0]*matrix.m_matrix[0] + m_matrix[4]*matrix.m_matrix[1] + m_matrix[8]*matrix.m_matrix[2];
newMatrix[1] := m_matrix[1]*matrix.m_matrix[0] + m_matrix[5]*matrix.m_matrix[1] + m_matrix[9]*matrix.m_matrix[2];
newMatrix[2] := m_matrix[2]*matrix.m_matrix[0] + m_matrix[6]*matrix.m_matrix[1] + m_matrix[10]*matrix.m_matrix[2];
newMatrix[3] := 0;

newMatrix[4] := m_matrix[0]*matrix.m_matrix[4] + m_matrix[4]*matrix.m_matrix[5] + m_matrix[8]*matrix.m_matrix[6];
newMatrix[5] := m_matrix[1]*matrix.m_matrix[4] + m_matrix[5]*matrix.m_matrix[5] + m_matrix[9]*matrix.m_matrix[6];
newMatrix[6] := m_matrix[2]*matrix.m_matrix[4] + m_matrix[6]*matrix.m_matrix[5] + m_matrix[10]*matrix.m_matrix[6];
newMatrix[7] := 0;

newMatrix[8] := m_matrix[0]*matrix.m_matrix[8] + m_matrix[4]*matrix.m_matrix[9] + m_matrix[8]*matrix.m_matrix[10];
newMatrix[9] := m_matrix[1]*matrix.m_matrix[8] + m_matrix[5]*matrix.m_matrix[9] + m_matrix[9]*matrix.m_matrix[10];
newMatrix[10] := m_matrix[2]*matrix.m_matrix[8] + m_matrix[6]*matrix.m_matrix[9] + m_matrix[10]*matrix.m_matrix[10];
newMatrix[11] := 0;

newMatrix[12] := m_matrix[0]*matrix.m_matrix[12] + m_matrix[4]*matrix.m_matrix[13] + m_matrix[8]*matrix.m_matrix[14] + m_matrix[12];
newMatrix[13] := m_matrix[1]*matrix.m_matrix[12] + m_matrix[5]*matrix.m_matrix[13] + m_matrix[9]*matrix.m_matrix[14] + m_matrix[13];
newMatrix[14] := m_matrix[2]*matrix.m_matrix[12] + m_matrix[6]*matrix.m_matrix[13] + m_matrix[10]*matrix.m_matrix[14] + m_matrix[14];
newMatrix[15] := 1;

setMatrixValues( newMatrix );
end;

procedure clsMatrix.rotateVect(var pVect : array of single);
var vec : array [0..2] of single;
begin

vec[0] := pVect[0]*m_matrix[0]+pVect[1]*m_matrix[4]+pVect[2]*m_matrix[8];
vec[1] := pVect[0]*m_matrix[1]+pVect[1]*m_matrix[5]+pVect[2]*m_matrix[9];
vec[2] := pVect[0]*m_matrix[2]+pVect[1]*m_matrix[6]+pVect[2]*m_matrix[10];

pVect[0] := vec[0];
pVect[1] := vec[1];
pVect[2] := vec[2];

end;

procedure clsMatrix.setInverseRotationDegrees(angles : array of single);
var vec : array [0..2] of single;
begin

vec[0] := angles[0]*180.0/PI ;
vec[1] := angles[1]*180.0/PI ;
vec[2] := angles[2]*180.0/PI ;
setInverseRotationRadians( vec );
end;

procedure clsMatrix.setInverseRotationRadians(angles : array of single);
var cr , sr , cp , sp , cy , sy , srsp , crsp : single;
begin

cr := cos( angles[0] );
sr := sin( angles[0] );
cp := cos( angles[1] );
sp := sin( angles[1] );
cy := cos( angles[2] );
sy := sin( angles[2] );

m_matrix[0] := cp*cy ;
m_matrix[4] := cp*sy ;
m_matrix[8] := -sp ;

srsp := sr*sp;
crsp := cr*sp;

m_matrix[1] := srsp*cy-cr*sy ;
m_matrix[5] := srsp*sy+cr*cy ;
m_matrix[9] := sr*cp ;

m_matrix[2] := crsp*cy+sr*sy ;
m_matrix[6] := crsp*sy-sr*cy ;
m_matrix[10] := cr*cp ;
end;


procedure clsMatrix.setInverseTranslation(translation : array of single);
begin
m_matrix[12] := -translation[0];
m_matrix[13] := -translation[1];
m_matrix[14] := -translation[2];
end;

procedure clsMatrix.setMatrixValues(matrix : array of single);
var i : integer;
begin
for i := 0 to 15 do
m_matrix := matrix;

end;


procedure clsMatrix.setRotationDegrees(angles : array of single);
var vec : array [0..2] of single;
begin
vec[0] := angles[0]*180.0/PI ;
vec[1] := angles[1]*180.0/PI ;
vec[2] := angles[2]*180.0/PI ;
setRotationRadians( vec );
end;

procedure clsMatrix.setRotationRadians(angles : array of single);
var cr , sr , cp , sp , cy , sy , srsp , crsp : single;
begin

cr := cos( angles[0] );
sr := sin( angles[0] );
cp := cos( angles[1] );
sp := sin( angles[1] );
cy := cos( angles[2] );
sy := sin( angles[2] );

m_matrix[0] := cp*cy ;
m_matrix[1] := cp*sy ;
m_matrix[2] := -sp ;

if m_matrix[2] = -0 then
m_matrix[2] := 0;

srsp := sr*sp;
crsp := cr*sp;

m_matrix[4] := srsp*cy-cr*sy ;
m_matrix[5] := srsp*sy+cr*cy ;
m_matrix[6] := sr*cp ;

m_matrix[8] := crsp*cy+sr*sy ;
m_matrix[9] := crsp*sy-sr*cy ;
m_matrix[10] := cr*cp ;
end;

procedure clsMatrix.setTranslation(translation : array of single);
begin

m_matrix[12] := translation[0];
m_matrix[13] := translation[1];
m_matrix[14] := translation[2];
end;


procedure clsMatrix.translateVect(var pVect : array of single);
begin

pVect[0] := pVect[0]+m_matrix[12];
pVect[1] := pVect[1]+m_matrix[13];
pVect[2] := pVect[2]+m_matrix[14];
end;


procedure clsMatrix.inverseTranslateVect(var pVect : array of single);
begin

pVect[0] := pVect[0]-m_matrix[12];
pVect[1] := pVect[1]-m_matrix[13];
pVect[2] := pVect[2]-m_matrix[14];
end;

end.
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst