Skip to content.

Sections
Personal tools
You are here: Home » ダウンロード » vecmath package(日)

Document Actions

unficial Java3 vecmath package

by Kenji Hiranabe(since 11/27,1997)

[English version available]


Java(TM) 3D API 1.2 で仕様が公開されている,javax.vecmath パッケージの,非公式な実装(java ソースコード)です.
このパッケージには,3次元の点,ベクトル,4次元のベクトル,4x4, 3x3 行列,Quaternion, 回転軸と角度の組合せなどなど,コンピュータグラフィックス でよく使われるクラスを含んでいます.ほとんどのクラスは,単精度と倍精度のバージョンがあります.一般の行列の LU 分解や SVD も実装されています.

フリーソフトウェアです.AS IS ベースで提供され,保証は一切ありません.バグレポートやコメントを歓迎します.

この実装は,Java3D API 1.2 に基づくものです.ここで提供されている Java 実装は,この全仕様をサポートし,ソースコード公開です. また,vecmath API に関する代数と幾何の基礎を,日本語ドキュメントとしてまとめました.

Download API 1.2 Java(tm)

C++ port

NEWNow supports Visual C++ 6.0

javax.vecmath を C++ に移植することにしました.vecmath の仕様がユニークであるため,高速な平行 C++ バージョンが作成できる,と考えたからです. Java3D vecmath のデザインは,

  1. すべてのメンバ変数が 'public' である.
  2. すべてのメソッド(メンバ関数)が 'final' (non-virtual) である.
  3. Matrix や Vector 中に,配列の表現を持たない.
  4. Point と Vector が別クラスとして区別されている.

という特徴があります.(1)-(3)の設計は,もともと Java の速度上の問題から決定されたと思われます.(1) はオブジェクト指向的にあるいはスレッド セーフ的に良くないスタイルのように見えますが,必要であれば上位でカプセル化することができます(実際 Java3D の SceneGraph ではラッパを作っています). (2) はサブクラス化の際に問題になるかもしれませんが,1つ1つのメソッドが明確で自然な仕事をしているため,セマンティクスの一貫性は保たれるでしょう. (3)は for/while ループと添字による要素アクセスがないため,ライブラリコードの増大をもたらす可能性があります.しかし実際に実装してみるとそうでもないことに気付きました.また,これがこのライブラリの最大の特徴である速度を稼ぐポイントとなっています.また,(4) はとてもよい設計判断だったと思います.コードがセマンティクス的に一貫し,可読性も向上します.

幸運なことに,上記の4つの点は,この C++ 版バージョンをとてもユニークなものにしています.速度に最高のプライオリティを置いているのです.すなわち, 仮想関数呼び出しがなく,new 演算子がなく,inline 化された template をヘビーに使用し,メンバは public で,かつ,各メソッド中の数値計算はパラフレーズされています(ループや配列要素への添字によるアクセスが皆無です).

たとえば,Matrix は配列表現を内部にもたないため,Matrix3 の中では次のようなコーディングがされています.

template < class T >
T Matrix3 < T >::determinant() const {
    // I believe this is the fastest way, less calculation and no indexing.
    return m00*(m11*m22 - m21*m12)
        - m01*(m10*m22 - m20*m12)
        + m02*(m10*m21 - m20*m11);
}

もちろん,この C++ バージョンには欠点もあります.

  • 要素への添字付けアクセスが遅い.

'operatoer[]' は意図的にサポートしませんでした.これを使用したユーザプログラム は速度の問題を起こす可能性があるからです.

     // a bad user program
     Vector3d u(1,2,3), v;
     Matrix3d m(1,2,3,4,5,6,7,8,9);

     //  'cause this can be very slow
     for (unsigned i = 0; i < 3; i++)
        for (unsigned j = 0; j < 3; j++)
            v[i] = m(i,j)*u[j];

このようなシンタクスはサポートしてもよかったのですが,むしろ,名前の付いたメソッドを使ったほうがよいのです.

     m.transform(u, &v);    // much faster.

         or

     v = m*u;               // others like this style better.

これらは,ずっと高速で,かつ読みやすいものです.ユーザープログラムでは,要素を直接アクセスする必要はほとんどないように多数のメソッドが用意されていますので,そちらを使うように心がけるべきでしょう.

その他,以下の特徴があります.

  • すべてのコードが *.h ファイルにあります.ライブラリのコンパイルの必要がありません.これらのファイルを配置して,インクルードするだけですぐに使用できます.
  • "vm_conf.h" をカスタマイズすることによって,io サポート < iostream >を付けたり外したりできます.
        Matrix3 m();
        cout << m;
    
  • "vm_conf.h" をカスタマイズすることによって, string サポート < string >を付けたり外したりできます.
        string s = m.toString();
    
    これらの io/string サポートを意図的に外すことによって,コンパクトなバージョンを生成するとともにコンパイル時のインクルードファイルの数が減らせます.
  • すべてのクラスは,'hashCode' メソッドを持ち,VmHash というクラスも別に用意されています.これは,SGI の STL(Standard Template Library) に含まれる hash_map などのコンテナにオブジェクトを格納するときに便利です.

Download API 1.2 C++ port

Links


[Feedback]
* Mail to: hiranabe@esm.co.jp