[fpc-pascal] GLM library alternative?
Reimar Grabowski
reimgrab at web.de
Mon May 29 14:36:01 CEST 2017
On Sat, 27 May 2017 16:52:21 +0700
Ryan Joseph <ryan at thealchemistguild.com> wrote:
> Not having glm::perspective or glm::lookAt is enough to really stop you in your tracks and running off to Google for hours.
Then perhaps you have to improve your google skills. ^^
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml
Has all the info you need to implement them.
Unoptimized pascal versions (but fast enough for general use):
function TCamera.LookAt(Eye, Center, Up: TVector3): TMatrix4x4;
var
View, Right: TVector3;
TransMatrix: TMatrix4x4;
begin
View:=Normalized(fCoV-Position);
Right:=Normalized(CrossProduct(View, Up));
Up:=CrossProduct(Right, View);
Result[0][0]:=Right.X;
Result[1][0]:=Right.Y;
Result[2][0]:=Right.Z;
Result[3][0]:=0;
Result[0][1]:=Up.X;
Result[1][1]:=Up.Y;
Result[2][1]:=Up.Z;
Result[3][1]:=0;
Result[0][2]:=-View.X;
Result[1][2]:=-View.Y;
Result[2][2]:=-View.Z;
Result[3][2]:=0;
Result[0][3]:=0;
Result[1][3]:=0;
Result[2][3]:=0;
Result[3][3]:=1;
Result:=MultglMatrix(IdentityMatrix4x4, Result);
TransMatrix:=IdentityMatrix4x4;
TransMatrix[3][0]:=-Eye.X;
TransMatrix[3][1]:=-Eye.Y;
TransMatrix[3][2]:=-Eye.Z;
Result:=MultglMatrix(Result, TransMatrix);
end;
function TScene.BuildPerspectiveMatrix(FoV, AspectRatio, NearPlane,
FarPlane: GLfloat): TMatrix4x4;
var
XYMax, XMin, YMin, Width, Height, Depth: GLfloat;
begin
XYMax:=NearPlane*tan(FoV*pi/360);
YMin:=-XYMax;
XMin:=-XYMax;
Width:=XYMax-XMin;
Height:=XYMax-YMin;
Depth:=FarPlane-NearPlane;
Result[0][0]:=(2*NearPlane/Width)/AspectRatio;
Result[0][1]:=0;
Result[0][2]:=0;
Result[0][3]:=0;
Result[1][0]:=0;
Result[1][1]:=2*NearPlane/Height;
Result[1][2]:=0;
Result[1][3]:=0;
Result[2][0]:=0;
Result[2][1]:=0;
Result[2][2]:=-(NearPlane+FarPlane)/Depth;
Result[2][3]:=-1;
Result[3][0]:=0;
Result[3][1]:=0;
Result[3][2]:=-2*(FarPlane*NearPlane)/Depth;
Result[3][3]:=0;
end;
R.
More information about the fpc-pascal
mailing list