Problem with gfm.math.matrix (some gamedevs out there ?)
drug2004 at bk.ru
Thu Sep 3 13:14:57 UTC 2020
On 9/3/20 3:36 PM, Thomas wrote:
> I am following some examples in C++ about how OpenGL is working. There
> are great tutorials out there and most of it works also with D.
> For my code I am using gfm.math.matrix (Version 8.0.3) to be able to
> calculate the mouse position in a 3d world.
> Now I have some problems with the projection matrix by inverting it.
> My example code:
> import std.stdio;
> int main()
> import gfm.math.matrix;
> const int width = 800;
> const int height = 600;
> auto projectionMatrix = mat4!(float).identity();
> auto ratio = cast(float)width / cast(float)height;
> projectionMatrix = mat4!(float).perspective( 45.0f, ratio, 0.0f,
> 100.0f );
> writeln("projectionMatrix: ", projectionMatrix );
> auto inversedMatrix = mat4!(float).identity();
> inversedMatrix = projectionMatrix.inverse(); // <-- why this does
> not work ?
> writeln("inversedMatrix: ", inversedMatrix );
> return 0;
> The projection matrix will be calculated correctly with
> [1.34444, 0, 0, 0, 0, 1.79259, 0, 0, 0, 0, -1, -0, 0, 0, -1, 0] assuming
> that the screen size is 800x600.
> But using the .inverse() function in gfm returns only a matrix with
> following values:
> [-nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan, -nan,
> -nan, -nan, inf, -inf]
> I don't know what I am doing wrong here:
> - do I call the function wrong way ? (but there is no other way)
> - is there a bug in the function ? (I do not believe that because the
> library is battle proved)
> So I looked a couple of hours for an answer, but did not find anything
> Is somebody out there who could help me out ? Maybe one developer of the
> d gfm library ?
> Thank you for you time!
1. zNear should not be equal to zero, this makes your matrix singular
and inversion of singular matix is impossible so you get nans and infs.
Make zNear a little bit more than zero and your code will work
2. FOV in perspective should be expressed in radians, not degrees
so this fixes your problem:
projectionMatrix = mat4!(float).perspective( 45.0f * 3.14 / 180., ratio,
0.01f, 100.0f );
More information about the Digitalmars-d-learn