20
edits
mNo edit summary |
mNo edit summary |
||
Line 1: | Line 1: | ||
= OpenGL coordinate systems = | |||
In the Octave plotting backend, we find various OpenGL transformations. Some of the classic OpenGL transformation steps, as well as coordinate systems, are shown in the following picture: | In the Octave plotting backend, we find various OpenGL transformations. Some of the classic OpenGL transformation steps, as well as coordinate systems, are shown in the following picture: | ||
Line 9: | Line 5: | ||
[[File:Octave_coordinate_systems.png|center|350px]] | [[File:Octave_coordinate_systems.png|center|350px]] | ||
= The Octave coordinate system = | |||
In Octave a plot scene is defined by a "view point", a "camera target" and an "up vector". | In Octave a plot scene is defined by a "view point", a "camera target" and an "up vector". | ||
[[File:Octave_view_point_setup_to_scale.png|center|750px]] | [[File:Octave_view_point_setup_to_scale.png|center|750px]] | ||
= update_camera() = | |||
In the second part of <math display="inline">\rightarrow</math> "axes::properties::update_camera ()" the view transformation "x_gl_mat1" and projection matrix "x_gl_mat2" are put together. The following chapter illustrates some of the properties of "x_gl_mat1" and "x_gl_mat2". | |||
== The role of "x_gl_mat1" == | == The role of "x_gl_mat1" == | ||
=== x_view === | === x_view === | ||
The following section of code composes the matrix "x_view", which is a major subset of "x_gl_mat1". The matrix "x_gl_mat1" consists of multiple translations, scales and one rotation operation. | The following section of code composes the matrix "x_view", which is a major subset of "x_gl_mat1". The matrix "x_gl_mat1" consists of multiple translations, scales and one rotation operation. The individual operation steps are shown in a picture below. | ||
{{Code|Section of axes::properties::update_camera ()"|<syntaxhighlight lang="C" style="font-size:13px"> | {{Code|Section of axes::properties::update_camera ()"|<syntaxhighlight lang="C" style="font-size:13px"> | ||
Line 61: | Line 61: | ||
To visualize the matrix properties, the "x_gl_mat1" matrix is multiplied by the object coordinates. After the transformation, the plot box is aligned with the Z-axis and the view point is at the origin <math display="inline">[0,0,0]</math>. The matrix transforms world coordinates into camera coordinates. The purple planes show the near and far clipping planes. | To visualize the matrix properties, the "x_gl_mat1" matrix is multiplied by the object coordinates. After the transformation, the plot box is aligned with the Z-axis and the view point is at the origin <math display="inline">[0,0,0]</math>. The matrix transforms world coordinates into camera coordinates. The purple planes show the near and far clipping planes. | ||
[[File:Octave_x_gl_mat1_setup.png|center| | [[File:Octave_x_gl_mat1_setup.png|center|300px]] | ||
The individual translation, scaling and rotation operations of "x_gl_mat1", are shown in the following figure: | The individual translation, scaling and rotation operations of "x_gl_mat1", are shown in the following figure: | ||
Line 73: | Line 73: | ||
The matrix "x_gl_mat2" is composed of the sub matrices "x_viewport" and "x_projection". The purpose of these matrices is to fit the associated 2D image of the above transformation result into a "bounding box". The bounding box is defined as follows: | The matrix "x_gl_mat2" is composed of the sub matrices "x_viewport" and "x_projection". The purpose of these matrices is to fit the associated 2D image of the above transformation result into a "bounding box". The bounding box is defined as follows: | ||
* bb(0), bb(1): Position of the viewport | * bb(0), bb(1): Position of the "viewport" | ||
* bb(2), bb(3): Width and height of the viewport | * bb(2), bb(3): Width and height of the "viewport" | ||
Hint: If you debug in "update_camera ()", you can print "bb": | Hint: If you debug in "update_camera ()", you can print "bb": | ||
Line 87: | Line 87: | ||
=== x_projection === | === x_projection === | ||
In the following simplified code section the matrix "x_projection" is | In the following simplified code section the matrix "x_projection" is composed. It is used to normalize the image of the above transformation. For this purpose, the field of view (FOV) must be calculated: | ||
{{Code|Section of axes::properties::update_camera ()"|<syntaxhighlight lang="C" style="font-size:13px"> | {{Code|Section of axes::properties::update_camera ()"|<syntaxhighlight lang="C" style="font-size:13px"> | ||
Line 148: | Line 148: | ||
Note: The matrix "x_gl_mat2" scales x, y so that the image fits tightly into the bounding box. The z-coordinate is not modified! | Note: The matrix "x_gl_mat2" scales x, y so that the image fits tightly into the bounding box. The z-coordinate is not modified! | ||
= setup_opengl_transformation () = | |||
== OpenGL backend == | |||
In the OpenGL backend, the view matrix, an orthographic matrix, and the projection matrix are loaded on the matrix stack. | |||
{{Code|Section of opengl_renderer::setup_opengl_transformation ()"|<syntaxhighlight lang="C" style="font-size:13px"> | |||
Matrix x_zlim = props.get_transform_zlim (); | |||
xZ1 = x_zlim(0)-(x_zlim(1)-x_zlim(0))/2; | |||
xZ2 = x_zlim(1)+(x_zlim(1)-x_zlim(0))/2; | |||
// Load x_gl_mat1 and x_gl_mat2 | |||
Matrix x_mat1 = props.get_opengl_matrix_1 (); | |||
Matrix x_mat2 = props.get_opengl_matrix_2 (); | |||
m_glfcns.glMatrixMode (GL_MODELVIEW); | |||
m_glfcns.glLoadIdentity (); | |||
m_glfcns.glScaled (1, 1, -1); | |||
// Matrix x_gl_mat2 | |||
m_glfcns.glMultMatrixd (x_mat1.data ()); | |||
m_glfcns.glMatrixMode (GL_PROJECTION); | |||
m_glfcns.glLoadIdentity (); | |||
Matrix vp = get_viewport_scaled (); | |||
// Install Orthographic Projection Matrix with viewport | |||
// setting 0, vp(2), vp(3), 0 and near / far values xZ1, xZ2 | |||
m_glfcns.glOrtho (0, vp(2), vp(3), 0, xZ1, xZ2); | |||
// Matrix x_gl_mat2 | |||
m_glfcns.glMultMatrixd (x_mat2.data ()); | |||
m_glfcns.glMatrixMode (GL_MODELVIEW); | |||
m_glfcns.glClear (GL_DEPTH_BUFFER_BIT); | |||
</syntaxhighlight>}} |
edits