2016-06-19 20 views
0

私は現在、ゲームエンジンのビルボードシェーダを作成しています。このシェーダのクワッドの回転をリセットしたいとします。私はGLSLシェーダプログラミングよ、ここで頂点シェーダです:回転行列の1軸を変更する方法は?

#version 400 core 

layout (location = 0) in vec3 in_position; 
layout (location = 1) in vec2 in_texcoords; 

out data 
{ 
    vec2 tex_coords; 
} vs_out; 

uniform mat4 pr_matrix; 
uniform mat4 ml_matrix = mat4(1.0); 
uniform mat4 vw_matrix = mat4(1.0); 

void main() 
{ 
    gl_Position = pr_matrix * vw_matrix * ml_matrix * vec4(in_position, 1.0); 
    vs_out.tex_coords = in_texcoords; 
} 

私は

1 0 0 
0 1 0 
0 0 1 

に左上を設定することにより、モデル行列の回転をリセットすることができることを知っているが、今クワッドをx軸とz軸の周りで回転できるようにしたいが、y軸の周りには回転させたくない。行列の回転を1つの軸でのみリセットする方法を知っている人はいますか?

答えて

0

これは参考になる可能性があります。 SolutionはGLSLに移植されている以外は解決された回転行列を使用します。三角関数(cos/sin)をリサイクルするかどうかによって、回転行列のバージョンがさまざまです。 GFXはSIMDでより優れているので、この関数はそれに関してコード化されています。

mat4 rotationMatrix(vec3 axis, float angle) 
{ 
    axis = normalize(axis); 
    float s = sin(angle); 
    float c = cos(angle); 
    float oc = 1.0 - c; 

    return mat4(oc * axis.x * axis.x + c,   oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, 
       oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c,   oc * axis.y * axis.z - axis.x * s, 0.0, 
       oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c,   0.0, 
       0.0,        0.0,        0.0,        1.0); 
} 

出典:あなたの答えのためのhttp://www.neilmendoza.com/glsl-rotation-about-an-arbitrary-axis/

+0

おかげで、しかし、あなたが0にy軸周りのオイラー角を設定する方法を知っていますか?あなたが探しているものだから:/ – RagingRabbit

+0

@RagingRabbit:Y軸の逆数だけ乗算して、その特定の回転を元に戻すことはできますか? – namar0x0309

+0

いいえ、私は変換行列しか得ていないので、すべての軸で回転します。 – RagingRabbit

関連する問題