Question

- SOLVED -

Warning : I'm not native English speaker

Hi,

I'm currently trying to make a 3D camera, surely because of some mistakes or math basics that I don't have, anyway, I think I will definitely become insane if I don't ask for someone help.

OK lets go.

First, I've a custom game engine that allow to deal with camera only by setting up:

  • the projection parameters (according to an orthographic or perspective mode)
  • the view: with a vector 3 for the position and a quaternion for orientation (and no, we will not discuss about this design right now)

Now I'm writing a camera in my gameplay code (which use the functionalities of the previous engine)

My camera's environment has the following specs:

  • up_vector = (0, 1, 0)
  • forward_vector = (0, 0, 1)
  • angles are in degrees
  • glm as math lib

In my camera code I handle the player input, convert them into data that I send to my engine. In the engine I only do:

glm::mat4 projection_view = glm::perspective(...parameters...) * glm::inverse(view_matrix)

And voila I have my matrix for the rendering step.

And now a little scenario with simple geometry.

In a 3D space we have 7 circles, drawn from z = -300 to 300. The circle at z = -300 is red and the one at 300 is blue, There are decorative shapes (triangles/box), they are there to facilitate the identification of up and right

When I run the scenario I have got the following disco result !! Thing that I don't want.

Perspective camera

As you can see on my exemple of colorful potatoid above, the blue circle is the bigger but is setup to be the farest on z. According to the perspective it should be the smaller. What happened ?

On the other hand, when I use an orthographic camera everything works well.

Orthographic camera

Any ideas ?


About the Perspective matrix

I generate my perspective matrix with the function glm::perspective(), After a quick check , I have confirmed that my parameters' values are always good, so I can easily imagine that my issue doesn't come from there.

About the View matrix

First, I think my problem must be around here, maybe ... So, I have a vector3 for the position of the camera and 3 float for describing its rotation on each axes. And here is the experimental part where I don't know what I'm doing !

I copy the previous three float in a vector 3 that I use as an Euleur angles and use a glm quaternion constructor that can create a quat from Euler angles, like that :

glm::quat q(glm::radians(euler_angles));

Finally I send the quaternion like that into the engine, without having use my up and forward vector (anyway I do not see now how to use them)

I work on it for too long and I think my head will explode, the saddest is I think I'm really close.


PS0: Those who help me have my eternal gratitude

PS1: Please do not give me some theory links : I no longer have any neuron, and have already read two interesting and helpless books. Maybe because I have not understood everything yet. (3D Math Primer for Graphics and Game Development / Mathematics for 3D Game Programming and Computer Graphics, Third Edition)


SOLUTION

It was a dumb mistake ... at the very end of my rendering pipeline, I forget to sort the graphical objects on them "z" according to the camera orientation.

Was it helpful?

Solution 2

Hi TonyWilk and thanks

Are you using the projection matrix when you render the coloured circles?

Yes, I generate my projection matrix from the glm::perspective() function and after use my projection_view matrix on my vertices when rendering, as indicated in the first block of code.

Should you be using an identity matrix to draw the circle, the model is then viewed according to the view/perspective matrices ?

I don't know if I have correctly understood this question, but here is an answer. Theoretically, I do not apply directly the perspective matrix into vertices. I use, in pseudo code:

rendering_matrix = projection_matrix * inverse_camera_view_matrix

The triangles and squares look correct - do you have a different transform in effect when you render the circles ?

At the end, I always use the same matrix. And if the triangles and squares seem to be good, that is only due to an "optical effect". The biggest box is actually associated to the blue circle, and the smaller one to the red

OTHER TIPS

You said:

In my camera code I handle the player input, convert them into data that I send to my engine. In the engine I only do:

glm::mat4 projection_view = glm::perspective(...parameters...) * glm::inverse(view_matrix)

And voila I have my matrix for the rendering step.

Are you using the projection matrix when you render the coloured circles?

Should you be using an identity matrix to draw the circle, the model is then viewed according to the view/perspective matrices ?

The triangles and squares look correct - do you have a different transform in effect when you render the circles ?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top