« 2013年01月 | メイン | 2013年03月 »

2013年02月 アーカイブ

2013年02月03日

Safariで複数のURLを一度に開く方法

MacのSafariで、テキスト表示されている50個くらいの写真のURLを、全て一発で開きたいと思ったが、適当な方法がすぐにわからなかった。

筆者はWindows XPではLunascapeを愛用しており、Lunascapeでは、メニューバーにある「クリップボードで開く」を実行すると、クリップボードに複数のURLが含まれていれば全て抽出して開いてくれるので、造作もないことである。

URLの先が全てJPEGファイル等の画像ファイルであれば、それら全てを<img>タグで表示するHTMLを作るという手があるが、今回はURLの先が全てHTMLファイルであった。

そういえば、Internet Explorerならどうするんだろう、と探してみたら、わからなかった。通常のWebブラウザーでは無理なのか…と思ったが、しつこく探してみたら、いい方法が見つかった。

1. メニューバーから「ブックマーク」→「全てのブックマークを表示」
2. 「ブックマークフォルダを追加」
3. URLを含むテキストをコピー
4. 追加したブックマークフォルダを開いて(フォルダーアイコンの横の三角が下向きの状態にして)ペースト
→ テキストに含まれる全てのURLがフォルダーに追加される
5. フォルダーのサブメニュー(右クリックやトラックパッドに指2本タッチ+クリック) から「すべてをタブで開く」

続きを読む "Safariで複数のURLを一度に開く方法" »

2013年02月21日

GLUTでOpenGLしてみた

Java3Dには何の不満も無いのだが、Mac OS Xには初めからGLUTが入っていることを知ったので、ちょっと、OpenGLも試しておくことにした。

・ソースコード
polygon_sphere_test1.c

・コンパイル方法の例
Mac OS X 10.7.5で成功したコマンド

gcc -framework OpenGL -framework GLUT polygon_sphere_test1.c

FreeBSD 7.3 + libGL7.4.4 + libglut-7.4.4 で成功したコマンド

gcc -g polygon_sphere_test1.c `pkg-config --cflags --libs glut`

・実行画面

球面の1/8を均等な三角形に分ける方法で球のポリゴンを作成したものである。
マウスでドラッグすると球がその方向に回転し、ボタンを離すと逆方向に少し回転して止まる。
Sキーで、ワイヤーフレーム表示と塗り潰し表示が切り替わる。

回転軸の合成と、ポリゴンの頂点座標の算出に用いる球面線形補間(Slerp: Spherical linear interpolation)には、クォータニオンを使っている。クォータニオンの演算やSlerp等については、参考になる多数のwebページがあるので、説明を省く。GLUTやGLUにはクォータニオンに関する関数が見つからなかったので、適当に作った。特殊なことはしていないと思う。

ドラッグによる回転は、クリックした位置に半径1のトラックボールが接しているような感じに、トラックボールの中心からクリック位置へのベクトル(x,y,-1)とドラッグ先のベクトル(x',y',-1)との外積を回転軸として行っている。カーソル位置に表示されている球面上の座標を求めるのと比べるとかなり手抜きな方法であるが、まあまあそれらしく動いているので良しとする。

描画の度に全ポリゴンの頂点座標を再計算してVertex3dコマンドで転送しており、とても効率が悪い。VAOやVBOを使って頂点データを保存しておくか、せめてGenLists, NewList(GL_COMPILE)を使ってコンパイルしておきたかったが、1つのシンプルな実装例として、一旦公開することにした。

続きを読む "GLUTでOpenGLしてみた" »

2013年02月25日

OpenGLのVAOを使ってみた

前回のコードは、一連のコマンドのコンパイルもせず、vertex arrayやbuffer objectも使わずに、描画の度に毎回大量の命令を行っており、大変非効率なので、vertex arrayを使って少しマシにする。

・ソースコード
polygon_sphere_test2.c

・コンパイル方法
前のエントリー参照

・実行画面

※今回は処理負荷軽減が主旨であり、ポリゴンの各頂点を使い回すため、各頂点の法線ベクトルは頂点座標と同じ値にしているので、表面が前回よりツルツルになっている。

Vertex array初体験の筆者にとっては、vertex arrayとbuffer objectとvertex array object(VAO)の関係がややこしい。今週理解した限りでは、おそらく、次のような感じだと思う。


Vertex array
頂点座標データを含む配列。"Vertex"と言いながら、頂点の法線ベクトルや頂点の色情報やテクスチャーの座標データなど、いくつかの決められた種類のデータをvertex arrayにすることができる。データの種類と、種類によっては1要素当たりのバイト数を指定して使う。

Buffer object
H/Wが直接アクセス可能なメモリ領域に置くことができるオブジェクト。任意のデータを含めることができる。Vertex arrayを入れることもできる。
Vertex buffer object(VBO)はvertex arrayを入れたbuffer objectのこと。

Vertex array object(VAO)
各vertex arrayの実データの位置(buffer object内でも良い)と状態を保存するオブジェクト。これにより、複数のvertex arrayとbuffer objectを一発で切り替えることが可能になる。OpenGL 3.0以降で標準サポートされているが、それ以前のバージョンの環境やOpenGL ES 1.1の環境でも拡張I/Fとしてサポートされていることが多い。

今回、一旦VAOやVBOを使わずにglVertexPointer()等のvertex arrayのI/Fだけを使ってglVertex3d()やglNormal3d()の嵐を解消したが、いかにも中途半端な感じになった。負荷軽減の目的ならVBOを使わないと意味が無く、VAOが使えるならその方がすっきりするので、結局、頂点座標と法線ベクトルをVBOにしてVAOにまとめた。

glDrawElements()を使うには頂点のインデックスの配列(element array)(vertex arrayの文脈ではindex arrayは色番号の配列のことなので別物) が必要で、どうも頂点のインデックスの配列はVAOに登録できないようなので、glDrawElements()を使うにはglBindVertexArray()するのとは別に、 glBindBuffer()で頂点のインデックスの配列を有効にすることが必要になるようだ(上記ソースコードのdrawSphere()参照)。
なので、座標も法線も全く同じ頂点を使い回さないなら、glDrawElements()でなくglDrawArrays()を使う方がすっきりすると思ったが、連続平面ならポリゴンの各頂点を3回使うのが普通だろうと思い直して、やっぱりVAO+element arrayのbuffer objectという構成にした。

続きを読む "OpenGLのVAOを使ってみた" »

About 2013年02月

2013年02月にブログ「Weblog on mebius.tokaichiba.jp」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2013年01月です。

次のアーカイブは2013年03月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35