asaのブログ

プログラミングの勉強まとめ

JOGL‐マウスでお絵描き

 JOGLで簡単なマウスによるお絵描きを実装します。

 今回の流れは大体次のとおりです。

  1.  JOGLの環境構築
  2.  キャンバスに点を打つ
  3.  マウスイベントを受け取る
  4.  問題点
  5.  参考資料の紹介

 

 1. JOGLの環境構築

  筆者はNetbeansでJOGLを利用しています。外部ライブラリとしてJOGLを利用する

 方法は次のリンクを参考にして下さい。

  NetbeansでJOGL環境の構築 - asaのブログ

 

 2. キャンバスに点を打つ

  描画に必要なキャンバスを準備します。基本的な構成はGLEventListenerを実装したクラスだけを使います。クラスの内容はコンストラクタとOverrideしなくてはならない" init ", " reshape ", " display "," dipose "の4つのメソッドです。

 

 コンストラクタでJFrameとGLCanvasを生成して、JFrameにGLCanvasを埋め込みます。

 

 initメソッドにはCanvasの初期表示を指定してやります。点を打つ操作をdisplayメソッドに書き込みます。描画はglBeginからglEndまでの間に記述し、何を描画するかはglBeginの引数で指定します。

gist370e82bbba2bc8fa2a6ba616df99f901

 点の初期サイズは1ピクセルになっているためほとんどみることができません。そこでglPointSizeメソッドを使って点を見えるサイズに指定すると次のようになります。

 

f:id:asa_r:20170531224550j:plain

 

 for文を使って点を指定した回数描画することができます。頂点座標のx座標とy座標の関係を y = a x ^2 のように表せば二次関数や三次関数を書くこともできます。

 

f:id:asa_r:20170531225115j:plain

 

 2. マウスイベントを受け取る

 マウスイベントを受け取るにはMouseAdapterを使うのが便利ですが、JOGLをSwingで使用する場合MouseAdapterでドラッグによるイベントを受け取ることができませんでした。そこでMouseMotionListenerを実装してみたところ上手く動きました。

gistf356bd2c7e3b6388e86c284ab618fe54

 実際にマウスで描いて見るとこんな感じになります。

f:id:asa_r:20170531231306j:plain

 描いて見るとドラッグした点が飛び飛びになってとても描きずらいです。この点に関してはJOGLのフォーラムでも質問があがっていました。

 jogl - GLCanvas's mouseDragged problem

  マウスをすばやく動かしたときにイベントが上手く受理されないようです・・・。

 JOGLによるOpenGL入門ではラインを使用して描画していましたが、おなじようにイベントが上手く受理されずにかなりカクカクになります。

 参考までに(描画はほとんど変わりません)。

gistb6a206450ec09ed3b9e13c9063c7c14b

 

 4. 問題点

 マウスによる描画までは上手くいきましたが、ドラッグイベントを綺麗に処理できないところが大問題です。上のフォーラムの記事を参考にするか、いっそOpenGLをJNAを使うのもありな気がしてきました。またJOGLでJpenという素晴らしいソフトを作っている方もいらっしゃる(Digital Ink with Clojure and OpenGL - Felix Breuer's Blog)のでそちらも参考にして進めていこうと思います。

 

 5. 参考文献

 描画機能を作る上で下の論文がとても参考になります。本文と関係ないですがとても参考になる資料です。

 http://www.cse.chalmers.se/~uffe/xjobb/BrushPaintingAlgorithms.pdf

 あとgoogle scolarで論文検索するとかなり素晴らしい資料がざくざく手に入ります!