memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Processing2.0a4で"com.sun.opengl" does not existというエラーが出る件について(MSAFluid)

MSAFluidで遊んだエントリーに対して動かないというコメントをいただきました。

気になり私も調べてみました。ずいぶん前の話しなので忘れていますが。。。

確かに、私が当時に作ったプログラムで動かないものがいくつかありました。

エラーは「The package "com.sun.opengl" does not exist」っていうやつですね。付属するサンプルプログラム「MSAFluidDemo」も同様のエラーでした。

環境のせいだと思いJava周りを調べてみましたが、Prcoessingはもともとlibrary(JOGL)が入っているはずなので何もしなくても動くはず。。。

ってことはProcessing自体(標準ライブラリ)に問題がある?ということで1.5.1をダウンロードして動かしてみると「MSAFluidDemo」が問題なく動きました。私のもです。

違いは何か?
/Applications/Processing.app/Contents/Resources/Java/modes/java/libraries/opengl
以下の内容が1.5.1と2.0a4とでは異なります。

単純に上記のディレクトリを入れ替えてみましたが、processing.core.PGraphics3Dに依存しているというエラーが表示されました。AndroidやProcessing.jsに対応したときに、プラットフォーム共通のライブラリ化しようとしてテストから漏れたのか、そもそも使い方が変わったのか?かもしれません。

もう少し追ってみないとわかりませんが、core.jarを再構築する必要があるのだとすると一般人にはできませんので、とりあえずの解決策としては1.5.1を使うしかないと思います。

もし、2.0に依存したコードを書く必要があるのであれば。。。Processing Forumに書いてお願いするかですかね。

追記

jogl.jarの内容を比較してみましたら。。。パッケージがcom.sun.openglからcom.jogamp.openglに変更されているようですね。管理元が変わったのですね。openglに詳しい方ならご存知かと。ただ「import com.sun.opengl.util.*」を「import com.jogamp.opengl.util.*」に変更してもエラー「glColor3fが存在しない」は変わりません。調べるとこのメソッドが無くなった。。。?ようでもあります。使い方を変えなければならないのでしょうかね?

追記

なんか釈然としなかったので、もう少し調べてみました。結果的にはライブラリが変わったのでコードを変えなければならない、ということがわかりました。GLではなくGL2が標準になったのではないかと思います。これもOpenGLを追いかけている人には当たり前のことなのでしょう。

で、GL2で動作するようにMSAFluidのサンプルを書き換えてみました。主な変更点は以下です。以下に動いたソースのリンクを貼り付けましたので必要であればご利用ください。

(1)「GL gl = pgl.beginGL();」を「GL2 gl = pgl.beginGL().getGL2();」に書き換え。

(2)GLをGL2にしたのでメソッド引数の型をGLからGL2にする。定数も一部はGLではダメらしいのでGL2に置き換える。

(3)「BufferUtils.newFloatBuffer」がないので「Buffers.newDirectFloatBuffer」に書き換え。「import com.jogamp.common.nio.Buffers;」を追加する。

GLとGL2が混在していますが(クラス構造を追いかけるのが面倒なので)エラーが出ないのでこれでとりあえずヨシとします。

Link: サンプルプログラム(MSAFluidDemo)