Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-10-06

glMatrix.js がイケてないので…

21:49

closure を使おうと思ったんだけど、こっちも使えば使うほど不満が出てきた。結局一長一短。

なので、このまま glMatrix を使うことにして、冗長に書かざるを得なかった部分をラップすることにした。関数呼び出しは増えることになるけどコードはスッキリする。

例えば

var iden = mat4.create();
mat4.identity(iden);

// もしくは

var iden = mat4.identity(mat4.create());

//とか書いてたところを

var iden = mat4.createIdentity();

にするとか、

// myMatrix をある方向に移動させたいときに
var translation = mat4.create();
mat4.identity(translation);
mat4.translate(translation, [0, 10, 0]);
mat4.multiply(translation, myMatrix, myMatrix);

// と書かざるを得なかったところを

mat4.applyTranslate(myMatrix, [0, 10, 0]);

と書けるようにするとか、はたまた、

// myPoint を X 軸まわりに回転させたいときに
var rotationMatrix = mat4.create();
mat4.rotateX(rotationMatrix, angle);
mat4.multiplyVec3(rotationMatrix, myPoint);

// だったところを

vec3.rotateX(myPoint, angle);

と書けるようにするとか。

↓こんな感じ。(全部ではない。また不満が増えたら付け足していくつもり)

// utility for glMatrix
mat4.createIdentity = function() {
  return mat4.identity(mat4.create());
};

mat4.createMultiply = function(a, b) {
  return mat4.multiply(a, b, mat4.create());
};

mat4.inverseTranspose = function(mat, dest) {
  if (!dest || mat == dest) {
    return mat4.transpose(mat4.inverse(mat));
  }
  return mat4.transpose(mat4.inverse(mat, dest));
};

mat4.applyScale = function(mat, vec) {
  var scaling = mat4.scale(mat4.identity(mat4.create()), vec);
  return mat4.multiply(scaling, mat, mat);
};

mat4.applyTranslate = function(mat, vec) {
  var translation = mat4.translate(mat4.identity(mat4.create()), vec);
  return mat4.multiply(translation, mat, mat);
};

vec3.moveBy = vec3.add;

vec3.rotateX = function(vec, angle, dest) {
  var rotation = mat4.rotateX(mat4.identity(mat4.create()), angle);
  return mat4.multiplyVec3(rotation, vec, dest);
};

vec3.rotateY = function(vec, angle, dest) {
  var rotation = mat4.rotateY(mat4.identity(mat4.create()), angle);
  return mat4.multiplyVec3(rotation, vec, dest);
};

vec3.createNormalize = function(vec) {
  return vec3.normalize(vec3.create(vec));
};

vec3.lengthBetween = function(a, b) {
  return vec3.length([a[0] - b[0], a[1] - b[1], a[2] - b[2]]);
};

もっと言うと、新しい行列などを作るときは create*** という名前にする、破壊的なものは apply*** にするなどの規則を徹底すれば glMatrix はかなり良くなるのではないかと思った。

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