From 69383fe2fdcaa1478678fa4471209463a0547510 Mon Sep 17 00:00:00 2001 From: Mouse <937279156@qq.com> Date: Sat, 16 Jun 2018 23:00:19 +0800 Subject: [PATCH] Update --- source/06-transformations.md | 467 +++++++++++++++++++++ source/_static/06/2_2_matrix.png | Bin 0 -> 832 bytes source/_static/06/coordinates.png | Bin 0 -> 5949 bytes source/_static/06/projection_matrix.png | Bin 0 -> 9472 bytes source/_static/06/projection_matrix_eq.png | Bin 0 -> 5943 bytes source/_static/06/rectangle.png | Bin 0 -> 10401 bytes source/_static/06/square_1.png | Bin 0 -> 11167 bytes source/_static/06/square_coloured.png | Bin 0 -> 23275 bytes source/_static/06/transformations.png | Bin 0 -> 17711 bytes source/index.rst | 3 +- 10 files changed, 469 insertions(+), 1 deletion(-) create mode 100644 source/06-transformations.md create mode 100644 source/_static/06/2_2_matrix.png create mode 100644 source/_static/06/coordinates.png create mode 100644 source/_static/06/projection_matrix.png create mode 100644 source/_static/06/projection_matrix_eq.png create mode 100644 source/_static/06/rectangle.png create mode 100644 source/_static/06/square_1.png create mode 100644 source/_static/06/square_coloured.png create mode 100644 source/_static/06/transformations.png diff --git a/source/06-transformations.md b/source/06-transformations.md new file mode 100644 index 0000000..ef24729 --- /dev/null +++ b/source/06-transformations.md @@ -0,0 +1,467 @@ +# 变换(Transformations) + +## 投影 + +让我们看到在前一章中创建的漂亮的彩色的正方形。如果仔细看,它更像一个矩形,你甚至可以将窗口的宽度从600像素改为900像素,失真就会更加明显。这发生了什么事呢? + +如果你观察顶点着色器的代码,我们只是直接地传递坐标。换句话说,当一个顶点的X坐标为0.5时,我们对OpenGL说在屏幕的X坐标为0.5的位置绘制它。下图是OpenGL坐标(仅含X和Y轴)。 + +![Coordinates](_static/06/coordinates.png) + +将这些坐标投影到窗口坐标,需要考虑到窗口的大小。因此,如果我们的窗口大小为900x480,OpenGL坐标(1, 0)将被投影到窗口坐标(900, 0),最终创建一个矩形而不是一个正方形。 + +![Rectangle](_static/06/rectangle.png) + +但是,问题远比这更严重。在0.0到1.0和-1.0之间修改正方形的坐标,你看到了什么?正方形是完全绘制在同一个地方,不管它是否沿着Z轴位移。为什么会发生这种情况?远处的物体应该比近处的物体小,但是我们使用相同的X和Y坐标绘制它们。 + +但是,等等。这不应该用Z坐标来处理吗?这是正确的但是又不正确。Z坐标告诉OpenGL对象的远近,但是OpenGL对你的对象的大小一无所知。你可以有两个不同大小的物体,一个更近更小,一个更远更大,而且可以以相同的大小正确地投影到屏幕上(有相同的屏幕X和Y坐标,但Z坐标不同)。OpenGL只使用我们正在传递的坐标,所以必须处理这个问题。我们需要正确地投影坐标。 + +既然已经确诊了这个问题,我们该怎么做?答案是使用投影矩阵(`Projection Matrix`)或截锥体(`Frustum`)。投影矩阵将处理绘制区域的宽高比(宽度和高度的关系),因此物体不会被扭曲。它也将处理距离,所以较远的物体将会被绘制得更小。投影矩阵还将考虑我们的视野和应该显示的最大距离有多远。 + +对于不熟悉矩阵的人,矩阵(`Matrix`)是以行和列排列的二维数组。矩阵中的每个数字被称为元素。矩阵阶次是行和列的数量。例如,这里是一个2x2矩阵(有2行2列)。 + +![2x2 Matrix](_static/06/2_2_matrix.png) + +矩阵有许多可以使用的基本运算法则(如加法、乘法等),你可以在任何数学书中查阅它们。与三维图形相关的矩阵对空间中点的变换非常有用。 + +你可以把投影矩阵想象成一个摄像机,它有一个视野和最小和最大距离。该摄像机的可视区域是一个截断的金字塔。下图展示了该区域的俯视图。 + +![Projection Matrix concepts](_static/06/projection_matrix.png) + +投影矩阵将正确地投影三维坐标,以便它们能够在二维屏幕上正确地显示。该矩阵的数学表示如下(不要害怕): + +![Projection Matrix](_static/06/projection_matrix_eq.png) + +其中屏幕宽高比(`Aspect Ratio`)指的是屏幕宽度与屏幕高度的关系($$a=width/height$$)。为了获得给定点的投影坐标,我们只需要将投影矩阵乘以原始坐标,结果将是投影后的另一个向量。 + +因此我们需要处理一组数学对象,如向量、矩阵,并要可以对它们进行操作。我们可以选择从头开始编写所有的代码,或者使用已经实现的库。当然我们会选择容易的方法,使用JOML(`Java OpenGL Math Library`)处理LWJGL内的数学运算。为了使用该库,我们只需要为`pom.xml`文件添加另一个依赖项。 + +```xml + + org.joml + joml + ${joml.version} + +``` + +然后设定使用的库版本。 + +```xml + + [...] + 1.9.6 + [...] + +``` + +现在一切都完事了,让我们创建我们的投影矩阵吧。在`Renderer`类中创建`Matrix4f`类(由JOML库提供)的实例。`Matrix4f`类提供了一个`perspective`方法来创建投影矩阵。该方法需要以下参数: + +* 视野:可视区域的弧度角大小。我们将定义一个储存该值的常数。 +* 屏幕宽高比。 +* 最近视距(z-near)。 +* 最远视距(z-far)。 + +我们将在`init`方法中实例化该矩阵,因此需要将引用传递给`Window`实例以获得窗口大小(你可以在源代码看到它)。代码如下: + +```java + /** + * Field of View in Radians + */ + private static final float FOV = (float) Math.toRadians(60.0f); + + private static final float Z_NEAR = 0.01f; + + private static final float Z_FAR = 1000.f; + + private Matrix4f projectionMatrix; +``` + +投影矩阵的创建如下所示: + +```java +float aspectRatio = (float) window.getWidth() / window.getHeight(); +projectionMatrix = new Matrix4f().perspective(FOV, aspectRatio, + Z_NEAR, Z_FAR); +``` + +现在我们忽略宽高比可以改变(通过调整窗口大小)。这可以在`render`方法中检查并相应地改变投影矩阵。 + +现在有了矩阵,我们如何使用它呢?我们需要在着色器中使用它,并且它应该被应用到所有顶点上。首先,你可能会想到把它捆绑在顶点输入中(就像坐标和颜色那样)。但这样,我们会浪费很多空间,因为投影矩阵在几次渲染期间都不会发生改变。你可能还想在Java代码中用矩阵处理所有顶点。但是,这样我们输入的VBO就是没用的了,这样就不能使用显卡中的处理器资源了。 + +答案是使用“`uniform`”。Uniform是着色器可以使用的全局的GLSL变量,我们将使用它与着色器交流。 + +所以我们需要修改顶点着色器的代码,并声明一个新的称为`projectionMatrix`的全局变量,并用它来计算投影位置。 + +```glsl +#version 330 + +layout (location=0) in vec3 position; +layout (location=1) in vec3 inColour; + +out vec3 exColour; + +uniform mat4 projectionMatrix; + +void main() +{ + gl_Position = projectionMatrix * vec4(position, 1.0); + exColour = inColour; +} +``` + +如上所述,我们把`projectionMatrix`定义为一个4x4的矩阵,新的坐标是通过把它与原始坐标相乘得到的。现在我们需要把投影矩阵的值传递给着色器。首先,我们需要确定全局变量的位置。 + +这是通过调用方法`glGetUniformLocation`完成的,它有两个参数: + +* 着色器程序的ID +* 全局变量名(它应该与着色器里定义的名称相同) + +此方法返回储存全局变量的ID。由于我们可能有一个以上的全局变量,我们将把这些ID储存在由变量名作为索引的Map中(稍后我们需要那个ID)。因此,在`ShaderProgram`需要创建一个新的字段来保存这些ID: + +```java +private final Map uniforms; +``` + +然后由构造方法初始化它: + +```java +uniforms = new HashMap<>(); +``` + +最后,我们创建一个方法来获得全局变量储存的位置。 + +```java +public void createUniform(String uniformName) throws Exception { + int uniformLocation = glGetUniformLocation(programId, + uniformName); + if (uniformLocation < 0) { + throw new Exception("Could not find uniform:" + + uniformName); + } + uniforms.put(uniformName, uniformLocation); +} +``` + +现在在着色器程序编译后,我们就可以在`Renderer`类中调用`createUniform`方法(现在我们投影矩阵实例化后就调用它)。 + +```java +shaderProgram.createUniform("projectionMatrix"); +``` + +现在,我们已经准备好一个可以储存投影矩阵数据的储存器。由于投影矩阵在渲染期间不会改变,所以可以在创建后直接设置值。但是我们将在`render`方法中做这件事。稍后你可以看到,我们可以重用该全局变量来做额外的事情,这些事情需要在每次渲染调用中完成。 + +我们将在`ShaderProgram`类中创建另一个方法来设置数据,称为`setUniform`。我们通过使用JOML库提供的实用方法将矩阵转换成4x4的`FloatBuffer`对象,并将它们发送到全局变量中。 + +```java +public void setUniform(String uniformName, Matrix4f value) { + // Dump the matrix into a float buffer + try (MemoryStack stack = MemoryStack.stackPush()) { + FloatBuffer fb = stack.mallocFloat(16); + value.get(fb); + glUniformMatrix4fv(uniforms.get(uniformName), false, fb); + } +} +``` + +正如你看到的,我们以不同的方式创建缓冲区。我们使用的是自动管理缓冲区,并将它们分配到堆栈上。这是因为这个缓冲区是大小很小,而且它在本方法外不被使用。因此,我们使用`MemoryStack`类。 + +现在,在着色器绑定之后,`Renderer`类中的`render`方法可以使用该方法。 + +```java +shaderProgram.setUniform("projectionMatrix", projectionMatrix); +``` + +我们快要完成了。现在我们可以正确地渲染正方形。所以现在可以启动你的程序,然后得到一个...黑色背景上没有任何彩色正方形。发生了什么?我们弄糟了什么吗?实际上没有任何问题。记住我们正在模拟摄像机观察场景的效果。我们提供了两个距离,一个是最远视距(1000f)和一个最近视距(0.01f)。而我们的坐标是: + +```java +float[] positions = new float[]{ + -0.5f, 0.5f, 0.0f, + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + 0.5f, 0.5f, 0.0f, +}; +``` + +也就是说,我们坐标中的Z坐标在可视区域之外。给它们赋值为-0.05f。现在你会看到像这样的一个巨大的绿色矩形: + +![Square 1](_static/06/square_1.png) + +这是因为,我们正绘制出离摄像机机太近的正方形。我们实际上是在放大它。如果现在把一个`-1.05f`的值赋值给Z坐标,就可以看到彩色正方形了。 + +![Square coloured](_static/06/square_coloured.png) + +如果继续向后移动正方形,我们会看到它变小了。还要注意到正方形不再像矩形了。 + +## 使用变换 + +Let’s recall what we’ve done so far. We have learned how to pass data in an efficient format to our graphics card, and how to project that data and assign them colours using vertex and fragments shaders. Now we should start drawing more complex models in our 3D space. But in order to do that we must be able to load an arbitrary model and represent it in our 3D space at a specific position, with the appropriate size and the required rotation. + +So right now, in order to do that representation we need to provide some basic operations to act upon any model: + +* Translation: Move an object by some amount on any of the three axes. +* Rotation: Rotate an object by some amount of degrees around any of the three axes. +* Scale: Adjust the size of an object. + +![Transformations](_static/06/transformations.png) + +The operations described above are known as transformations. And you probable may be guessing that the way we are going to achieve that is by multiplying our coordinates by a set of matrices \(one for translation, one for rotation and one for scaling\). Those three matrices will be combined into a single matrix called world matrix and passed as a uniform to our vertex shader. + +The reason why it is called world matrix is because we are transforming from model coordinates to world coordinates. When you will learn about loading 3D models you will see that those models are defined in their own coordinate systems. They don’t know the size of your 3D space and they need to be placed in it. So when we multiply our coordinates by our matrix what we are doing is transforming from a coordinate system \(the model one\) to another coordinate system \(the one for our 3D world\). + +That world matrix will be calculated like this \(the order is important since multiplication using matrices is not commutative\): + + +$$ +World Matrix\left[Translation Matrix\right]\left[Rotation Matrix\right]\left[Scale Matrix\right] +$$ + + +If we include our projection matrix in the transformation matrix it would be like this: + + +$$ +Transf=\left[Proj Matrix\right]\left[Translation Matrix\right]\left[Rotation Matrix\right]\left[Scale Matrix\right]=\left[Proj Matrix\right]\left[World Matrix\right] +$$ + + +The translation matrix is defined like this: + + +$$ +\begin{bmatrix} +1 & 0 & 0 & dx \\ +0 & 1 & 0 & dy \\ +0 & 0 & 1 & dz \\ +0 & 0 & 0 & 1 +\end{bmatrix} +$$ + + +Translation Matrix Parameters: + +* dx: Displacement along the x axis. +* dy: Displacement along the y axis. +* dz: Displacement along the z axis. + +The scale matrix is defined like this: + + +$$ +\begin{bmatrix} +sx & 0 & 0 & 0 \\ +0 & sy & 0 & 0 \\ +0 & 0 & sz & 0 \\ +0 & 0 & 0 & 1 +\end{bmatrix} +$$ + + +Scale Matrix Parameters: + +* sx: Scaling along the x axis. +* sy: Scaling along the y axis. +* sz: Scaling along the z axis. + +The rotation matrix is much more complex. But keep in mind that it can be constructed by the multiplication of 3 rotation matrices for a single axis, each. + +Now, in order to apply those concepts we need to refactor our code a little bit. In our game we will be loading a set of models which can be used to render many objects at different positions according to our game logic \(imagine a FPS game which loads three models for different enemies. There are only three models but using these models we can draw as many enemies as we want\). Do we need to create a VAO and the set of VBOs for each of those objects? The answer is no. We only need to load it once per model. What we need to do is to draw it independently according to its position, size and rotation. We need to transform those models when we are rendering them. + +So we will create a new class named `GameItem` that will hold a reference to a model, to a `Mesh` instance. A `GameItem` instance will have variables for storing its position, its rotation state and its scale. This is the definition of that class. + +```java +package org.lwjglb.engine; + +import org.joml.Vector3f; +import org.lwjglb.engine.graph.Mesh; + +public class GameItem { + + private final Mesh mesh; + + private final Vector3f position; + + private float scale; + + private final Vector3f rotation; + + public GameItem(Mesh mesh) { + this.mesh = mesh; + position = new Vector3f(0, 0, 0); + scale = 1; + rotation = new Vector3f(0, 0, 0); + } + + public Vector3f getPosition() { + return position; + } + + public void setPosition(float x, float y, float z) { + this.position.x = x; + this.position.y = y; + this.position.z = z; + } + + public float getScale() { + return scale; + } + + public void setScale(float scale) { + this.scale = scale; + } + + public Vector3f getRotation() { + return rotation; + } + + public void setRotation(float x, float y, float z) { + this.rotation.x = x; + this.rotation.y = y; + this.rotation.z = z; + } + + public Mesh getMesh() { + return mesh; + } +} +``` + +We will create another class which will deal with transformations named `Transformation`. + +```java +package org.lwjglb.engine.graph; + +import org.joml.Matrix4f; +import org.joml.Vector3f; + +public class Transformation { + + private final Matrix4f projectionMatrix; + + private final Matrix4f worldMatrix; + + public Transformation() { + worldMatrix = new Matrix4f(); + projectionMatrix = new Matrix4f(); + } + + public final Matrix4f getProjectionMatrix(float fov, float width, float height, float zNear, float zFar) { + float aspectRatio = width / height; + projectionMatrix.identity(); + projectionMatrix.perspective(fov, aspectRatio, zNear, zFar); + return projectionMatrix; + } + + public Matrix4f getWorldMatrix(Vector3f offset, Vector3f rotation, float scale) { + worldMatrix.identity().translate(offset). + rotateX((float)Math.toRadians(rotation.x)). + rotateY((float)Math.toRadians(rotation.y)). + rotateZ((float)Math.toRadians(rotation.z)). + scale(scale); + return worldMatrix; + } +} +``` + +As you can see this class groups the projection and world matrices. Given a set of vectors that model the displacement, rotation and scale it returns the world matrix. The method `getWorldMatrix` returns the matrix that will be used to transform the coordinates for each `GameItem` instance. That class also provides a method that gets the projection matrix based on the Field Of View, the aspect ratio and the near and far distances. + +An important thing to notice is that the `mul` method of the `Matrix4f` class modifies the matrix instance which the method is being applied to. So if we directly multiply the projection matrix with the transformation matrix we will modify the projection matrix itself. This is why we are always initializing each matrix to the identity matrix upon each call. + +In the `Renderer` class, in the constructor method, we just instantiate the `Transformation` with no arguments and in the `init` method we just create the uniform. + +```java +public Renderer() { + transformation = new Transformation(); +} + +public void init(Window window) throws Exception { + // .... Some code before ... + // Create uniforms for world and projection matrices + shaderProgram.createUniform("projectionMatrix"); + shaderProgram.createUniform("worldMatrix"); + + window.setClearColor(0.0f, 0.0f, 0.0f, 0.0f); +} +``` + +In the render method of our `Renderer` class we now receive an array of GameItems: + +```java +public void render(Window window, GameItem[] gameItems) { + clear(); + + if ( window.isResized() ) { + glViewport(0, 0, window.getWidth(), window.getHeight()); + window.setResized(false); + } + + shaderProgram.bind(); + + // Update projection Matrix + Matrix4f projectionMatrix = transformation.getProjectionMatrix(FOV, window.getWidth(), window.getHeight(), Z_NEAR, Z_FAR); + shaderProgram.setUniform("projectionMatrix", projectionMatrix); + + // Render each gameItem + for(GameItem gameItem : gameItems) { + // Set world matrix for this item + Matrix4f worldMatrix = + transformation.getWorldMatrix( + gameItem.getPosition(), + gameItem.getRotation(), + gameItem.getScale()); + shaderProgram.setUniform("worldMatrix", worldMatrix); + // Render the mes for this game item + gameItem.getMesh().render(); + } + + shaderProgram.unbind(); +} +``` + +We update the projection matrix once per `render` call. By doing it this way we can deal with window resize operations. Then we iterate over the `GameItem` array and create a transformation matrix according to the position, rotation and scale of each of them. This matrix is pushed to the shader and the Mesh is drawn. The projection matrix is the same for all the items to be rendered. This is the reason why it’s a separate variable in our Transformation class. + +We moved the rendering code to draw a Mesh to this class: + +```java +public void render() { + // Draw the mesh + glBindVertexArray(getVaoId()); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + glDrawElements(GL_TRIANGLES, getVertexCount(), GL_UNSIGNED_INT, 0); + + // Restore state + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + glBindVertexArray(0); +} +``` + +Our vertex shader is modified by simply adding a new `worldMatrix` matrix and it uses it with the `projectionMatrix` to calculate the position: + +```glsl +#version 330 + +layout (location=0) in vec3 position; +layout (location=1) in vec3 inColour; + +out vec3 exColour; + +uniform mat4 worldMatrix; +uniform mat4 projectionMatrix; + +void main() +{ + gl_Position = projectionMatrix * worldMatrix * vec4(position, 1.0); + exColour = inColour; +} +``` + +As you can see the code is exactly the same. We are using the uniform to correctly project our coordinates taking into consideration our frustum, position, scale and rotation information. + +Another important thing to think about is, why don’t we pass the translation, rotation and scale matrices instead of combining them into a world matrix? The reason is that we should try to limit the matrices we use in our shaders. Also keep in mind that the matrix multiplication that we do in our shader is done once per each vertex. The projection matrix does not change between render calls and the world matrix does not change per `GameItem` instance. If we passed the translation, rotation and scale matrices independently we would be doing many more matrix multiplications. Think about a model with tons of vertices. That’s a lot of extra operations. + +But you may now think, that if the world matrix does not change per `GameItem` instance, why didn't we do the matrix multiplication in our Java class? We would multiply the projection matrix and the world matrix just once per GameItem and we send it as a single uniform. In this case we would be saving many more operations. The answer is that this is a valid point right now. But when we add more features to our game engine we will need to operate with world coordinates in the shaders anyway, so it’s better to handle those two matrices in an independent way. + +Finally we only need to change the `DummyGame` class to create an instance of `GameItem` with its associated `Mesh` and add some logic to translate, rotate and scale our quad. Since it’s only a test example and does not add too much you can find it in the source code that accompanies this book. + diff --git a/source/_static/06/2_2_matrix.png b/source/_static/06/2_2_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..d859a431accb841d4be459d4184ac7ffb13359d9 GIT binary patch literal 832 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 literal 0 HcmV?d00001 diff --git a/source/_static/06/projection_matrix_eq.png b/source/_static/06/projection_matrix_eq.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1ac6343a75ac60d7e742d5ec1982759ee849ca GIT binary patch literal 5943 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 literal 0 HcmV?d00001 diff --git a/source/_static/06/rectangle.png b/source/_static/06/rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..f3607f5eaabba221d3ecbc50a54e1bcc0ee6e81b GIT binary patch literal 10401 zcmbulWl&r}*DX8*4H|;WAQ{|U0|a*u5In)%-Q6u{aQ6UVa2PB&gS$Jy-3GrrRnPb1 ze)ZP9Kkkpy-MgyKIeVWzwR`nmD^f*C8UvLW6#xKW$jV5l0RV7@Z{r@6cW-S4La5GL z2j{FNEe5C_BRzOC5X?mtMFD`?c(kVf1Fu#&-pD6!-`T zxT>mO=s&fmZJ#z@j;`50eNhgykof!Pozt70zKU4=WbbBYp7seB6&nEX36gt30|0JB z1pol5U>5*D2I=T*GC}LD-%X-UEK9so zHPz=1Y~zJxw_JsC6DI>n>if-)D%HR!I+QZVA+SE)F;Wp9*m?0I>rjT-<@vr15V#G( zT1zsGxv|qUyz)!Ba~=evbRN&=Ry~dhUAORxus(JldotR$)8UA;4c!IDlM4H6saYJn z@|K~rI~<>H8s|G6m>`O^jDyat2F4L~>mmyZNUhh;Ly|h2hDx{&UvHngWUMi@x@-3)ouT%G6H;=ByCa)%FNAc-h&X%G9 zf-SGQ>I?^4LaD4PS@RZc4C9H`=8xn2RkS7U3yV>_Gk{psJwfAO1Y`@srQ zSk-hD`nQ0c2VHXD-ZbTmc4?x)i@CdV?g|Zh0e>m|op^0$s-i=tYJ6Hw^;6(nX+x>_ z#Z{&4?oY4Mm$s+iKJrBFdq+?!AzK48G8WlFVbk5w)^KS1`D3V=?H<@ji>;HxTE|`e z*{!`lmc+8Gh@*#<(EbuOW5jKV(Nw$rnY4=QH!`gTif1{T?LG?oGWsQHp0c>WEhmR| zueb17w;iOW#oPeJGyNI&L*fapAvIHT?MJOsk8iifJ02l3!C)8>FV8S&X3noGz<|ev zxMA;?kbBLmWd)_Y`jjJ(AN1t8#DK-!nrw6jcj{)wATxTn#L3}{@)Shh2-d-rAHHxh zC@RMVXL=*B;)^VRq9+cc9n*Y;5`sLx!quL3r)$d0f;K%ZNRTeC+k>q6=+iJh5Z_4C z8N>;HMy6bavgY4S$Ti$LB5PR3s}Jz}`r12A!ai8?_)B_Gqx{F-6Amh`UJNQqv*Ys) zgFaH4^bfiw65vO?+daLe>&HDM5wB(cVX!Gw6WxM##eYi-uk&)NW4oawjxmi{_fV+* zy6-0G?$Y8Cy@J#!vyFM*YVc=+xKkl{Nh&t-vrZ#CGKngAi1co!-&2NSK6ss$s$|tW zfv$3~XH+wip$J6nO2g3VuoIDY5^yd}N!dMc(tsGcd%Q-*=+~%`#_itf<(FI6U}dLT zoZ3?~kB1}MMFdJ$;oHS|1()`&<8|p0=je3mC2(`8=ONRnD9x;$6TrHmn(#B7a!o=`7H-n?U`tx3-(#celt>kB zKpDy6+V!s9I4ny9=R=a!+&EN^c-8>{MwEZPuxrY_)Q^AY;fp8^lI-o7jW8VDq=c(U zTtHhBk~EknbQkvEA|j%qRV>Axy+MhLrHhKjLNE}ib$cBX9|QsYNuuo?zCMX(la zS7W@a(nUyPGjQNV7{*H-OUTJZEvVEh6i+&+og?OwJR`h1RtW*uq{0p2@gNUv@v;}tO%yH6{w6ju$3;baZxxx1 z278J(-amBLlmhr>h z8!ZVlyI#e{g9|Mm7LmCaG1=x$3vsk`{DGl1r>ahMi=ab!iBj0$<>ZH>W%RXNS|MHJ|De*6_hdZN2ep zYhq4V79{TZAe^ZAa`RyQtEJkZm)8^+{A_kghl3%3w6&hK2x`3USzxr#-#BC?UGetF zhKhaV9|+7bJ5-YZGV-!fKtiC_>&tbOwQ7G?EAOXLpMguytCI{^g5>e&%i_X#=erB%U7bL!b!d5zfBWu|OY(Y*ZT%v5qWZ5<7g zt}W~CaH5_>oUUlk+qG8E$OWQenjBeMlzV;6J#T7KBy8sRykYu4q3+c`eLmRh9wBDC z+*8;_@7OF+=Hq_zu!<^NEN&mqB2^F|Mt8qCI$(J}m0=r(aZIWB^(%`z$9lIDG*Y-? zZmI286>d?Fzl!3phH>-{U!L$B?IkSoq$f^1**$cd{^l1V7soydFls%=dHy+hufak!mr~T0Tp19^XLhXjfC-o8((lH`NjW)wn}0*I z1>OBvh}mFc?*ir!$yscc>fe(a-5pBm&F`b>to@W!P*BJf_I0@Q{qY+QaDJ0__CKOS z0APsXzaQ-X3?ttr>P(U<@?`p6?@!Lm%;4YAzV4|?AiUc;UEg@@!FtIP4Su*ikxv!r zvQJ5+77)-eFzCq33t-~a@$lfg=YNxndHZ5@-hrIp-W_$L0#7l_~&x5)i)4N{(1>z)zs94McBXDO!(0@@S_-0a9o*h zZ;_0~AI%Y39vUidZS@+>;Fgq>6m&bL$P{&c!``C@^M?L!>tUy;h;hn6$Hz1-$jk{TyrF-Mg;|HwbkFa-7oxd7I`onA$B-jXRZ{@XIu9IFdP zz8&bS{K)GYThJSEem6K-4Kh$_{$qR4{b#*ec-#Z{BiY^frC;6k0Sj_>f3J@m^M^Ba z)8R!pHG$`BahXo|SoOU&QtZ0}KnJ_%=5$LPEwj+az%)?&qu2Piq@Kd)%nqp~C?BR| zadr!w0VY=L7ajf24;hstx1@(f>0YdjW9-4n16;X?>W`BM4X!jH(~3(vDeaz#21==- z#$N;i>=kPEdbKg-n#S}P2*6@NJ?JZYx4b{8mpjB{4JZrBttvRMx3s_vKe=M1NqJBZ zxfo(uVIEzz6;ct0zKRw3B}$b;Bg`Q`hiC%cq9@ijy>8C6&I!*Ea29x?_wKdewFGZg zsz}smP_lPsGJu$)5hA2O6~$!{tQ5!$odJ~4yvzGz9kRC=0dFz3S6AoYj|4GS`f$dy zdfYZrT6bdVhsA~Hu@JZu(&5|2s2WIVvR98qD>AX|PvVi=?-cchhYTbd>N2n&e3eKt z^Fb*oNHofcNo-9-|L-$}q)5_+dIU^NJDUDDo>kmoAOYF78&5unoGD6?8IZBrNfE4W zO$rIPH`QVcH|g;EXW@#y_$xU%8|u(V@ZK>W{5W$I3?}zqoBy#9;!V_RxfB|@=rW5L zrc>Y>*#DL-Uy;Hd0p?HfSKqP1nzt&6miRKJta97OdZCy2!D4o6S%P3?_jyOrpG_s# zUHah_yp}D8ZgCGTMJ4Nvy74c<*1q#hnKtVU?WpjbgYw2_Lh2{q%auuE0;F*C;Y+CR zhpol$A084-&sn#~G8Zu@SMz4xHmqp3lO;1ON~@nq;GorGBQou3M%IUb2F=Iq zT5Xe-j;;OnW@q;2E+H`b;l_oBj*d=PSeQu*=DuKnKV0d?fuP@A?b_z<91|ig%p!Ogfy|K|R!p?ON#TRy zo`D-_>!*KydF`nof#@1IB+Iw9gMVpBOYQwH&*cbQ!6?M2(Cbb&Q+0rGWZRhDyjkMp|y-Sc3PM^jo{UM{sj} zcl40~fT}KnY0+Q)-%rlYxb>%=}bl7lpQ&Ua9} z22YzmJ#gjn^>I_~chwIil`>z)j#IMk^)V{m=xz#mUd|{IkVROZ8ZLkbM5vCRI?AWb zt3-UI_1*(u`9ADGI@G!BD$k*`)S6WS-6GDiPR`)Joh{B`(23CZ+ASAa@j1<@I=_hO zd|rNIUp1QUq@Y?{hj7Y2dRC29R17!!dz~jl)@Y;D8Ynrr-n6}dD=NMZ)aOIvR|f=@ zP}YRZiSzHOgODIw^nAvF7!;H+-Jf zT|9G78N)ZLn?U7v>xX$nDRev`A)1OGsykoXmVSNUK7PtVB^JEW^!IL~jE+AfaaAjH zbXwou#yBjW1sxxItum-JSrmqA?Offv;DL-KQMV@X2szZQ?VSTZ0J?au`&`Pr$Uit# zCWJEqKZo7bi;3}QC@E@*3p{9AV2fp~%RQlQ)a zVs341&FlZT2-ayWenha3kMl0Y=+#gnoBq50ftP0UYf3G&G6F3M&2zW-ST2=L4*(GP zh$`GlK|oFKiQ{}fhSTw(oMh1(69wIKU;XDEI$*5?quQ+C0@Or%ISW* zDtqZFD2#`LGhM2jdwuPKfq?<8aI{-#X1AE2Ff?4Bt<*}=*ckZZeRm2Jbc1+ag)s%6 zp^*POIyiX4YbItNwRS6|KR-$9K$CW>L5toeb90?`Cfwu9qO@2w53hDw_# zvDf(99It+6_C_j`qcE~$f5v^-0cs-vo)U;&a*%ewI_F2%A| zw^zeSFh;J;tpP`FGZWR%jQFksAH_Ab?yG{-DcL0|m-(4{K-L(Mr|8O?F&bXcZu4=v|NXc!FKD>uMQosa>>X z^)PH}I9fq3jXrX^jtcM#@~2m#tl@o3@2X~Cton||ER~V@C1#niYSsH49EEtFRGrTe)B{YJ_mjpRS86NP#Xi z1SYcqfTv%BEg9=#+B0ONpfy4JlG4(%oJk;MU)NWb#oLoE^wU?eU)`%Q9nvX{Mz`)~tk~9Y>*_u7~!+QV+gpaq9ZAQE^k_ z$ty)%5}i>=Hv#||;);_gEx|rCzs*6{E(2NA;(I1(vx$na=giZhA=Oodg_V_+L;p9((@$NHD&`s&}`(o6UExu+Xs z?O|bBN|ERb-Y_F<&-ph0ApNI@{W$&jDaJt#z=k)rQ)LAsBA7u=Ow-fUbow7RcQR&B zVyt{W>pDT01?&S2C&%Ywvq20o4;y;v&ya3!uQQ(NW}NivS9{t@=f7fhAuEt14W*gM z{h+#K{1F5H*7wq%0Ri@3U{Cx1%1k`Z+I44#|FYV(bye}|x58l*iT52n{*+DGHdEFp zEgTu_QSyDjB;hwB<*_%`DgN+&_?DIYbVqmz=m8LfM`uK1L&c1{ZJ^p_S|-!q#!L6Y3ilPtMoqfBJk?!=Y`W3*t(^9E!JV z-(_oCuJ4A538$4z($lqsoIj~)xmqcj%{+|GXU`#Sqjq8o(DK4e>-guNG_!oinp0A< zFJLYw)9U`DEwN1}Yx99xFdE_X=2;BD#$z6RrecSO`K=KzWW{+l64*4ZeF%-pBrXhe z@yJdNAk;JqQ-CnxqTUy`G}UCaxjpx18VRo@R_9q;SEQ1KtE9|lPT9X`coDYBmH%x8XUjo+~vwZGcHuA&|BvZqk$XiDr)BwUMRcQfxd; z18DzEe|z}U)`(TnLcc`(%0>L9tAdNm7l8I#(L@FvO+G4y3e9ll%X;_loHkLrf9fq+ z4gX=hElH{(8K>C@L#H}>w{+E4i>ZgWJ@LP8HQE7;{>y$_{e8>=E=7~RP7)Fm-~(gx zmqP;IM=@Ugt&vgMpIH1;75F6rTdO=E;%q{3`q6Qb2Cvy$S)A#loX8_l=K_@sHeM8; zY{+$!x0x6DH#TzCjZd*s;<;_uogNkc%r#0e*z&){tZ0HL7+>Jv7^kO$3N|5mzoh4U zVr#Ox+nsiYi*$L@u3hv57oHba+e}C-G~4cu*~5rd)>VhM7ZeMnng2W<%x#LN6c-D4 zd3`i@P(SzI`UOMZJn@ZwCR4d1U$YvdsLY7EIo(XYkoVVdG@1lBgAW;ddwZ`BrfG$Q z^u@)4e_LgBZG2~SzuUzB$H9cJOgCX|-JOuO_s0t1T{D6rXXS^<`FUFC#=1nlnkgYV zS=!_2Y^4s*a#8STvXosW?yeV zTV|{dSxY;25D4_QXTC~TI<>p=J-MFz(D1*ak~LvJg|2OW4@`aMYr5ES*zG8ZQ!JK* zP(ruvLgE*qWAy{V7;P3GBK~&e8n^z;2bdl^M5-#{g>N3ug!vWr6>Ip zwiw>M6IOL{xK~(LkIg_r{sL<6@HKk4#*^(+Y_a<-^VF9;P4GrlJOHaGfx>RvgBi~R z+qlWX9ZzJPpPqN-PQqD2G!pS#|A3WGU_JA9@tpZvM7dFAPX`&r)&_Fl@B;k9yv^qA z!|h7x=_8bND||f;7RIu}6VVn5jD*9D$UR3BF<)DM$qro*5<-9D;D8+J~?0?0ww8Z9A;Qv zSQwl(nf~uFx>c*wjIA9e}%+&B{S}?tR*tNDk{yJE#B&Hua24) znF@Oi7K|MWI0LYA01OBmMJYM-JeVeH_vj$>gPFeKEU< z7dE2X;&)HTAZZY#d4_J`rdbq!R$k4CMMXn{WJgTq>gW93h`xYCu=$%XR=njQ^(H0o za7ae6LdwZ@6l3UeeaXeu_0$Zs@kcm&;^AqLv&dv&O#;bWrfKYfyJp?w>Vw+koJxLi zX}iTzdpH0V!&~zaTd}R`{V6MjHZwHvS&yq|F-X}U4)0*x;Lp!&eL;wg*|Y(1N=XS$ zdS0dZ-(lYjjZZq|lN7+i^6KCJK%R&+jz7<0%8(yWkpKCmKSQni;WnAdR$~K9Wi?@;^YM< zrD9sQ?shN_Rgp}_9a0ysXeqY60df1LV(eUXwXHAMzV+M}Hz)@x z@j(UeFf=q$wYGQj<+1jnNPn&8j&EyfrPW#AzauM!WN1JMJ}I5%h-d;aWe;cSXe$)Z zykR8*uLt*CU(xRT%wPu_spct;8Z#~;E0zcWHTij;;;k4NwF}zx(eAl_TTOxkG_(zR zC_B<4IvV}^!nSQdx`K$f#4b%0tsEPF@p9y(%>_X#Ix2d-#`_lK5yHL17*qLV##fk^ zWi-^>NldTIr&;kiIelyASrt3Zjb565?pFyL&;MqR;t_<;w)njxwMu7m=Dcie49h)X z%tXo|o|b+;h}L^oS}n(s0J%TrszFv+M;PfR@acM zQX79|8_}25D`3c9^O|$Q8JEtOzaPn@e^c0-MZWTgTh11^M6u0Vtz3UGr|-iQ@7Vo1q05o9xz8y z9^Sw)&HqU_@;_za|7Q;2|4KGY7&$;MKW^vZ*CCkPlW%Br_&o7d{*uJ+CiqV|d;4&% zJUgqj7#ye=ryS{KWi?|@`x99oYgUut6Z(2?CRz7MIy#g8oE`G z#lX`dXO1jQZKr9XkkO3N0hofTN4GcZO$8w`I)flSJ+E@HI%)iM$ani9wnqL93weSq zTPcU?Y$t86I|uKTJa8CN#IUujGIT1T`FqNS5z!lH6u>XggtU9iN$#8a6zna6w6stB z+Fzq9L#NQ`QKO;wHP_gx6n_@S-rPr_^b3y`1mF_K#)UMC zQ0SC=5`KL}#>Z2Bu2OViw~jaE{|p9`g+Wr8s#;rhj6h{*|MB-LG2(ki%ngb>;={wd z#J^5k&!e81s?}5ZRhVM4#rO7{&gEYEzAp&tj$XF&5S$?CRyC zgSFeWKjBYy>#^JRw6yicRYajN93VZExMK4BN70mL%69O*Ceq5F zsJ#bD?3N_P0%ZGWLcKTDXb7owD&rPwIG``*;uarm)qiKFF$^`wb4oQZ=-FXdD={J1 zY<)`JYhlVsZ)owr`w!U2GflAHJ6@ChXQm>7p<3YLmg)EG*1LMXjMm<|2_FGY(|Si< zu+B3wTeeI+(J17|{WMmU7fryr-iqVsQ%+Eg*6Nj?VYzrmYka}5fu`dofD-DU1oanP z-BYE2jikNDZE##m;%Bv^*^wnw{#~x2?|OM%(amFW@64BujXmzItTQ8z6$T`pGnxt< z-y6>ndYr4$m6MZ$_4S%?yy>6_m~|w0g7N8CS?!M(YTrmg*kVycN8AF~G&(moxA{hW zY)#OxU+=U?4g_`GcRA+uDvJ&Yi5Wt%K;7hTZ|Le0mW_YlO!CSKAv00#CW{x%dX2NL^NQmBFt>1RK(z1Pa7XKIq zO=ER;bR^=o!d*nq(3K~4SJBcMaQr|@nw65``WDa4(fl?RDHx+(VYStjgx|@;!oosL zZK@|6i`RB3L-|)faZYX=1A`BirpT6L0!P#hICz!T9wd z9*&Qs3=rzvY|&H_A3WJ>6s$nGdLgPZm!=KoI^)1zxe>0}gf)0aS7W z1L5w4%L{jJfG@QW2t=b&6Au^H=a$5ELZR#v-`x-gtYhEBE1pa!l}TGH^>r@ljoh1{ nViQLHpVWE(Uy`M`7Wwdrd_Gf)wfId|2#}RjlBgE@9`wHeO7bf2 literal 0 HcmV?d00001 diff --git a/source/_static/06/square_1.png b/source/_static/06/square_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3947f78f5edb48fea1c0e51c615b22348fe6ee2b GIT binary patch literal 11167 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%0Dp@9rFcLq_z-Y&76vucQU2yUvX+ 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 literal 0 HcmV?d00001 diff --git a/source/_static/06/square_coloured.png b/source/_static/06/square_coloured.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cbfb3aac4d49540e3a752986590e02d2310a6 GIT binary patch literal 23275 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 R0t>1S=xG~i6>D4#`44*o(Gmav literal 0 HcmV?d00001 diff --git a/source/_static/06/transformations.png b/source/_static/06/transformations.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8e7c47469697363f709d9f2c1ef72e1f04963e GIT binary patch literal 17711 zcmbSyRa9GD6lSpEQi^*E6f4r=ZpF1wEO>EucQ4-J?hb)s!QG0x26uO-z}$b+@RQ3?}{1PufNVaiBR9xDhDg9Ys=c(969|OW^WO_@z^=p?1p3-5^Hub_yWYtPvX1Kf z3+R0Lw`ljOVfYusgaZS59*0@M=7H%`4eb*Z?ehA1h)dmb1Ndas(&lIt{0#?DRKz6w z=LhPMVB#-lZLjh6YhE_^DDdwC*6!kCS$V@QiNc=v_mbBHk&TE#5daBNxH6vgfoo^5 zXd@uC!5bp0jKi658+TWfXfIdmEA^{LXzcm+SJ_4cgx8}6wEZ%7fC4m@4V;cXuh@zZhvGflfUDBGtveI zt*(M&TX0+Rx!XzB_r00bIJPqQ6VP6c^mx0qwKbl>8

@^pqy$YO1UoFn)p^%D(E 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 literal 0 HcmV?d00001 diff --git a/source/index.rst b/source/index.rst index f73b082..50c540e 100644 --- a/source/index.rst +++ b/source/index.rst @@ -9,4 +9,5 @@ 02-the-game-loop 03-a-brief-about-coordinates 04-rendering - 05-more-on-rendering \ No newline at end of file + 05-more-on-rendering + 06-transformations \ No newline at end of file