Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-10-05

glMatrix.js はイケてない

15:35

WebGL 用の行列ライブラリは、古くは一般用途の Sylvester とかがあり、もっと WebGL に特化したものとして CanvasMatrix とか mjs とか glMatrix.js とかが出来た。Learning WebGL というサイトのサンプルでは昔は Sylvester が使われてて、最近 glMatrix で書きなおされた。

そういうこともあって初心者の自分は glMatrix を使ってたんだけど、どうも使いにくい。glMatrix のメソッドは、最後の引数にベクトルや行列を与えると計算結果を代入してくれることになってるんだけど、最後の引数を省略すると、最初の引数の行列に上書きされたりする。

vec3.add = function(vec, vec2, dest) {
        if(!dest || vec == dest) {
                vec[0] += vec2[0];
                vec[1] += vec2[1];
                vec[2] += vec2[2];
                return vec;
        }
        
        dest[0] = vec[0] + vec2[0];
        dest[1] = vec[1] + vec2[1];
        dest[2] = vec[2] + vec2[2];
        return dest;
};

こんな感じで。この挙動のせいで、うっかり引数を渡し忘れたりすると知らない間に行列が変わってておかしなことになったりする。

var a = vec3.create([1, 0, 0]);
var b = vec3.scale(a, 5); // ←ここで実は a が変わってる

これにハマってしまうとほんと気づきにくい。他にも mat4.multiplyVec3 というメソッドだと第一引数は mat4 なのに書き換えられるのは第二匹数の vec3 だったりするし、mat4.identity という単位行列を返してくれるメソッドに引数なし版が無いのもイケてない(mat4.create しないといけない)。

使った中では、Google Closure Library の vec というやつのほうが良かった。上みたいな不満はまったく無い。Closure Library はファイルが分かれてるのがうざいんだけど。

↑例えば mat4.js と matrix4.js があってドユコト?って感じだし。(mat4 は matrix4 を他の名前に合わせただけみたい)

一応ベンチマークだと Closure のやつが一番いいスコアを出してるみたいだった。

f:id:edvakf:20111005151354p:image


続き→http://javascript.g.hatena.ne.jp/edvakf/20111006/1317905394

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20111005
 |