「openglで作る力学 アニメーション入門」 サンプルページ ·...

38

Upload: others

Post on 23-Sep-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.
Page 2: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

「OpenGL で作る力学

アニメーション入門」

サンプルページ

この本の定価・判型などは,以下の URL からご覧いただけます.

http://www.morikita.co.jp/books/mid/084561

※このサンプルページの内容は,初版 1 刷発行時のものです.

Page 3: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.
Page 4: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

ま え が き

近年,多くの教育機関では IT(情報技術)教育の一環としてコンピュータグラフィックス(CG)をカリキュラムに組み入れています.著者が勤めていた函館工業高等専門学校情報工学科においても,情報工学実験や卒業研究に OpenGLを用いた 3次元 CGやアニメーションを取り入れてきました.情報工学実験では最初に立方体の基本立体作成から手がけ,最終的に学生自身が思い思いのアニメーションを作成できるようにしています.学生自身がコーディングしたプログラムが実行され,単純な球や立方体がモニター上に描画されただけでも感動し,思わず歓声を上げる学生もおります.プログラムによるものづくりの楽しさを実感しているようです.物体の衝突後の自然な動きや,布や髪の毛が風に揺れる様子を表現するために,物理法則に基づくアニメーションが使われます.本書は本格的な 3次元アニメーションやゲームを作成してみたいと思っている人のために,物理(とくに力学)の基礎を学びながらアニメーション作成手法を習得できるように構成してあります.なるべく力学の理論に忠実に構成したつもりですが,著者の浅学のため理論的な間違いがあるかもしれません.そのようなときは,便宜的に簡略化していると考えてください.また,故意に簡略化した部分もあります.特に第 6章の衝突判定は,物理というよりも計算幾何学の問題ですが,めり込み防止のためにきわめて簡略化した手法を用いています.本書はプログラム開発ツールとして Borland(旧 Inprise)社の C++Builderを用いています.

C++BuilderはWindowsが提供する GUI (Graphical User Interface)を簡単にフォーム上に構築でき,高速実行が可能なプログラミング環境です.これに SGI社(Silicon Graphics, Inc.)が提供するグラフィックスライブラリ OpenGLを組み込むことによって,インタラクティブなリアルタイムアニメーションを実現することができます.筆者は以前Microsoft社の Visual BasicとOpenGLを組み合わせたアニメーションシステムを構築していましたが,OpenGLを組み込むための DLL (Dynamic Link Library)を Visual C++によって構成しなければならず,煩雑なものでした.なお,Microsoft社のVisual C++ .NET2003のマネージ形式によって,C++Builderと同じ感覚でWindowsアプリケーションを作成できるようになりました.これについては付録で取りあげています.読者の中にはさまざまな目的で本書を読まれていることでしょう.物理現象の理論を理解する目的で,物理現象のシミュレーションを作成する目的で,物理法則に基づく 3DCGアニメーションを作成する目的で,あるいはプログラミングのヒントを得る目的で読まれているかも知れません.ある人にとっては難解であり,またある人にとっては物足りない内容となっています.本書のアプリケーションの内容は,市販されている各種のアプリケーションにくらべれば大変見劣りするものですが,将来この種のアプリケーションを作成したいと望んでいる読者には,入門書として役に立つものと思います.なお,本書のプログラムを理解するためには C言語および C++

i

Page 5: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

言語の知識を必要とします.校正段階の不注意で多くのミスプリントが残っているかもしれません.プログラムリストのミスプリントについては,Webサイトから入手したプログラムソースを参考にしてください.消し忘れたコメント文,必要もない変数,関数が存在するかもしれませんがご容赦願います.本書は函館工業高等専門学校情報工学科における卒業研究指導の過程で生まれたものです.

1997年度の佐藤学君,1998年度の高原大輔君,ガネサン・ベラヤサン君,1999 年度の小本さとこ君,その他多くの卒業研究生に感謝します.また,床面上の剛体の回転運動について貴重なご意見とご考察をお寄せくださった福井工業高等専門学校名誉教授守川穰様および,数式を導く上でご協力頂きました函館工業高等専門学校教授中島正美様に深謝いたします.本書の内容は以下のとおりです.第 1章 アニメーションシステム本書で展開するリアルタイムアニメーションシステムを説明しています.C++Builderによるプロジェクト構築方法と OpenGLの組み込み方,3次元 CGの基礎を学びます.「アフィン変換」と「数式に基づくアニメーション」を作成します.第 2章 質点の運動学大きさを無視できる物体(オブジェクト)を質点といいます.質点の運動を位置,速度,加速度および時間を用いて,どのような数式で表すことができるかを学びます.「等速直線運動」,「等加速度直線運動」と「等速円運動」に関するアニメーションを作成します第 3章 力と運動:運動力学運動力学を支配する法則はニュートンの運動法則です.力と質量と加速度を関係付けるニュートンの運動法則を学びます.「単振り子と円錐振り子の運動」と「摩擦や回転を考慮しない放物運動」に関するアニメーションを作成します.第 4章 抵抗力大きさのある物体(剛体)は,摩擦力や空気抵抗の影響を受けて減速します.並進運動に対する摩擦や抵抗の種類およびその数式化を学びます.「斜面上の剛体の運動」と「回転台上の剛体の運動」に関するアニメーションを作成します.第 5章 剛体の回転運動剛体の並進運動と比較しながら回転運動を説明しています.任意軸回転を実現するためにクオータニオンを導入しています.「球の転がり運動」と「空気抵抗や回転を考慮した放物運動」に関するアニメーションを作成します.第 6章 剛体の衝突リアルな運動を実現するために必要な剛体の衝突(衝突応答と衝突検出)を説明しています.

「2球による正面衝突」,「2次元平面における剛体の衝突」と「3次元空間における剛体の衝突」に関するアニメーションを作成します.第 7章 バネ振動音声や電磁波,地震波など自然界にはさまざまな振動現象がみられます.これら振動現象の基礎としてバネ振動を学びます.「床面上でのバネ振動」,「バネ振り子の運動」と「連成振り子の運

ii

Page 6: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

動」に関するアニメーションを作成します.第 8章 弾性体の運動風にはためく旗や衣服の動き,木々の枝や葉の動きを表現するには,オブジェクトを弾性体とみなします.弾性体をバネ-質点系モデルで表現する方法を学びます.「1次元弾性体」,「2次元弾性体」,「3次元弾性体」,「弾性体と剛体の衝突」に関するアニメーションを作成します.第 9章 波動シミュレーション波動を単純な数式で表現することによって,旗のはためきや水面の波動アニメーションをリアルタイムに実現できることを学びます.「1次元波動」,「2次元波動」,「ドップラー効果」,「旗のはためき」に関するアニメーションを作成します.付録A ベクトル

3次元空間において物体の運動を表現するためには,位置,速度,加速度などすべての変数について x, y, zの 3つの成分が必要です.これらを 1つの変数で表現したものがベクトルです.運動シミュレーションに必要なベクトルの定義と演算,衝突検出やマウス制御などで利用した 3D

幾何学のベクトル公式を示し,プログラミングを簡略化するために導入した CVectorクラスを説明します.付録B 行列:マトリクス剛体の回転運動を表現するために慣性モーメントというテンソル量が使われています.一階のテンソルがベクトル,二階のテンソルが行列です.行列の定義と演算,本書のプログラミングで使用した CMatrixクラスについて説明します.付録C 四元数:クオータニオン任意軸回転を実現するために四元数(クオータニオン)が必要です.クオータニオンの定義と回転操作および,CQuaternionクラスを説明します.付録D Visual C++ .NETによる 3Dアニメーションの作成

Microsoft社の Visual C++ .NET2003は C++Builderや Visual Basicと同じように,GUIを簡単にフォーム上に構築でき,柔軟性に優れたWindowsアプリケーションを作成できる開発環境です.OpenGLを組み込んだリアルタイムアニメーションシステムの作成手順とプロジェクト例を説明します.

開発環境Windowsバージョン:WindowsXP

CPU:Pentium4,3.2 GHz

メモリ:1024 MB

画面解像度:1280 × 1024ピクセル画面の色:32 ビットプログラム開発ツール:C++Builder Ver.5,Visual C++ .NET2003

iii

Page 7: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

プログラムの実行本書は,プログラム開発環境として C++Builderまたは Visual C++ .NETを用いています.これらのツールを利用できるパソコンであれば,ソースファイルを森北出版株式会社のWebサイト (http://www.morikita.co.jp/soft/84561/)からダウンロードして,ビルドすれば実行可能です.ただし,Visual C++ .NETの場合は,付録Dで述べたように,OpenGL32.LibとGlu32.Lib

を各プロジェクトに追加する必要があります.これらのツールを持っていない読者でも次のようにすれば実行可能です.C++Builderの場合は,「Builder実行ファイル」というフォルダの中に,すべての実行ファイルと実行に必要なDLLがあります.これらをダウンロードし解凍すれば実行可能です.展開された 3個のフォルダ(Builder OpenGL,Builder実行ファイル,CPPNetOpenGL)を使用しているドライブ直下 (例えば C:Y=ディレクトリ名)に移動してください.

Visual C++ .NETの場合は,Microsoft社のWebページより dotnetfx.exeをダウンロードし,実行すれば,.NET Frameworkが使用できる環境になります.「CPPNetOpenGL」フォルダの中に 2つのプロジェクトフォルダがあり,その中の「Debug」フォルダに作られている.exeファイルをダブルクリックすれば実行できるはずです.

iv

Page 8: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

目 次

第1章 アニメーションシステム ............................................................................ 1

1.1 リアルタイムアニメーション ......................................................................... 1

1.2 OpenGLの設定 .......................................................................................... 2

1.3 オブジェクトの描画 ..................................................................................... 6

1.4 アフィン変換 ............................................................................................. 11

1.5 プロジェクトの説明 .................................................................................... 14

第2章 質点の運動学 ........................................................................................... 32

2.1 直 線 運 動 ................................................................................................ 32

2.2 等速円運動 ................................................................................................ 35

2.3 ベ ク ト ル ................................................................................................ 36

2.4 オイラー法 ................................................................................................ 38

2.5 プロジェクトの説明 .................................................................................... 39

第3章 力と運動:運動力学.................................................................................. 43

3.1 ニュートンの運動法則 ................................................................................. 43

3.2 万有引力と重力 .......................................................................................... 45

3.3 円運動と向心力 .......................................................................................... 46

3.4 基本的な運動シミュレーション ..................................................................... 46

3.5 プロジェクトの説明 .................................................................................... 50

第4章 抵 抗 力............................................................................................... 54

4.1 摩 擦 力 ................................................................................................ 54

4.2 空 気 抵 抗 ................................................................................................ 58

4.3 プロジェクトの説明 .................................................................................... 59

第5章 剛体の回転運動 ........................................................................................ 64

5.1 並進運動と回転運動の物理量 ........................................................................ 64

5.2 回転運動の運動方程式 ................................................................................. 66

5.3 慣性モーメントの計算 ................................................................................. 68

5.4 転がり運動 ................................................................................................ 70

5.5 斜面上を転がり落ちる剛体 ........................................................................... 71

5.6 回転運動に対する摩擦抵抗 ........................................................................... 73

v

Page 9: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

5.7 オイラー法 ................................................................................................ 75

5.8 プロジェクトの説明 .................................................................................... 76

第6章 剛体の衝突............................................................................................... 84

6.1 衝突の物理 ................................................................................................ 84

6.2 水平面に衝突する剛体 ................................................................................. 87

6.3 剛体同士の衝突 .......................................................................................... 91

6.4 衝 突 検 出 ................................................................................................ 94

6.5 プロジェクトの説明 .................................................................................. 100

第7章 バ ネ 振 動............................................................................................. 109

7.1 単 振 動 .............................................................................................. 109

7.2 減 衰 振 動 .............................................................................................. 110

7.3 強 制 振 動 .............................................................................................. 111

7.4 直列接続のバネ ........................................................................................ 112

7.5 バネ振り子 .............................................................................................. 114

7.6 連成振り子 .............................................................................................. 117

7.7 プロジェクトの説明 .................................................................................. 118

第8章 弾性体の運動 ......................................................................................... 126

8.1 1次元バネ–質点系モデル ........................................................................... 126

8.2 2次元バネ–質点系モデル ........................................................................... 131

8.3 3次元バネ–質点系モデル ........................................................................... 134

8.4 弾性体と剛体の衝突 .................................................................................. 136

8.5 プロジェクトの説明 .................................................................................. 139

第9章 波動シミュレーション ............................................................................ 153

9.1 1次元波動 .............................................................................................. 153

9.2 水面の波動 .............................................................................................. 157

9.3 数式による旗のアニメーション ................................................................... 161

9.4 プロジェクトの説明 .................................................................................. 163

付録A ベ ク ト ル............................................................................................. 172

A.1 ベクトルの定義と演算 ............................................................................... 172

A.2 3D幾何学のベクトル公式 .......................................................................... 175

A.3 CVectorクラスの実装 ............................................................................... 178

vi

Page 10: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

付録B 行列:マトリクス ................................................................................... 183

B.1 行列の定義と演算 ..................................................................................... 183

B.2 CMatrixクラスの実装 .............................................................................. 185

付録C 四元数:クオータニオン ......................................................................... 187

C.1 クオータニオンの定義と演算 ...................................................................... 187

C.2 位置ベクトルの回転 .................................................................................. 188

C.3 姿勢に対する回転 ..................................................................................... 190

C.4 CQuaternionクラスの実装 ........................................................................ 191

付録D VisualC++ .NETによる 3Dアニメーションの作成............................. 198

D.1 VC++ .NETによるプロジェクトの構築 ...................................................... 198

D.2 プロジェクトの構成 .................................................................................. 199

D.3 プロジェクトの具体例 ............................................................................... 200

参 考 文 献 ........................................................................................................ 210

索 引 ........................................................................................................ 211

vii

Page 11: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

  

Page 12: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第1章

アニメーションシステムAnimation System

 ボールを投げたときの運動軌跡や,他の物体に衝突したときの自然な運動を表現するためには物理法則 (力学)に基づくアニメーションが不可欠です.本書は,3次元コンピュータアニメーションを用いた力学シミュレーションについて述べており,本格的な 3Dアニメーションやゲームを作成するための基礎として学ぶことを目的にしています. 力学シミュレーションについては次章から取り上げます.それに先立って本章では,本書で用いるリアルタイムアニメーションシステムの概略を説明します. プログラミング開発言語として Borland社の C++Builder を利用し,これにSGI 社 (Silicon Graphics,Inc.)が提供するグラフィックスライブラリ OpenGL

を組み込むことによってインタラクティブなリアルタイムアニメーションを実現しています.Microsoft社の Visual C++ .NETによるアプリケーションの作成については付録Dに示します. 本章では「アフィン変換」と「数式に基づくアニメーション」を作成します.

Keyword:OpenGL,モデリング,レンダリング,基本立体,視体積,透視投影,アフィン変換,スケーリング,回転,平行移動,オイラー角,カメラワーク,数式に基づくアニメーション,時間刻み

1.1 リアルタイムアニメーション

映画やビデオのように,情景が少しずつ変化する静止画像を速いスピードで続けて再生すると連続して動いているように見えます.これは人間の目の残像という生理学的特性によるものです.映画では,1秒間に 24コマ (フレーム)の割合で再生されています.なめらかに連続して見えるためには,最低でも 1秒間に 12コマが必要といわれています.映画やビデオでは,あらかじめ連続的に変化するシーンをフィルムに用意し,一定の時間間隔でそれらを表示しています.本書で扱うアニメーションは,3次元仮想空間にモデリングされたオブジェクトが時間と共にその位置や姿勢が変化したとき,そのつど新しいシーンにおけるオブジェクトの色や輝度を計算および画像化してスクリーンに表示させるリアルタイムアニメーションです.そのため,オブジェクトが複雑になり,その数も多くなると描画速度は遅くなります.

1

Page 13: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 1章 アニメーションシステム

OpenGLでは色や輝度のデータを保存するためのバッファが 2つ用意されており,それぞれフロントバッファ (表のバッファ,可視バッファ)およびバックバッファ (裏のバッファ,不可視バッファ)などと呼ばれています.描画コマンドが実行されると,バックバッファに書きこまれます.その間ユーザがスクリーン上で見ているシーンは,前回書きこまれたフロントバッファの内容です.描画処理がすべて終了すると,2つのバッファが切り替わります.もし,ダブルバッファ機能が無ければ,書き込み中のシーンを見ることになり画面がちらついたものになります.

1.2 OpenGLの設定

本書では,プログラミング開発言語として主に Borland社の C++Builderを用いています.C++Builderは RAD(Rapid Application Development)ツールと呼ばれる開発環境の一種で,直感的なプログラミングが可能であり,機能的なGUI(Graphical User Interface)を簡単に構築でき対話的なアプリケーションを作成できます.これにグラフィックスライブラリ OpenGLを組み込むことによって,インタラクティブなリアルタイムアニメーションを実現しています.本書で用いられるすべてのプロジェクトは,MainFormと SettingFormの 2個のフォームから構成されています.これらの詳しい説明は 1.5節で行います.

MainFormのクラスを定義する mainUnit.hファイル (リスト 1.1)には,OpenGLによるアニメーションを実現するための基本的な 3個のメソッド (メンバ関数)を実装しています.

1.2.1 OpenGL初期化描画ウィンドウはデバイスコンテキストのハンドル hDCによって指定します.アプリケーションが実行され MainFormが表示されたとき,最初に実行されるイベントハンドラはコンストラクタ TMainForm()です.次のコードによってパネルコンポーネント pnlSpaceのデバイスコンテキストのハンドルを取得しています (リスト 1.2の行番号 27参照).

hDC = GetDC(pnlSpace->Handle);

hDCを取得後,initOpenGL()をコールします.initOpenGL(HDC hDC)では,Win32環境でOpenGLを使用するための初期設定を行っています (リスト 1.1の行番号 125~163参照).デバイスの描画画面に関する属性であるピクセルフォーマットを作成し,レンダリングコンテキスト (RC)を生成し,デバイスコンテキスト (DC)と結合しています.デバイスコンテキストとは,モニタ画面やプリンターなどを抽象化したものです.グラフィックスデータの出力先は具体的なハードウェアでなく,デバイスコンテキストに対して行われます.レンダリングコンテキストとは,DCのOpenGL版のようなもので,OpenGL関数と DCを結びつける働きをします.ピクセルフォーマットは,デバイスの描画画面に関する属性であり,Win32では 26個のフィールドからなる PIXELFORMATDESCRIPTOR構造体で表現されます.特性フラグの PFD_DOUBLEBUFFERによって,表と裏の 2つのバッファが確保され,アニメーションが可能となります.

2

Page 14: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

1.2 OpenGLの設定

PFD_TYPE_RGBAによってRGBAカラーモードが設定され,色を 3原色 (Red,Green,Blue)

で指定します.Aはアルファ値と呼ばれ,ガラスなどの半透明物体を表現するときに使用されます.0で透明,1で不透明となります.カラービット数に 24を指定することによって RGBを各色 8ビット,すなわち 256階調で使用できるようになります.デプスバッファビット数は奥行き情報を格納するピクセル当りのビット数で,32ビットに設定しています.OpenGLでは Zバッファ法によって 3次元描画を行っており,ピクセルごとに奥行き情報を保存するバッファが必要です.これら以外の属性は,Win32ではサポートされていないか,あるいはステンシルバッファのように利用しないものは 0に設定しています.ChoosePixelFormat()によって,pfdで定義したフォーマットに最も近いデバイスのフォーマットを取得します.SetPixelFormat()によって,このフォーマットをデバイスコンテキスト(DC)にセットします.wglCreateContext()でレンダリングコンテキストを生成し,そのハンドルをwglMakeCurrent()

によってDCと結合します.ハンドルとは,DCとRCを識別するための値のことです.OpenGL

で作成したグラフィックスを表示するためには,あらかじめ DCと RCのハンドルを取得しておく必要があります.glClearColor()で背景色を決め,glClear()でカラーバッファをクリアします.なお,アプリケーションを終了したとき,生成した DCや RCを解除しなければなりません.それは,OnDestroyイベントのイベントハンドラ FormDestroy()にコーディングした

wglMakeCurrent(hDC, NULL);

wglDeleteContext(hRC);

の 2行で行われます (リスト 1.2の行番号 196~200参照).頭に wglが付くOpenGL関数は,Win32と OpenGLをリンクする役割を担っています.通常使用されるOpenGL関数は,glで始まるGL関数,gluで始まるGLU関数です.これらを使用するためにはそれぞれ,ヘッダファイル<gl/gl.h>,<gl/glu.h>を必要とします.

1.2.2 3次元空間の設定本書で用いる 3次元空間は,図 1.1に示すように床平面を xy,鉛直上方を z軸とする右手座標系を用いています.この,(x, y, z) 3次元空間の座標を世界座標 (ワールド座標,world coordinate)

y

x

z

図 1.1 ワールド座標に置かれたオブジェクト

3

Page 15: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 1章 アニメーションシステム

または固定座標といい,物体 (オブジェクト)をこの仮想空間に配置します.仮想 3次元空間を描画するためには,視点 (カメラ)の位置や方向,どのように見るかをあらかじめ設定しておく必要があります.これは,メソッド set3DAmbient()で行っています (リスト1.1の行番号 165~201参照).◆視点 (カメラ)の設定オブジェクトを見るためには,図 1.2のように,世界座標において視点と,注視点 (注目点)と見る方向を与える必要があります.(xs, ys, zs)座標はスクリーン座標 (screen coordinate)と呼ばれ後述する視体積の定義に用いられます.視点は gluLookAt()関数によって

gluLookAt(vx,vy,vz,cx,cy,cz,ux,uy,uz);

のように設定します.(vx,vy,vz)は視点の位置,(cx,cy,cz)は注視点,(ux,uy,uz)はどの方向がスクリーン上において上になるかを示すビューアップベクトルです.これは,図 1.2において ysに相当するベクトルですが,z軸方向をビューアップベクトルにしたいときは単に (0,0,1)

を指定します.

ビューアップベクトル

sx

注視点

sz

x

y

z

sy視点

スクリーン

(cx,cy,cz)

(vx,vy,vz)

図 1.2 gluLookAt()の意味.視点と注視点とビューアップベクトルを定義する.

◆透視投影3次元空間に置かれたオブジェクトを眺めた場合,視点に近いオブジェクトほど大きく,遠いオブジェクトは小さく見えます.このように,人間の感覚に近い性質を持った投影方法を透視投影 (perspective projection)といいます.透視投影を行うための第 1ステップは

glMatrixMode(GL PROJECTION);

glLoadIdentity();

によって投影座標変換を宣言することです.◆視体積透視投影を行うための第 2ステップは視体積 (view volume,視錐台,視野錐台ともいう)を定義することです.視体積とは,スクリーン上に投影することのできる空間のことをいい,この空間に存在するオブジェクトだけを見ることができます.視体積の定義には次のようにgluPerspective()という GLU関数を使用しています.

gluPerspective(fovy, aspect, zNear, zFar);

4

Page 16: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

1.2 OpenGLの設定

引数の意味を図 1.3に示します.fovyは,上下方向の視界角度 (視野角)で,0◦から 180◦の範囲で指定できます.aspect は,表示画面のアスペクト比 (幅 wと高さ hの比),zNearと zFar

はそれぞれ,視点から視体積の前面 (近平面)までの距離と後面 (遠平面)までの距離です.fovy

の fovは視界 (field of view)を yはスクリーン面の y座標を表しています (図 1.2の ys).

w

遠平面

近平面

h

zNear zFar

視野角 fovy

視点

図 1.3 gluPerspective()関数で定義される視体積.近平面と遠平面で作る視体積に含まれるオブジェクトだけを見ることができる.

1.2.3 光源の設定本書では,オブジェクトをソリッドモデルで描画します.そのために必要な光源の初期設定をメソッド setLight()で行っています (リスト 1.1の行番号 203~229参照).物体表面の明るさ (輝度)は,一様に反射する拡散反射光 (diffusely reflected light),特定の方向に強く反射する鏡面反射光 (specularly reflected light),直接光が届かないところでも存在する環境光 (ambient light),および半透明物体を表現するための透過光 (transmitted light)の 4種類の要素を考慮して計算されます.

OpenGLでは,拡散反射光,鏡面反射光,および環境光の属性を別々に定義します.例えば,拡散光を定義するには

float lightDiffuse0[] = {1.0f,1.0f,1.0f,1.0f};glLightfv(GL LIGHT0,GL DIFFUSE,lightDiffuse0);

のようにコーディングします.配列 lightDiffuse0[]は RGBA値を設定します.この例では100 % の赤,100 % の緑,100 % の青に設定しており,最も明るい白色光を表しています.4番目の 1.0は,アルファ値であり,透過光を考慮するときに使用します.glLightfv()によって拡散光を定義しています.第 1引数は光源を識別する名前,第 2引数は光源の種類,第 3引数は光源の特性値です.末尾に “v”の付いたベクトルバージョンを用いているので,配列のアドレス (ポインタ)を指定します.第 2引数が GL_AMBIENTならば環境光を,GL_SPECULARならば鏡面光を指定することになります.光源の位置も次のように定義します.

float lightPosition0[] = {10.0f,10.0f,20.0f,1.0f};glLightfv(GL LIGHT0,GL POSITION,lightPosition0);

この配列は,光源の 座標が (10,10,20)で,点光源であることを意味しています.配列の最後の値は 0.0か 1.0だけが許される値であり,0.0のときは平行光源となります.実際の光源位置の初期値はmainUnit.cppのコンストラクタ TMainForm()で与えています.

5

Page 17: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 1章 アニメーションシステム

光源を利用するためには,glEnable(GL_LIGHTING)と glEnable(GL_LIGHT0)が必要です.前者は,光源のメインスイッチに相当し,後者は各光源のスイッチに相当します.

OpenGLでは,光源を独立に 8個まで設定できます.また,上に述べた光源の他に,スポットライトやランプのような放射光も設定できます.なお,この setLight()ルーチンでは,デプスバッファのクリアと有効化,スムーズシェーディングモードの設定,および法線ベクトルの自動正規化なども行っています.実際の光源位置は mainUnit.hで定義したクラス CLightのデータメンバ x,y,zで行っています.デフォルト値はコンストラクタ CLight()で与えています.SettingFormのグループボックス「Light」のボタン [X],[Y],[Z]で 1 mずつ変更可能です.

1.3 オブジェクトの描画

3次元仮想空間にオブジェクトを描画するためには,モデリングとレンダリングが必要です.

1.3.1 モデリングコンピュータ内部に 3次元オブジェクトの幾何情報を与えることをモデリング (modeling)といいます.ワイヤーフレームモデル,サーフェイスモデル,ソリッドモデルがあります.ワイヤーフレームモデルでは,頂点座標だけが与えられており,頂点と頂点を結ぶ稜線を表示します.さらに,面情報を与えたものがサーフェイスモデルであり,隠線消去や隠面消去などが可能となります.サーフェイスモデルにおいて面に方向性を与えたものがソリッドモデルであり,あたかも内部が詰まったように見せることができ,密度や質量などの物理特性を与えることも可能となります.本書ではソリッドモデルだけを扱います.例として立方体のモデリングを示します.各辺が等しい直方体を正六面体または立方体といいます.多面体近似の 3次元オブジェクトを定義するためには少なくとも頂点座標と各面を構成する頂点番号が必要です.立方体のデータ構造を図 1.4に示します.このようにオブジェクトを定義する座標を局所座標 (ローカル座標,local coordinate)あるいは物体座標といいます.本書では,右手系のデカルト座標を用いています.図 1.4では,立方体の中心をローカル座標の原点に一致させています.面の方向性を考慮して,頂点番号を表側から見て左回りになるように定義します.この図では S0,S1,S2が表の面,他は裏の面となります.

5S

4S

3S

2S1S

0S

y

x

7P

6P5P

4P

3P

2P

z

1P

0P

図 1.4 立方体のデータ構造.面の頂点番号を表側から見て左回りになるように定義する.

6

Page 18: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.
Page 19: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第6章

剛体の衝突Rigid Body Collisions

 前章までは「剛体」1個の運動について説明してきました.本章では複数の剛体の相互作用,すなわち,「衝突」を扱います.衝突問題は実際の 3次元空間に置かれた物体の振る舞いを考える上できわめて重要ですが,複雑な問題であるためゲームやアニメーションの制作者を悩ます大きなテーマです. 衝突問題は衝突後の運動を扱う「衝突応答」と,衝突したかどうか調べる「衝突検出」に分かれます.衝突応答は「運動量-力積の原理」,「運動量保存の法則」および「衝突の法則」という 3つの物理法則によって導かれます.一方,衝突検出は計算幾何学の問題です.衝突検出を正確に行えば行うほど衝突後の運動は正確になりますが,応答速度は遅くなります.本書でもいくつかのテクニック (ごまかし)を使い力学シミュレーションを行っています. 本章では,「2球による正面衝突」,「2次元平面における剛体の衝突」および「3次元空間における剛体の衝突」に関するアニメーションを作成します.

Keyword:運動量,角運動量,力積,撃力,角力積,運動量保存の法則,運動量-力積の原理,衝突の法則,はね返り係数 (反発係数),衝突応答,衝突検出,作用線,正面衝突,斜め衝突,弾性衝突,非弾性衝突,めり込み,沈み込み,接触力,間引き表示

6.1 衝突の物理

衝突後の物体の運動すなわち衝突応答アルゴリズムを求めるためには,衝突時の物理法則を知る必要があります.本書では古典的ニュートン力学の衝撃の原理に基づいて衝突応答 (collision

response)を求めています.運動量–力積の原理,運動量保存の法則および衝突の法則 (はね返り係数の定義)が重要な要素となります.

6.1.1 運動量–力積の原理われわれは飛んできたボールを受けとめるとき,ボールの質量が大きいほど,速度が大きいほど手に大きな衝撃を感じることを日常経験しています.この衝撃の強さは運動の勢いを表しており運動量 (momentum)と呼ばれます.速度 vで並進運動している質量mの物体は

p = mv (6.1)

84

Page 20: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

6.1 衝突の物理

FDT

v

v'

p

p'

m

図 6.1 力積と運動量.物体に衝撃力を与えると運動量が変化する.

の運動量をもちます.一方,ニュートンの第 2法則

F = mdvdt

(6.2)

は式 (6.1)の運動量を用いて

F =dpdt

(6.3)

のように表現できます.上式の両辺に dtを乗じ,積分すると∫ t2

t1

Fdt = p′ − p (6.4)

あるいは,質量が一定であれば∫ t2

t1

Fdt = m(v′ − v) (6.5)

が得られます.これらは,図 6.1に示すように質量 mの剛体に力 Fが t1 から t2 の微小時間∆T = t2 − t1の間に加えられたとき運動量が pから p′に,速度が vから v′に変化することを表しています.左辺は∆T の間に加えられた衝撃力 (あるいは単に撃力) であり,力積 (impulse)と呼ばれます.力積は

J =∫ t2

t1

Fdt (6.6)

で表現します.野球やゴルフでボールを遠くに飛ばしたいときは,同じ力でもボールに力を加える時間 ∆T を長くすればよいことがわかります.これがフォロースルーです.図 6.1の Fは平均値であり,微小時間∆T の間一定の力が物体に加えられたと仮定することができます.

F =1

∆T

∫ t2

t1

Fdt (6.7)

図 6.2において灰色の面積が力積を表しており,力積の大きさはみな同じです.以後,力 Fを一定値と仮定します.式 (6.4)および (6.5)は,衝突前後の運動量の変化は力積に等しいことを表しており,運動量–力積の原理 (momentum-impulse principle)と呼ばれます.

6.1.2 運動量保存の法則図 6.3のように 2個の剛体球の重心が直線上で運動している場合を考慮します.衝突したとき衝突点において力の方向を向いた直線を作用線 (line of action)といいます.球同士の場合は重心

85

Page 21: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 6章 剛体の衝突

DT DT2

DT

F F

2F

t t t

F(t) F(t) F(t)

図 6.2 力積.面積が等しければ力積は同じ.

と重心を結ぶ線が作用線であり,衝突面の法線方向に一致します.すべての速度がこの作用線上にあるとき正面衝突 (head-on collision)あるいは直接点衝突といいます.このようにすべての方向が直線上にあるときは物理量をスカラー量で考えることが可能です.

v1 v2 v'1 v'2

m1 m2

衝突前 衝突後作用線

図 6.3 2球の正面衝突

剛体Ⅰ (質量m1),剛体Ⅱ (質量m2)の衝突前の速度をそれぞれ v1,v2,衝突後の速度を v′1,v′2とします.衝突により剛体Ⅰに力 F が作用すると反作用により剛体Ⅱ には −F が作用するので,力積は

剛体Ⅰ:J = F∆T = m1(v′1 − v1)

剛体Ⅱ: − J = −F∆T = m2(v′2 − v2)

(6.8)

となります.両式を加えると次式が得られます.

m1v1 + m2v2 = m1v′1 + m2v

′2 (6.9)

これは衝突前の全運動量と衝突後の全運動量が等しいことを表しており,運動量保存の法則 (law

of conservation of momentum)と呼ばれます.

6.1.3 衝突の法則2個の物体が衝突したとき,衝突前後の相対速度が変化します.相対速度の大きさの比

e = − v′1 − v′2v1 − v2

(6.10)

をはね返り係数 (coefficient of restitution)あるいは反発係数といいます.このはね返り係数と速度の関係式は衝突の法則 (collision law)とも呼ばれます.負号は相対速度の方向が反転することを表しています.例えば,剛体Ⅱが大きな壁や床ならば v2 = v′2 = 0となり,剛体Ⅰは衝突前の方向とは反対方向にはね返されます.はね返り係数が e = 1ならば完全弾性衝突 (completely elastic collision)といい,衝突前後で全運動エネルギーも保存されます.e = 0のときは,粘土どうしの衝突のように 2個の物体は衝突後合体して運動するようになります.これを非完全弾性衝突といいます.通常の物体は 0 < e < 1

86

Page 22: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

6.2 水平面に衝突する剛体

の非弾性衝突 (inelastic collision)であり,衝突によって熱や変形により運動エネルギーは減少します.しかし,いずれの場合も式 (6.9)の運動量保存の法則は成立します.式 (6.8)より

v′1 =J

m1+ v1

v′2 = − J

m2+ v2

(6.11)

が得られ,式 (6.10)を用いると次の重要な式が得られます.

J = − (v1 − v2)(e + 1)1

m1+

1m2

(6.12)

はね返り係数 (反発係数)が与えられているならば,衝突前の相対速度から上式によって力積が求まり,式 (6.11)によって衝突後の速度が計算できます.

6.1.4 2球の斜め衝突次に,図 6.4のように衝突前の 2球の速度が作用線上にない一般的な斜め衝突 (oblique collision)

について考えてみます.図には衝突した瞬間を描いています.衝突面の法線方向は剛体Ⅰの重心から剛体Ⅱの重心へ向かう方向です.衝突面で摩擦がなければ接線方向の速度成分に変化はなく,式 (6.10)~(6.12)は法線成分に対して成立します.

v1

v'1

v2

v'2

作用線

n

m1

m2

t

図 6.4 剛体球の斜め衝突

6.2 水平面に衝突する剛体

前節において衝突応答を求める上で必要となる基本式が示されました.本節では具体例として水平面 (床,地面)に衝突する剛体について述べます.水平面上の摩擦と剛体自身の回転を考慮します.衝突問題に摩擦の影響を考慮するときわめてリアルなアニメーションが実現します.

6.2.1 摩擦がある水平面に衝突する球図 6.5に示すように,水平面に斜め入射する剛体球を考えてみましょう.水平方向を x軸方向として説明します.式 (6.10)~(6.12)において剛体Ⅱを水平面 (床や地面)と考えれば質量はm2 = ∞,速度は v2 = 0となります.衝突前後の球の速度成分,角速度成分を• 衝突前:vx, vz, ωy

87

Page 23: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 6章 剛体の衝突

x

z

v'

v

wy

v'x

v'z

vz

vx

図 6.5 水平面に衝突する球

• 衝突後:v′x, v′z, ω′y

とします.水平面に衝突した球の重心速度の法線成分は vz から v′z に変化します.式 (6.10)から,

v′z = −evz (6.13)

が得られます.図 6.5の座標系に対しては vz < 0なので v′z > 0となります.わかりやすいように式 (6.13)を

v′z = e |vz| (6.14)

のように表現します.この v′z を鉛直軸方向の初速度として放物運動を繰り返すことになります.球と水平面の間に摩擦がなければ水平方向の速度 vx に変化はありませんが,摩擦があるときは,前章の 5.4節で述べたように並進運動と回転運動の間で速度の交換が行われます.球と水平面が衝突によって接触している微小時間 ∆T の間は一定の衝撃力 Fn が作用すると仮定し,力積は式 (6.12)から

J = Fn∆T = (e + 1)m |vz| (6.15)

となります.接触面の剛体球の速度は球の半径を Rとすると

vp = vx − Rωy (6.16)

です.vp = 0のときは速度 vxと回転速度 Rωy は釣りあっており,接触面において滑りが生じないので転がりながら進みます.

vp �= 0のときは滑りが生じ,動摩擦力が発生します.図 6.6には vx > Rωy の場合を示しています.このとき運動方程式は

並進運動: mdvx

dt= −µkFn (6.17)

回転運動:  Idωy

dt= µkRFn (6.18)

で与えられます.球に対して I = (2/5)mR2 を用い上式を積分すると

88

Page 24: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

6.2 水平面に衝突する剛体

xvp

Ft=mkFn

Fn

wy

vxR

図 6.6 水平面を転がる球 (vp = vx − Rωy > 0の場合)

v′x = − µk

mFn t + vx (6.19)

Rω′y =

52

µk

mFnt + Rωy (6.20)

となります.右辺の vx および ωy は衝突直前の速度および角速度です.上式から v′x = Rω′y とな

る時刻を求めると

t′ =27|vx − Rωy|

µk

mFn

(6.21)

です.水平面に接触している微小時間∆T の間に v′x = Rω′y となる可能性があります.上式の t′

を ∆T で置き換えたときの動摩擦係数 µcr を臨界摩擦係数と呼ぶことにします.式 (6.15)を用いて

µcr =27|vx − Rωy|(e + 1) |vz| (6.22)

となります.µk と vp によってつぎの 3通りのケースがあります.

( a ) µk ≥ µcr の場合

球が水平面と衝突している間に v′x = Rω′y となります.式 (6.19)~(6.21)により

v′x =57

vx +27

Rωy, ω′ =v′xR

(6.23)

が得られます.

( b ) µk < µcr かつ vp > 0の場合

このときは,式 (6.19),(6.20)において t = ∆tとおけば衝突後の速度が得られます.Fn∆T として式 (6.15)を用いて,

v′x = −µk(1 + e) |vz| + vx (6.24)

ω′y =

52

µk(1 + e) |vz| + ωy (6.25)

となります.

( c ) µk < µcr かつ vp < 0の場合

このときは図 6.6において vpと Ftの方向が入れ替わるので,式 (6.19),(6.20)の µk の符号を反対にします.結局,式 (6.24),(6.25)は

89

Page 25: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.
Page 26: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第9章

波動シミュレーションWave Simulation

 波を作る源は振動です.その振動が少し遅れて媒質を伝わっていくとき波動として観測されます.前章のバネ-質点系モデルを利用すれば風に揺れる旗のように,日常目にするさまざまな波動を表現することができます.しかし,バネ-質点系モデルでは数値的不安定性のため時間刻みを十分に小さくできず 10×10程度の質点数でもリアルタイム処理には無理があります.この章では,波動の原理を学びそれを単純な数式で表現することによって,旗のはためきや水面の波動アニメーションをリアルタイムに実現できることを示します. 本章では,「1次元波動」,「2次元波動」,「ドップラー効果」,「旗のはためき」に関するアニメーションを作成します.

Keyword:伝搬速度,波長,振動数,周期,位相,横波,縦波,進行波,反射波,定常波 (定在波),平面波,円形波,重ね合わせの原理,干渉,ドップラー効果

9.1 1次元波動

細い紐や弦,テープなどで作られる振動は 1次元の波動として表現できます.ここでは,1次元波動を用いて,波の定式化と基本的な性質を学びます.

9.1.1 波の数式表現図 9.1(a)に示すように 1次元上に∆x間隔で並んだ質点について考えてみます.バネ-質点系モデルでは,左端の質点を上方向に持ち上げると,右となりの質点は上方向だけでなく左側にも少し移動します.いま,質点は上下方向 (鉛直軸,z軸方向)にだけ移動し,x軸方向には移動できないものと仮定します.x = 0の質点を波源と考え,時間∆t間隔で図 9.1(b)に示すようにその位置を変化させた場合,他の質点は時間とともにどのように変化するでしょうか (波形の伝わり方がわかるように波源の波形をのこぎり波状としています).各質点は左となりの質点の動きを∆t秒遅れてまねをするとしたとき,その時間経過は図 9.1(c)

~(k)のようになります.図 9.1(b)の波源 (x = 0)における質点の変位を

z = a(t) (9.1)

153

Page 27: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 9章 波動シミュレーション

x t=0

x t=Dt

x t=2Dt

x t=3Dt

x t=4Dt

x t=5Dt

x t=6Dt

x t=7Dt

x t=8Dt

( d )

( c )

( e )

( f )

( g )

( h )

( i )

( j )

( k )

x

z

( a )

Dx

t

z

( b )

Dt

図 9.1 波の伝搬の様子.(a)初期状態.(b)左端 (x = 0)の質点変動.(c)~(k)各質点変位の時間経過.

で表現したとき,位置

x = n∆x (9.2)

に存在する質点の変位は n∆t前の波源の変位に一致するので

z(x, t) = a(t − n∆t) (9.3)

となります.式 (9.2)から nを求め,式 (9.3)に代入すると

z(x, t) = a

(t −

(∆t

∆x

)x

)(9.4)

となります.ところで質点の変位が∆tの間に∆x進むので

v =∆x

∆t(9.5)

は波の伝わる速さ,すなわち,伝搬速度 (propagation velocity)を表しています.この v を用いると式 (9.4)は

z(x, t) = a(t − x

v

)(9.6)

となります.

154

Page 28: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

9.1 1次元波動

9.1.2 正 弦 波最も単純な振動は,第 7章で説明した単振動 (simple harmonic motion)です.図 9.2(a)に示すように単振動は,等速円運する質点の z軸への射影として得られます.半径をA,角速度を ω,初期位置を x軸上にとると,時刻 t秒後の質点の射影位置 (変位)は

z = A sin(ωt) (9.7)

となります.ωtを位相角 (phase angle)または単に位相 (phase)といいます.これをグラフに示すと図 9.2(b)に示すように振幅 (amplitude) A,角振動数 (angular frequency) ω の正弦波(sinusoidal wave)となります.振動数 (frequency)を f,周期 (perid)を T とすると

ω = 2πf =2π

T(9.8)

の関係にあります.

( a ) 等速円運動している質点 ( b ) z 軸射影のグラフ

t

z

TP

x

z

wt

図 9.2 単振動と正弦波

もし,図 9.1(a)の左端が式 (9.7)の単振動を 1周期分行ったとき,ある時刻における各質点の変位は図 9.3に示すようになります.1周期分に相当する x軸上の長さは波長と呼ばれます.この波形は式 (9.6)と (9.8)によって

z(x, t) = A sin{ω(t − x

v

)}(9.9)

となります.波長 (wavelength)を λとすると,時間 T の間に距離 λだけ進むので λ/T は伝搬速度 vになります.

v =λ

T(9.10)

式 (9.8),(9.10)を用いると式 (9.9)は

z(x, t) = A sin{

(t

T− x

λ

)}(9.11)

x

z

伝搬方向

l

図 9.3 ある時刻における各質点の変位

155

Page 29: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 9章 波動シミュレーション

で与えられます.この場合,位相は

θ = 2π

(t

T− x

λ

)(9.12)

です.この波のように,進行方向 (伝搬方向)に対して媒質が垂直に振動する波を横波 (transverse

wave)といいます.これに対し,進行方向と同じ方向に振動する波を縦波 (longitudinal wave)といいます.光や電磁波は,電界と磁界が進行方向に直交する面内で振動しながら伝搬するので横波です.音波は,空気の密度が進行方向と同じ方向に変化しながら伝搬するので縦波です.縦波では媒質の密なところと疎なところが交互に入れ替わりながら伝わっていくので,縦波のことを疎密波ともいいます.

9.1.3 進行波と反射波図 9.1(a)の 1次元モデルにおいてその長さが無限であれば,波源の振動によって生じた波は波源から遠ざかる方向の波だけとなります.このような波を進行波 (traveling wave)といいます.長さが有限であれば終端で反射波 (reflective wave)が生じ,波源に近づく波が存在することになります.反射波は図 9.4に示すように,終端から波源までの距離と同じ距離で波源とは反対側に存在するもう 1つの波源によって生じると考えることができます.この波源を反射波源と呼ぶことにします.1次元モデルの長さを L,波源位置を x = 0とすると反射波源の位置は xrs = 2Lとなります.位置 xにおいて,反射波源からの距離は xrs −xとなるので反射波の変位は,式 (9.11)

を用いて

zr(x, t) = Ar sin{

(t

T− xrs − x

λ

)+ θr

}(9.13)

となります.Ar と θr はそれぞれ反射波の大きさと位相です.

x

波源 進行波 反射波 反射波源終端

L L

図 9.4 進行波と反射波

ところで,2個以上の波源がある場合の変位はそれぞれの波源によって生じる変位の単純な和になります.これを重ね合わせの原理 (principle of superposition)といいます.進行波と反射波の合成波形は

z(x, t) = A sin{

(t

T− x

λ

)}+ Ar sin

{2π

(t

T− xrs − x

λ

)+ θr

}(9.14)

となります.最も単純な反射波は,終端を自由に動けるようにした場合と固定した場合です.前者を自由端,後者を固定端といいます.自由端では終端において進行波と反射波が同じ位相で重なり合います.すなわち,式 (9.14)において θr = 0です.Ar = Aの場合,終端の変位は 2Aとなります.図 9.4の右側の波形は自由

156

Page 30: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

9.2 水面の波動

端の反射を表しています.防波堤において水は固定されていないので,打ち寄せる波に対して,防波堤は自由端と考えられます.一方,固定端では,終端の変位は常に 0になるように進行波と反射波は逆位相で重なり合います.このときは,θr = πとなります.固定端のときは図 9.4において右側の反射波の変位は負側に反転します.弦楽器の弦の両端は固定されているので固定端になります.

9.1.4 定 常 波連続した波長と振幅が等しい正弦波が,互いに逆向きに進んでくると,2つの波が重なり合い,どちらにも進んでいないように見える波ができます.これを定常波 (standing wave)あるいは定在波といいます.図 9.5に示すように,ある場所では振動の振幅が常に最大になり,ある場所では 0になります.最大の位置を腹,最小の位置を節と呼びます.両端が固定された弦の場合は両端が常に節です.図 9.5の場合は,振動の波長が弦の長さに一致している場合です.一般に定常波の波長は

λ =nL

2(n = 1, 2, · · · ) (9.15)

となります.

L

図 9.5 定常波

9.2 水面の波動

海面に浮かんでいると波が来たとき上下運動だけでなく,前後にも振動していることを経験された読者もおられることでしょう.平衡状態 (水平面)から風などにより盛り上がった海水は,重力の作用により元の平衡状態に戻ろうとして液体自身の媒質が上下だけでなく水平方向にも移動します.その振動が次々と隣の液体媒質に伝わり海面上に波が発生していると考えられます.ここでは水面の波も横波だけとしてシミュレーションします.

9.2.1 円 形 波池などの水面に石を投げ入れるとリング状の波が発生します.これが円形波 (circular wave)です.円形波は式 (9.11)を変形して,次式で表現できます.

z(r, t) = A sin{

(t

T− r

λ

)}(9.16)

ただし,rは波源 (xs, ys)からの距離で

r =√

(x − xs)2 + (y − ys)2 (9.17)

157

Page 31: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 9章 波動シミュレーション

で与えられます.ところで,水面に生じた円形波は波源から離れるに従ってその振幅は減衰します.波のエネルギー Eが一定に保たれると仮定すると,半径 rの円周上では E/2πrとなります.エネルギーは振幅の 2乗に比例すると考えられるので振幅は 1/

√rで減衰するはずです.減衰を

考慮して式 (9.16)を

z(r, t) =A√r

sin{

(t

T− r

λ

)}(9.18)

のように修正します.ただし,コンピュータ処理では r = 0でエラーが生じるので,r < 0.1ならば r = 0.1としています.なお,重力によって水面に生じる波の伝搬速度は,水深 hにくらべ波長 λが大きい場合は,

v =√

gh (9.19)

で与えられます.gは重力加速度です.連続円形波の実行例を図 9.6に示します.時刻 t = 0で波源の振動が開始されます.

図 9.6 連続円形波の実行例

9.2.2 波 の 干 渉波源が 2個以上存在するときは,9.1.3項で述べたように重ね合わせの原理により,それぞれの波源から生じる波の単純な和で計算されます.振動数も位相も同じ波源が近くにあれば,波が強め合って大きく振動する場所と,打ち消しあってほとんど振動しない場所が生じます.このような現象を波の干渉 (interference)といいます.波源 1からの距離を r1,波源 2からの距離を r2 とすると

|r1 − r2| = mλ (m = 0, 1, 2, · · · ) (9.20)

となる位置では,両波源からの波の位相が一致するので強め合い,

|r1 − r2| =(

m +12

)λ (m = 0, 1, 2, · · · ) (9.21)

となる位置では,互いに位相が反転して合成されるので振動は常に 0となります.2つの波源によって生じる干渉パターン例を図 9.7に示します.

158

Page 32: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

9.2 水面の波動

図 9.7 2波源による干渉パターン

9.2.3 平 面 波細長い棒を水面に浮かべ,両端を同時に上下させると山と谷が直線上になり棒と直交する方向に進む波が観測されます.このような波を平面波 (plane wave)といいます.すなわち,平面波は一直線状に並んだ振幅も位相も同じ無数の波源によって発生させることができます.図 9.8は等間隔に並べた 21個の波源によって作成した波です.平面波に非常に近いパターンがみられます.中心近くの 1列の盛り上がっている部分に波源 21個存在します.

図 9.8 円形波の波源 21個で作成した平面波

完全な平面波は式 (9.11)を 2次元に拡張することによって作成できます.

z(x, y, t) = A sin{

(t

T− x

λx− y

λy

)}(9.22)

ただし,図 9.9に示すように伝搬方向 (x軸とのなす角 θ)の波長を λとすると,x軸方向の波長λx と y軸方向の波長 λy は次式で与えられます.

λx =λ

cos θ, λy =

λ

sin θ(9.23)

式 (9.22)で求めた平面波の例を図 9.10に示します.

159

Page 33: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

第 9章 波動シミュレーション

伝搬方向

x

y

lx

ly

q

l

図 9.9 平面波の波長 図 9.10 1つの式で作成した平面波

9.2.4 ドップラー効果救急車が近づいてくるときのサイレンの音は高く,遠ざかるときは低く聞こえることは日常的に経験しています.これをドップラー効果 (Doppler effect)といいます.同じ現象は,水鳥が水面を泳ぐときにも観測されます.図 9.11はドップラー効果の原理を示しています.

r1

r2

r3

r4

t1 t4x

t2t3 t5

図 9.11 ドップラー効果の原理

波源が x軸方向に一定速度 vsで進んでおり,現在時刻を t5とします.波源が時刻 t5の位置に到達したとき,時刻 ti に出た波面は距離 ri = v(t5 − ti)に到達しています.vは波面の伝搬速度です.波源の前方では波面と波面の間隔,すなわち波長 λが短縮されて観測されます.波源が停止しているときの振動数を f0 とすると観測される波長は

λ =v − vs

f0(9.24)

となります.すると,新しい振動数は

f =v

λ= f0 · v

v − vs(9.25)

となり,高い振動数の波となるのです.一方,波源の後方では見かけの波長は長くなり,上式において vs < 0とすれば,低い振動数となることが理解できます.図 9.12にドップラー効果の実行例を示します.この例では,v = 0.3 m / s,vs = 0.1 m / sとしています.波源にはボールを置き,波源の振動に合わせてボールも振動させています.

160

Page 34: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

9.3 数式による旗のアニメーション

図 9.12 ドップラー効果の実行例

9.3 数式による旗のアニメーション

テーブル上に置かれたテーブルクロスや衣服の場合は,他のオブジェクトとの衝突計算が必要です.バネ–質点系モデルにオイラー法を適用することによって衝突計算が可能であることを前章において示しています.しかし,現在のパソコンでは 10 × 10程度の質点に対してもリアルタイム処理が難しいこともわかりました.ここでは,数式 (三角関数)によって旗のはためきを表現する方法を説明します.

9.3.1 1次元オブジェクトの表現スカートやカーテンのひだのように周期的な凹凸は三角関数で表現できます.旗のはためきも式 (9.22)の平面波によって表現できそうです.ただし,布はわずかに伸びることはあっても水面のように自由に伸びているわけではありません.表面に沿う長さをほぼ一定に保つ必要があります.糸状の 1次元オブジェクトを正弦波で表すと図 9.13のようになります.x軸からの変位は

y(x) = a sin(

λxx − α

)(9.26)

となります.図 9.13のときはちょうど L0 = λx,α = 0の場合です.両端が固定された弦やゴムひもでは x軸方向の長さ L0 は直線状態の長さ Lに一致します.布地の場合は伸縮の程度がきわ

L0

L

Dx

ex

x

y

図 9.13 1次元オブジェクトの波

161

Page 35: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.
Page 36: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

索 引

英数字RGBAカラーモード ................ 3

SI単位系.............................. 33

Zバッファ法........................... 3

3次元テクスチャ ................... 10

OpenGL関係語ChoosePixelFormat() ............. 3

GL AMBIENT ............................ 7

GL AMBIENT AND DIFFUSE ......... 7

glBegin().............................. 7

glClear().............................. 3

glClearColor() ..................... 3

GL DECAL................................ 8

GL DIFFUSE ............................ 7

glDisable() .......................... 9

glEnable() ............................ 9

glEnd() ................................. 7

GL FRONT................................ 7

glLightfv() .......................... 5

glLoadIdentity() .................. 4

glMaterialfv() ..................... 7

glMatrixMode() ..................... 4

GL MODULATE........................... 8

glPopMatrix() ..................... 14

glPushMatrix() ................... 14

GL QUADS................................ 7

glRotate() .......................... 13

glScale()............................ 13

GL SHININESS ......................... 8

glTexCoord()......................... 9

glTexEnvi() .......................... 8

glTexImage2D() ..................... 8

glTexParameteri() ................ 8

glTranslate() ..................... 13

gluLookAt() .......................... 4

gluPerspective() .................. 4

glVertex3f()......................... 7

SetPixelFormat() .................. 3

SwapBuffers() ....................... 8

wglCreateContext()............... 3

wglDeleteContext()............... 3

wglMakeCurrent() .................. 3

プログラム関係語AppStarting .......................202

Bitmap................................ 202

Convert .............................. 202

crAppStart ......................... 202

DecodeTime()................ 20, 202

DoEvents() ......................... 202

FormResize()....................... 17

friend属性 ...................179, 192

FromFile() ......................... 202

GetDC() .............................. 201

Graphics::TBitmap .............. 20

LoadFromFile() ................... 20

Now..................................... 202

Now() ........................... 20, 202

private ................................ 16

ProcessMessages() ....... 20, 202

public.................................. 16

TDateTime............................ 20

ToInt32()........................... 201

ToString() ......................... 201

あ 行アフィン変換 ........................ 11

位相 ...................................155

位相角 ................................ 155

位置 .................................... 32

位置エネルギー ....................115

イベント .............................. 15

イベントハンドラ .................. 15

引力定数 .............................. 45

運動エネルギー .............. 65, 115

運動学 ................................. 32

運動の第 1法則 ..................... 43

運動の第 2法則 ..................... 44

運動の第 3法則 ..................... 45

運動の法則 ........................... 44

運動摩擦力 ........................... 55

運動力学 .............................. 43

運動量 ................................. 84

運動量保存の法則 .................. 85

運動量–力積の原理 ............ 84, 85

遠隔力 ................................. 45

円形波 ................................ 157

演算子 .........................179, 192

遠心力 ................................. 57

円錐振り子 ........................... 49

円柱座標投影 .......................... 9

オイラー角 ........................... 13

オイラーの方程式 .................. 76

オイラー法 ...................... 38, 48

大きさ ................................172

か 行外積 ............................. 68, 174

回転 .................................... 12

回転運動 .............................. 64

角運動量 .............................. 67

角加速度 ......................... 36, 65

角振動数 .............................155

角速度 ............................ 35, 64

角力積 ................................. 90

過減衰 ................................111

重ね合わせの原理 .................156

加速度 ............................ 34, 65

カラービット数 ....................... 3

干渉 ...................................158

慣性主軸 .............................. 68

慣性積 ................................. 68

慣性抵抗 .............................. 58

慣性の法則 ........................... 43

慣性モーメント ................ 66, 68

完全弾性衝突 ........................ 86

基準振動 .............................114

逆行列 ................................184

球座標投影 ............................. 9

仰角 ...................................172

共振 ...................................112

強制振動 .............................111

行列 ............................. 68, 183

行列式 ................................184

極座標 ................................172

局所座標 ................................ 6

近接力 ................................. 45

偶力 ...................................128

クオータニオン ......... 17, 76, 187

クレーン .............................. 10

クロスアニメーション ...........131

撃力 .................................... 85

減衰振動 .............................110

減衰定数 .............................129

減衰力 ................................129

向心力 ............................ 38, 46

構造バネ .............................132

剛体 .................................... 84

固定座標 ................................ 4

211

Page 37: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

main : 2005/10/31(11:48): 再々校

索 引

固定端 ................................156

弧度 .................................... 35

固有角振動数 .......................110

固有振動数 ..........................110

コリオリの力 ........................ 57

転がり運動 ........................... 70

コンポーネント ..................... 15

さ 行最大摩擦力 ........................... 55

サーフェイスモデル ................. 6

差分 .................................... 33

作用線 ................................. 85

作用反作用の法則 .................. 45

時間刻み ......................... 19, 33

四元数 ..................... 17, 76, 187

沈み込み .............................. 99

視体積 ................................... 4

質点 .................................... 32

視点 ...................................... 4

周期 ...................................155

自由端 ................................156

重力 .................................... 45

重力加速度 ........................... 45

衝突応答 .............................. 84

衝突検出 .............................. 94

衝突の法則 ........................... 86

正面衝突 .............................. 86

進行波 ................................156

振動数 ................................155

ジンバルロック ..................... 17

振幅 ...................................155

垂直効力 .............................. 54

数値積分 ....................... 38, 140

スカラ ................................. 32

スカラ積 .............................173

スクリーン座標 ....................... 4

スケーリング ........................ 11

ステップ実行 ........................ 79

ストークスの法則 .................. 58

ズーム ................................. 10

正弦波 ................................155

静止摩擦係数 ........................ 55

静止摩擦力 ........................... 55

世界座標 ................................ 3

積分 .................................... 34

斥力 ...................................128

接触力 ................................. 99

せん断バネ ...................131, 132

速度 ............................... 32, 64

ソースファイル ..................... 15

疎密波 ................................156

ソリッドテクスチャ ............... 10

ソリッドモデル ....................... 6

た 行対角行列 ............................. 184

多重定義 ......................179, 192

縦波 ................................... 156

単位ベクトル ................. 36, 172

単振動 ......................... 109, 155

弾性 ................................... 109

弾性体 ................................126

弾性定数 ............................. 109

弾性力 ................................109

単振り子 .............................. 47

タンブル .............................. 10

力のモーメント ..................... 67

注視点 ................................... 4

中心力 ............................ 38, 46

ちょう番バネ .......................127

直接点衝突 ........................... 86

チルト ................................. 10

定在波 ................................157

定常波 ................................157

テクスチャマッピング .............. 8

データメンバ ........................ 15

手続き型テクスチャ ............... 10

デバイスコンテキスト ....... 2, 201

デプスバッファビット数 ........... 3

テンソル .............................. 68

伝搬速度 ............................. 154

等加速度運動 ................... 33, 34

透視投影 ................................ 4

等速円運動 ...................... 35, 46

等速直線運動 ........................ 32

動摩擦係数 ........................... 55

動摩擦力 .............................. 55

ドップラー効果 ....................160

トラック .............................. 10

ドリー ................................. 10

トルク ................................. 67

な 行内積 ................................... 173

斜め衝突 .............................. 87

ニュートンの運動方程式 ......... 44

粘性係数 ............................. 129

粘性抵抗 .............................. 58

は 行パーティクルシステム ...........126

バウンディング球 .................. 96

波長 ................................... 155

バックバッファ ....................... 2

はね返り係数 ........................ 86

バネ–質点系モデル ................126

バネ定数 ............................. 109

バネ振り子 ..........................114

速さ .................................... 32

腹 ......................................157

パン .................................... 10

反射波 ................................ 156

反射波源 ............................. 156

反発係数 .............................. 86

万有引力 .............................. 45

ピクセルフォーマット .............. 2

微小時間 .............................. 19

非弾性衝突 ........................... 87

ピッチ ................................. 13

微分 .................................... 33

ビューアップベクトル .............. 4

節 ......................................157

フックの法則 ....................... 109

物体座標 ................................ 6

フロントバッファ .................... 2

平行移動 .............................. 13

平行投影 ................................ 9

並進運動 .............................. 64

平面波 ................................ 159

ベクトル .................. 32, 36, 172

ベクトル積 .......................... 174

ヘッダファイル ..................... 15

変換行列 .............................. 11

方位角 ................................ 172

方向 ...................................172

放物運動 .............................. 46

ま 行摩擦力 .......................... 54, 129

メソッド .............................. 15

めり込み .............................. 98

モデリング ............................. 6

や 行ヨー .................................... 13

横波 ...................................156

ら 行ラグランジュ関数 .................115

リアルタイムアニメーション ..... 1

力積 .................................... 85

粒子 ............................. 32, 126

粒子系 ................................ 126

臨界減衰 ............................. 111

臨界摩擦係数 ........................ 89

連成振り子 .......................... 117

レンダリングコンテキスト ....... 2,

201

ローカル座標 .......................... 6

ロール ................................. 13

わ 行ワイヤーフレームモデル ........... 6

ワールド座標 .......................... 3

212

Page 38: 「OpenGLで作る力学 アニメーション入門」 サンプルページ · 「OpenGLで作る力学 アニメーション入門」 サンプルページ この本の定価・判型などは,以下のURLからご覧いただけます.

OpenGL で作る力学アニメーション入門 © 酒井幸市 2005

2005 年 11 月 15 日 第 1 版第 1 刷発行 【本書の無断転載を禁ず】2009 年 12 月 15 日 第 1 版第 4 刷発行

著  者 酒井幸市発 行 者 森北博巳発 行 所 森北出版株式会社

東京都千代田区富士見 1-4-11(〒 102-0071)電話 03-3265-8341 / FAX 03-3264-8709http://www.morikita.co.jp/日本書籍出版協会・自然科学書協会・工学書協会 会員

<(社)出版者著作権管理機構 委託出版物>

落丁・乱丁本はお取替えいたします 印刷/エーヴィス・製本/ブックアート

Printed in Japan/ISBN978-4-627-84561-9

   著 者 略 歴酒井 幸市(さかい・こういち)1965 年 北海道大学工学部電子工学科卒業1965 年 沖電気工業株式会社入社1974 年 釧路工業高等専門学校講師1988 年 釧路工業高等専門学校教授1993 年 函館工業高等専門学校教授2005 年 函館工業高等専門学校名誉教授     現在に至る     工学博士