Sure, but you may consider using http://pastebin.com/
Sure, but you may consider using http://pastebin.com/
Done!
http://pastebin.com/ff5a251c
enjoy, and I hope it helps
BTW, it isn't a COMPLETE implementation, but it does points, lines, triangles (wireframe) only...
cheers,
Paul
Games:
Seafox
Pages:
Syntax Error Software itch.io page
Online Chess
http://gameknot.com/#paul_nicholls
Whoa, looks great. Thanks a bunch, Paul!
I'll see if I can make something out of this.
@Paul: Your openGL emulation code looks very interesting. Great job!
Coders rule nr 1: Face ur bugz.. dont cage them with code, kill'em with ur cursor.
Finally, after weeks of struggling, the code works!
And here is a step-by-step guide:
1.First of all, I disposed of all my matrix code and rewrote it. Here are the functions you will need to compile the code: http://www.nopaste.pl/Source/mhc.txt
2.Use the following shaders: http://www.nopaste.pl/Source/mhd.txt
3.Your rendering code should look like this:
[code=delphi]
procedure TMainForm.RenderWorld;
var
Model, View, Proj, MVP: TBrainMatrix;
begin
// Clear the frame buffer
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// Compute the model-view-projection matrix
Proj := Mat4CreatePerspective(60.0, ClientWidth / ClientHeight, 0.1, 1000.0);
Model := Mat4Translate(Mat4CreateRotationEuler(ModelRotatio n), Vec3Negate(ModelPosition));
View := Mat4Translate(Mat4CreateRotationEuler(CameraRotati on), Vec3Negate(CameraPosition));
View := Mat4Inverse(View);
MVP := Mat4Multiply(Model, Mat4Multiply(View, Proj));
// Update the shader
glUniformMatrix4fv(ShaderManager.ActiveProgram.Get UniformLocation('mvpmatrix'),
1, False, @MVP);
// Rendering code here...
end;
[/code]
I hope it saves someone almost two weeks of cursing.
Great job.
I wonder though why you need to invert the view matrix.
I definitly need to dust off my knowledge about linear algebra. I still have the "3D Math primer for graphics and gamedevelopment" book, which needs to be studied lol.
Coders rule nr 1: Face ur bugz.. dont cage them with code, kill'em with ur cursor.
Was my code helpful to you getting this working?Originally Posted by Brainer
I hope so LOL
cheers,
Paul
Games:
Seafox
Pages:
Syntax Error Software itch.io page
Online Chess
http://gameknot.com/#paul_nicholls
Nope, Paul, but I'm glad you tried to help. I really appreciate that.Originally Posted by paul_nicholls
@chronozphere
Take a look at the quote:
Full article is here: http://www.programmersheaven.com/2/world-viewCreating the view matrix
The view matrix transforms the world coordinates system into the coordinate system of the camera. In other words, after applying the view matrix transform the coordinates will be relative to the camera and not the origin of the world. If we think of the camera as one of the objects in the world we can see that the view matrix is actually an inverse transform of the camera's world matrix. By inverting the world matrix used to place the camera in the world we get the view matrix.
I used http://www.gamedev.net/community/for...opic_id=468539 to create LookAt function but i'm still not getting results that i need:
[pascal]function LookAt(const eye, target, up: TVector): TMatrix;
var x,y,z,p: TVector;
begin
z:=invert(norm(VectorSub(target,eye)));
x:=norm(crossproduct(norm(up),z));
y:=crossproduct(z,x);
p:=vector(-dot(eye,x),-dot(eye,y),-dot(eye,z));
result:=CreateMatrix(x,y,z,p);
end;[/pascal]
It is short and "simple" but yet it's not working right. I have tried to visualize the matrix vectors in 2D plane but it's hella confusing... And i've tested and tested the math behind tool functions but they should all work correctly. They are used in numerous other 3D functions which behave right, including MatrixToSurface() that is another kind of LookAt formed of pos and normal on a plane, RayTriangleIntersect(), RaySphereIntersect().
This is how it's i've debugged the matrix: http://i49.tinypic.com/fbc9oj.png
Red dot is Eye vector and white is its Invert. Yellow dot is Target vector. Green represent LookAt matrix returned and line drawn is Z-rotation vector of it.
Basically.. i was able with the same functions to point the ship with my mouse and draw another smaller ship on surface of it where cursor ray first crossed, perfectly aligned with the triangle on the point, yet LookAt doesn't work.
Edit2: Getting a little closer, but its upside down and is not directly following target or eye pos http://i45.tinypic.com/2nly2id.png
I drew the matrix-Z vector from eye pos aswell. It's green line that should hit yellow sphere for it to be correct.
Doh, error was in my own CreateMatrix().. it was built wrong sided.
It was your code Brainer that worked first though
I replaced
[pascal]_41 := Dot(Scale(xAxis, -1.0), From);
_42 := Dot(Scale(yAxis, -1.0), From);
_43 := Dot(Scale(zAxis, -1.0), From);[/pascal]
with
[pascal]_41 := Dot(Scale(xAxis, -1.0), At);
_42 := Dot(Scale(yAxis, -1.0), At);
_43 := Dot(Scale(zAxis, -1.0), At);[/pascal]
And it worked straight away.
My function optimized is now:
[pascal]function LookAt(const eye, target, up: TVector): TMatrix;
var x,y,z,p: TVector;
begin
z:=norm(VectorSub(eye,target));
x:=norm(crossproduct(up,z));
y:=crossproduct(z,x);
p:=vector(-dot(eye,x),-dot(eye,y),-dot(eye,z));
result:=CreateMatrix(x,y,z,p);
end;[/pascal]
Bookmarks