2012年度 学術交流支援資金 報告書

外国語電子教材作成支援

メディア技術基礎(3Dプログラミング)

環境情報学部 准教授 脇田玲

1. 教材作成の背景

ここ数年で3Dプログラミングの世界では表現のパラダイムシフトが起きている。多くのマシンにGPU(Graphics Processing Unit)が搭載され、マルチコアのCPUも一般的になりつつある。ノートブックでも4GB程度のメモリが一般的になり、これまでにない高速な計算が可能になった。それに伴い、これまでリアルタイムグラフィクスで扱うには計算負荷が高かった数値流体力学、剛体力学、数十万ものパーティクル表現、プログラマブルシェーダ等がリアルタイムの3Dプログラミングで扱われる機会が増えている。 このような新しいリアルタイム3Dプログラミングの教材はほとんどが熟練したプログラマを対象としており、おいそれと手を出せるような代物ではない。一方でこれらの出力結果はデジタルメディアの表現として非常に魅力的なものであり、CAD/CGのシステム開発での利用はもちろんのこと、インタラクティブメディアやアート作品の制作にもおおいに利用できるものである。つまり多くの学生にとって有用であり、需要もあると考えるべきだろう。 しかしながら、現状の学生向けリアルタイム3Dプログラミング教材の多くは、一昔前のPCのハードウェアを対象にしたものが多い。具体的には、OpenGLの基本仕様に基づいた言語仕様しか扱っておらず、現実感の低いグーローのシェーディングモデルに基づいた表現しか学ぶ事ができない。また、物理シミュレーションに基づく表現力の高いアニメーションや、GPU/OpenCL対応という現在のプログラミングパラダイムにも追いついていない。 プログラムの基礎を理解した学生が前述したような現代的なリアルタイム3Dプログラミングを効果的に学べる電子教材が強く求められている。

2. 課題の内容

そこで本研究では現代的なハードウェアの進歩に伴った教材を作成する。 開発環境はopenFrameworksとC++を用い、物理シミュレーション、群衆モデル、ハードウェアアクセラレーション、等を題材にした。 教材の前半ではXCodeの使い方、OpenGLとGLUTの基礎を学ぶ。 並行して四元数などの数学的ツールを学び、グラフィクスと数理の足腰を鍛えることを目指した。 後半では、openFrameworksを用いて、物理シミュレーション、群衆モデル、GPUの使い方などを学ぶ。

3. 教材の中身

第一回 環境構築
XCodeのインストール
	Snow leopard -> 3.2.6
	Lion -> 4.3.3
openFrameworksのインストール
	ダウンロード
openFrameworksの準備。Xcodeの使い方
	oFサンプルのコンパイルを通して
	VBO, shader,の利用チェック


第1回の環境設定でコンパイルされるテクスチャマッピングとライティングを多用したサンプル。



図:第1回の環境設定でコンパイルされるシェーダーのチェックプログラム。


第二回 Hello World
	XCodeの使い方(新規プロジェクトの作成)
	OpenGL入門
		OpenGL Frameworkの利用
		GLUT Frameworkの利用
		ウインドウの描画
		カラーバッファの初期化
		直線の描画
	演習:円を描画してみよう
	コールバック関数
	ウインドウのコールバック関数
	マウスのコールバック関数
	キーボードのコールバック関数
	

	
第三回 Hello 3D World
	OpenGLの処理の流れ
	ビューポートってなに?
	プロジェクション行列を設定する = 視体積を設定する
		視体積ってなに?
		平行投影
		透視投影
	モデルビュー行列を設定する = 視点位置を設定する
	GLUTによる立体の描画
	デプスバッファ
	アフィン変換の適用範囲
		アフィン変換の演算順
		アフィン変換のまとめ



第四回 四元数(クォータニオン)
	OpenGL + C/C++ でクォータニオンによる回転を実装する(数式編)
	クォータニオンってなに?
	鏡映変換ってなに?
	クォータニオンの演算法則
	共役なクォータニオン
	クォータニオンの積 1(計算してみよう)
	クォータニオンの積 2
	クォータニオンの積の順番
	クォータニオンで鏡映変換
	クォータニオンで鏡映変換×2
	クォータニオンによる回転
	まとめ
		クォータニオンの表し方
		クォータニオンの積
		共役なクォータニオン
		クォータニオンによる回転
	課題
		OpenGL + C/C++ でクォータニオンによる回転を実装する(準備編)
		クォータニオンの積の実装(OpenGL + C/C++)
		3次元ベクトルの正規化の実装
		3次元ベクトルの外積の実装
		カメラの情報を用意する

第五回 オブジェクト指向プログラミング
	クラス
	3次元ベクトルクラスを作ろう
	プロパティ
	コンストラクタ
	サンプルソースコード
	メソッド
	演算子のオーバーロード
	サンプルソースコード
	セッターの実装
	正規化の実装
	エラーの対処法
	3次元ベクトルクラスを(Quaternionによる回転)に、追加実装してみよう
		カメラの位置を3次元ベクトルクラスに書き直す
		カメラの上向きベクトルを3次元ベクトルに書き直す
		3次元ベクトルの関数を消す
		gluLookAtの引数を書き直す
		回転軸ベクトルの宣言を書き直す
		マウスクリック時のカメラの位置ベクトル R を書き直す
		マウスクリック時のカメラの上向きベクトル C を書き直す
		回転ベクトル U の取得部分を書き直す
		カメラの位置ベクトルを虚数部としたクォータニオンを作る部分を書き直す
		回転軸を U 、回転角度 theta_u のクォータニオンを作る部分を書き直す
		Qの共役なクォータニオンを作る部分を書き直す
		カメラの位置に代入する部分を書き直す
	Quaternion クラスの実装
	
第六回 ボイドシミュレーション
	ボイドシミュレーション
	パーティクル
	パーティクルクラスの作成
	パーティクルクラスを使ってみよう
	ボイドシミュレーション
	ローカルスペース
	

第六回の学生の作品

第七回 Hello openFrameworks
	プロジェクトの新規作成
		1. emptyプロジェクトをコピーする
		2. 自分のプロジェクトフォルダを作る
		3. emptyExample を media3D フォルダにペーストする
		4. XCodeプロジェクトを開く
		5. 実行してみる
	実行出来ない方
	コールバック関数の紹介
		setupメソッド
		update / draw メソッド
		keyPressed / keyReleased メソッド
		mouseMoved / mouseDragged / mousePressed / mouseReleased メソッド
		windowResized メソッド
	はじめての openFrameworks (3次元プログラミング版)
		初期設定
		3次元形状の描画
			直線を描画しよう
			原点を画面の中央に移動しよう
			色を変えてみよう
			直線を描画しよう(OpenGL編)
			色を変えてみよう(OpenGL編)
		カメラを設定しよう
			カメラクラス
			カメラの距離を設定する
			カメラを描画処理に追加する
		サンプルソースコード
			矩形 - ofRect
			円 - ofCircle
			
第八回 GUI
	ofxSimpleGuiToo
	ofxSimpleGuiTooとは
	ofxSimpleGuiTooの準備
	はじめての ofxSimpleGuiToo
		0. ボタンを配置する
		1. コンボボックスを配置する
		2. スライダーを配置する
		3. トグルボタンを配置する
		


第九回 ボイドシミュレーション(oF版)
	Boid Simulation on oF (GUI編)
		ofxSimpleGuiTooのライブラリを追加
		ルールのパラメータを操作するスライダーの追加
	Boid Simulation on oF (ヴィジュアライズ編)
		Colorのプロパティを追加
		コンストラクタで初期化
		RGBを表すパラメータを考える
		RGB空間を正規化する
		RGBの因数を作る
	Boids Simulation (アドバンスドヴィジュアライズ編)
		パーティクルの描画部分を改良する
		テクスチャーの読み込み
		アルファ値とポイントスプライトを有効にして描画する



第十回 GLSL
	Introduction to GLSL (OpenGL Shadhing Language)
		レンダリングパイプライン
		GLSLの文法
			拡張子
			main関数
	Your First GLSL Shader (本編)
		バーテックスシェーダーとフラグメントシェーダーを読み込む
			1. ofShaderクラスのオブジェクトを準備する
			2. バーテックスシェーダーとフラグメントシェーダーを読み込む
		バーテックスシェーダーとフラグメントシェーダーを適用する
			実行できない方
		Qualifier
			組み込み変数
	グーローシェーディング
		環境光(AMBIENT)
		拡散反射光(DIFFUSE)
		鏡面反射光(SPECULAR)
		完成
	フォンシェーディング
		バーテックスシェーダー - Phong.vert
		フラグメントシェーダー - Phong.frag 


第十一回 物理シミュレーション
	ofxBulletとは
	はじめてのofxBullet
	球体を追加する
	光源を追加する
	動的に物体を追加する
	外力を加える
	
第十二回 GPU
	VBO(Vertex Buffer Object)の利用
		ofVBOで頂点を描画してみよう
		ofVboで頂点の色を変更してみよう
		ofVboで面を描画してみよう



第十三回 Arduino
	フォトレジスタ
	回路図
	Arduino
	Ardiuno に Standard Firmata を書き込む
	準備編
		ローレンツアトラクターのクラスの準備
		カメラの準備
	Arduino と接続する
	Arduino を初期化する
	Arduino を更新する
	描画

4. 議論

最後まで講義に参加していた学生からは近年稀に見る本格的なプログラミング講義であるとの声を多くもらった。 一方で、講義の初期で半分以上の学生が脱落してしまったことは検討が必要である。 これはXCodeのインストール作業が多くの履修者にとって高いハードルとなっていると考えられる。 こればかりは本人の精神力と情報処理教育の初期段階のカリキュラムに委譲せざるを得ず、本講義としては手を出しようがない。 個々の科目の教材を充実すること以前に、根本的な情報処理教育の改善が必要であることは言うまでもない。