1. ホーム
  2. opengl

GLMライブラリの概要 glm::transform, glm:scale, glm::rotate

2022-02-15 05:44:43
<パス <ブロッククオート

以下に説明する関数を使用する前に、関連するヘッダーファイルを忘れずにインクルードしてください。通常はこれで十分です。

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>


モデルマトリックスの主な機能も回転、並進、拡大縮小であるため、以下の3つの関数を主に使用する。

glm::transform

この関数は、一般的にオブジェクトを次のように変換するために使用されます。 変位 であり、以下のように使用される。

//purpose: to shift a vector (1, 0, 0) by (1, 1, 0) units
//1. Define the vector vec
glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
// 2. Initialize a unit matrix
// glm::mat4 trans = glm::mat4(1.0f)
// 3. Multiply the vector (1, 1, 0) with the unit matrix
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
//4. Multiply the result with the initial vector again to change its displacement
vec = trans * vec;


glm::scale

この関数は、一般的にオブジェクトを次のようにスケーリングするために使用されます。 スケーリング であり、以下のように使用される。

//Purpose: to scale the object to 0.5 times its original size and create its transformation matrix
//1. Initialize a unit matrix
glm::mat4 trans = glm::mat4(1.0f);
//2. Scale the matrix by multiplying it with glm::vec3(0.5, 0.5, 0.5)
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); 


glm::rotate

この関数は、一般的にオブジェクトを回転させるために使用されます。 回転させる であり、以下のように使用される。

//Purpose: Rotate the object 90 degrees counterclockwise along the z-axis to create its transformation matrix
//1. Initialize a unit matrix
glm::mat4 trans = glm::mat4(1.0f);
//2, use glm::radians to transform the angle into radians, glm::vec3(0.0, 0.0, 1.0) means rotate along the Z axis
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));


ps: 上記の例における拡大縮小と回転は変換行列を作成するだけで、実際にこれらの変換をオブジェクトに適用したい場合は、オブジェクトの関連行列と乗算する必要があります。そして、シェーダデータの転送の問題になります。ここでは、簡単なコード紹介にとどめます。

// Vertex shader code for the object in question
#version 330 core
layout (location = 0) in vec3 aPos;

//uniform is a global variable that can be set to a value in the main function.
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0f);
}

// Part of the code in the main function.
//1. Declare a global variable to represent the position of the object in world space coordinates
glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
//2. Initialize a unit matrix
glm::mat4 model = glm::mat4(1.0f);
//3. Shift the object to the corresponding position
model = glm::translate(model, lightPos);
//4. Scale the matrix by multiplying it with glm::vec3(0.5, 0.5, 0.5)
model = glm::scale(model, glm::vec3(0.5f)); 
//5. Set the value for the model in the shader
lampShader.setMat4("model", model);


// Part of the code in the main function.
//1. Declare a global variable to represent the position of the object in world space coordinates
glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
//2. Initialize a unit matrix
glm::mat4 model = glm::mat4(1.0f);
//3. Shift the object to the corresponding position
model = glm::translate(model, lightPos);
//4. Scale the matrix by multiplying it with glm::vec3(0.5, 0.5, 0.5)
model = glm::scale(model, glm::vec3(0.5f)); 
//5. Set the value for the model in the shader
lampShader.setMat4("model", model);