モデル用の単純な頂点シェーダーがあります
#version 330
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec3 VertexNormal;
layout(location = 2) in vec2 VertexUV;
out VS_GS_VERTEX
{
vec3 vs_worldpos;
vec3 vs_normal;
vec2 VertexUV;
} vertex_out;
uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
uniform mat4 lookAtMatrix;
void main(void)
{
mat4 MVP = projectionMatrix * lookAtMatrix * modelMatrix;
gl_Position = MVP * vec4(VertexPosition, 1.0);
gl_Normal = mat3(modelMatrix) * VertexNormal;
vertex_out.vs_worldpos = gl_Position.xyz;
vertex_out.vs_normal = gl_Normal;
vertex_out.VertexUV = VertexUV;
}
そしてそこにmodelMatrixを渡します
modelMat := MatrixMultiply(transMat, baseMat);
modelMat := MatrixMultiply(modelMat, scaleMat);
modelMat := MatrixMultiply(modelMat, rotMat);
glUniformMatrix4fv(modelMatrix_loc, 1, false, @modelMat);
ここで、transMat は配置、scaleMat は画像全体を拡大、rotMat は地形全体を回転します。
baseMat が地形上のモデルの座標である間はすべて問題ありません
baseMat := CreateTranslationMatrix(AffineVectorMake(pos.x, pos.y, pos.z));
しかし、自分のモデルのスケールでモデルを拡大しようとすると (モデルにはゼロベースの座標があります。たとえば、(0, 0, 0) のツリーのルート)
scMat := CreateScaleMatrix(AffineVectorMake(scale, scale, scale));
trMat := CreateTranslationMatrix(AffineVectorMake(pos.x, pos.y, pos.z));
baseMat := MatrixMultiply(scMat, trMat);
モデルは拡大されるだけでなく、座標も変更され、地形上に配置されなくなります。モデルのスケーリング、回転、平行移動、さらに別の平行移動、スケーリング、回転を使用して 1 つのモデル マトリックスを作成することは可能ですか? それとも私は何か他のことをすべきですか?とからの行列演算はGLScene
正常に動作するようです。
編集:私proper order
はこれを持っているので、最初にスケーリングすることによってマトリックスで使用することはできません
地形の構造は 64x64 チャンクのタイルで、それぞれにベース座標があります。それをまとめるには、最初に各チャンクを適切な位置に変換し、次にスケーリングして画像を拡大し、マウスで回転させる必要があります。各モデルには、地形に割り当てられた絶対位置もあります。モデル (自分のモデルの修飾子) をスケーリングおよび回転し、地形上の適切な位置に配置する必要があります。transMat
(タイルとモデルを画面の中央に配置するため)、地形とモデルの両方で共有されますscaleMat
。rotMat
しかし、ローカルscMat
でありtrMat
、モデルを拡大して適切な場所に配置するためのものです。
地形をそのままにしておきますrotMat * scaleMat * transMat
が、モデルを使用するとrotMat * transMat * trMat * scaleMat * scMat
、これ
が少し近くなります
Edit2 : 頂点シェーダーを
uniform mat4 modelMatrix;
uniform mat4 MVP;
void main(void)
{
vec4 modelPos = modelMatrix * vec4(VertexPosition, 1.0);
gl_Position = MVP * modelPos;
gl_Normal = mat3(modelMatrix) * VertexNormal;
vertex_out.vs_worldpos = gl_Position.xyz;
vertex_out.vs_normal = gl_Normal;
vertex_out.VertexUV = VertexUV;
}
そして合格
modelMatrix = modelRotMat * modelScaleMat;
mvpMatrix = projMat * lookAtMat * rotMat * scaleMat * modelTransMat * transNat;
今では期待どおりに動作します。助けてくれてありがとう。