Sorry, but the code proposed by you doesn't not seem to work. It doesn't even display the triangle.
Sorry, but the code proposed by you doesn't not seem to work. It doesn't even display the triangle.
How about:
Code:ModelView := MatrixMultiply(MatrixMultiply(ProjMat, ModelView2), Cam);
Nope, it's still the same. In both cases nothing's even displayed.
I noticed that there is a problem with the math I'm using to create the matrices. I noticed that when I tried to transpose the matrix using glUniform and my custom-build function. They produced different results.
Does anyone have any decent Pascal math library with matrix functions (I'd also like to have functions for calculating transformation matrices included)?
I just took a look at your transformation matrix code. It seems some of the signs are wrong when you calculate the rotation matrix. I'll take a look later when I'm drunk enough to understand this matrix stuff
Peregrinus, expectavi pedes meos in cymbalis
Nullus norvegicorum sole urinat
This is the matrix that I calculated. It might be that it's for a righthand coordinate system though. That might be why
Code:[ cos(ty)*cos(tz), -cos(ty)*sin(tz), sin(ty),0] [ cos(tx)*sin(tz) + cos(tz)*sin(tx)*sin(ty), cos(tx)*cos(tz) - sin(tx)*sin(ty)*sin(tz), -cos(ty)*sin(tx),0] [ sin(tx)*sin(tz) - cos(tx)*cos(tz)*sin(ty), cos(tz)*sin(tx) + cos(tx)*sin(ty)*sin(tz), cos(tx)*cos(ty),0] [0,0,0,1]
Peregrinus, expectavi pedes meos in cymbalis
Nullus norvegicorum sole urinat
Thanks. I did the corrections.
But it's still the same. I even tried changing a little the rendering code:
[code=delphi]
{ .: MatrixLookAt :. }
function MatrixLookAt(const From, At, Up: TVector): TMatrix;
var
xAxis, yAxis, zAxis: TVector;
begin
zAxis := VectorSubtract(From, At);
zAxis := VectorNormalize(zAxis);
xAxis := VectorCrossProduct(Up, zAxis);
xAxis := VectorNormalize(xAxis);
yAxis := VectorCrossProduct(zAxis, xAxis);
with Result do
begin
_11 := xAxis.X;
_12 := yAxis.X;
_13 := zAxis.X;
_14 := 0.0;
_21 := xAxis.Y;
_22 := yAxis.Y;
_23 := zAxis.Y;
_24 := 0.0;
_31 := xAxis.Z;
_32 := yAxis.Z;
_33 := zAxis.Z;
_34 := 0.0;
_41 := VectorDotProduct(VectorScale(xAxis, -1.0), At);
_42 := VectorDotProduct(VectorScale(yAxis, -1.0), At);
_43 := VectorDotProduct(VectorScale(zAxis, -1.0), At);
_44 := 1.0;
end;
end;
{ .: TMainForm.Render :. }
procedure TMainForm.Render;
var
ProjMat, Cam, ModelView, Model: TMatrix;
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// Projection update
if (ClientHeight <= 0) then
ClientHeight := 1;
ProjMat := MatrixProjection(40.0, ClientWidth / ClientHeight, 0.1, 1000.0);
// Camera transformations
Cam := MatrixLookAt(VectorNegate(Camera.Pos), VectorCreate(0.0, 0.0, -1.0),
VectorCreate(0.0, 1.0, 0.0));
Model := MatrixTransform(VectorCreate(0.0, 0.0, 0.0),
VectorCreate(0.0, TriangleRot, 0.0), VectorUniform(0.5));
ModelView := MatrixIdentity;
ModelView := MatrixMultiply(MatrixMultiply(Model, Cam), ProjMat);
// Update the shader
glUniformMatrix4fv(glGetUniformLocation(ShaderMana ger.GLSLPrograms['minimal'].
ProgramHandle, 'mvpmatrix'), 1, ByteBool(GL_FALSE), @ModelView);
// Render the triangle
glBindVertexArray(TriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
end;
[/code]
The new code displays the triangle, but the translation doesn't work correctly. When I translate the triangle with an arrow key, it doesn't change its position. Once I strafe and then try to move it forward, it suddenly accelerates. Clearly it's a problem with the matrix I pass to the shader, but where is the bug hidden? The function was taken from LEAF2 engine - I hoped it was a good one.
The LookAt function is definitely off. Was doing my Matrix lib today based on GLScene and tested this on the way. Lib itself works perfectly when i rotate object with mouse with my functions. It's when i set camera with this lookAt it doesn't go to right place.
[pascal]// This doesn't work
cam:=MatrixLookAt(Vector(0,0,-3),Vector(0,0,0),Vector(0,1,0));
// This works
cam:=NewMatrix;
TranslateMatrix(cam,Vector(0,0,-3));[/pascal]
Edit: I also used your matrix multiplication function so it means they are read same way GLScene made 1 line for each 16 array elements, 2 x for loop is more compact.
Hm, okay. Thanks for your feedback.
So you suggest using normal transformation functions instead of LookAt, right? But this approach doesn't work, either. The first snippet I posted contained the MatrixTransform function. It was wrong at first, but JSoftware provided us with a new matrix and I modified the code. Nevertheless, the effect is still far from what's desired.
Maybe it's something wrong with the shader? Maybe I'm looking for a bug in a wrong place?
Hi Brainer,
A while ago I was fiddling around with creating software OpenGL routines (for my gp2x handheld), and I DID get something basic working.
I could emulate exactly how OpenGL did its rendering with regards to transformations.
I have a unit you could look at which includes all my OpenGL transformations, etc. but it is 1307 lines long...
Is it ok if I post it here?
Perhaps it may help you with your matrix issues...
cheers,
Paul
Games:
Seafox
Pages:
Syntax Error Software itch.io page
Online Chess
http://gameknot.com/#paul_nicholls
Bookmarks