ある直方体のxyzそれぞれの軸方向の方向ベクトルを行列で変換するプログラムを書きました。(ここでいう変換とは、拡大縮小、回転、平行移動の意味です。)
#####方向ベクトルの位置が動的に変わる場合、変換行列などを該当ベクトルにそのまま乗算することで変化するべき方向ベクトルを算出するという考えは正しいでしょうか?
下図で青線で書かれたAfterの各軸方向の方向ベクトルを算出することが理想です。
(※OpenGLを考慮してるのでYとZを逆として考えてください。z軸に2.0拡大->y軸に2.0拡大)
c++
1#inckude <vector> 2#include <glm/glm.hpp> 3#include <glm/gtx/euler_angles.hpp> 4using namespace glm; 5 6void a(mat4 &Trans, mat4 &Rotate, mat4 &Scale){ 7 8 // 各軸方向の方向ベクトルを1.0X1.0X1.0の立方体と仮定して初期化する 9 std::vector<vec3> i_Dir = { 10 vec3(1.0f,0.0f,0.0f), // ベクトルX軸方向 11 vec3(0.0f,1.0f,0.0f), // ベクトルY軸方向 12 vec3(0.0f,0.0f,1.0f) // ベクトルZ軸方向 13 }; 14 15 // 各方向ベクトルの変化後を算出するために行列を方向ベクトルにかけてみる 16 // 順番は回転 -> 拡大 -> 移動の順番 17 for (int i=0; i<i_Dir.size(); i++){ 18 vec4 m_Dir[i] = Scale * // 回転行列 19 Rotate * // 拡大縮小行列 20 Trans * // 平行移動行列 21 vec4(i_Dir[i], 1.0f); // とあるベクトル 22 23 // 方向ベクトルには回転拡大移動の全ての行列が位置変換として必要に 24 // なるのではないかと考えているため上記の式を作っている 25 // しかし本当に上の式で正しいのかがわからない 26 27 } 28 29} 30 31int main() 32{ 33 // 変化の割合を示した3つの行列 34 mat4 T = translate(mat4(1.0f), 0.0f,0.0f,1.0f); 35 mat4 R = eulerAngleYXZ(0.0f,0.5f,0.0f); 36 mat4 S = scale(mat4(1.0f), 1.0f,1.0f,2.0f); 37 38 // 実行してみる 39 a(T,R,S); 40} 41
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/16 01:33 編集
2019/01/16 02:43
2019/01/30 06:43