SlideShare a Scribd company logo
OpenGL で 3DCG
大江ゼミ3年 中川武憲
Agenda
・OpenGL の基礎知識
・x,y,z 軸の描画
・三角錐の描画
・W,A,S,D で移動
・マウスでカメラの向きを変更
・三角錐の自動回転
・デモ
OpenGL 基礎知識
・ビューイングパイプライン
・モデリング変換
・視野変換
・投射変換
・ビューポート変換
OpenGL 基礎知識
ビューイング・パイプライン
モデリング座標系 …モデルを基準にした座標系
(ローカル座標系)
↓                            ↓ モデリング変換
ワールド座標系 …仮想 3D 空間の基準となる座標系
↓                            ↓ 視野変換
ビュー座標系 …視点を基準とした (カメラから見た) 座標系
↓                            ↓ 投射変換
正規化デバイス座標系 … x, y, z がそれぞれ -1~1 の範囲となる座標系
(クリッピング座標系)
↓                            ↓ ビューポート変換
ウィンドウ座標系 …左上が原点、右下方向が x, y の正の方向となる2次元の座標系
(スクリーン座標系)
OpenGL 実践
x,y,z 軸の描画
GL_LINES で (0, 0, 0) から x,y,z それぞれ長さ 100 の線を引く。
各メソッドの解説
glLineWidth(GLfloat width): 線幅を指定
glColor4d: RGBA で色を指定 (GL_LIGHTING が disable の時のみ有効)
glBegin(GLenum mode): モードを指定して頂点の追加を開始
glVertex3d: XYZ で座標を指定
glEnd(void): glBegin と対になる頂点グループの終わりを示す
x,y,z 軸の描画
glLineWidth(1);
glDisable(GL_LIGHTING);
for (int i = 0; i < 3; i++) {
int length = 100;
glColor4d((i == 0), (i == 1), (i == 2), 1.0);
glBegin(GL_LINES);
glVertex3d(0, 0, 0);
glVertex3d((i == 0) * length, (i == 1) * length, (i == 2) * length);
glEnd();
}
glEnable(GL_LIGHTING);
三角錐の描画
三角錐は全ての面が三角形で構成される四面体である。
頂点は4つ、辺の数は6つである。
単純に考えると、 GL_TRIANGLES で4つの三角形を描けば良いが、同じ頂点を3度指定
する必要があり、合計で12個の頂点を打つことになり無駄である。
そこで、 GL_TRIANGLE_STRIP を使って合計6つの頂点で三角錐を描画した。
各メソッドの解説
glNormal3d: XYZ で法線ベクトルを指定する
三角錐の描画
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(0, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(4, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(0, 0, 3); glNormal3d(0, 0, -1);
glVertex3d(0, 2, 0); glNormal3d(0, 0, -1);
glVertex3d(0, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(4, 0, 0); glNormal3d(0, 0, -1);
glEnd();
コードでは伝わりにくい
図解
xz
y
(0, 2, 0)
(4, 0, 0)(0, 0, 3)
(0, 0, 0)
図解
xz
y
(0, 2, 0)
(4, 0, 0)(0, 0, 3)
(0, 0, 0)
図解
xz
y
(0, 2, 0)
(4, 0, 0)(0, 0, 3)
(0, 0, 0)
図解
xz
y
(0, 2, 0)
(4, 0, 0)(0, 0, 3)
(0, 0, 0)
図解
xz
y
(0, 2, 0)
(4, 0, 0)(0, 0, 3)
(0, 0, 0)
何故それで描画されるのか
三角錐の展開図
三角錐の展開図 (内側→外側)
c
bd
c
d
a
三角錐の展開図 (外側)
c
bd
c
d
a
GL_TRIANGLE_STRIP
W,A,S,D で移動
キーイベントに応じてワールド変換行列を操作する。
W,A,S,D で移動
void keyboard(unsigned char key, int x, int y)
{
printf( "Key Code : %d, Position : %d %dn", key, x, y );
// switch文を用いたキー処理の例(switch-caseを使う場合、breakの書き忘れに注意)
double size = 1.0;
switch(key) {
case 'a':
// x 軸正方向へ移動
wm[12] += size;
break;
case 'd':
// x 軸負方向へ移動
wm[12] -= size;
break;
case 'w':
// z 軸正方向へ移動
wm[14] += size;
break;
case 's':
// z 軸負方向へ移動
wm[14] -= size;
break;
default:
printf( "tKey: Other -> %cn", key );
}
glutPostRedisplay();
}
マウスでカメラの向きを変更
マウスイベントを拾い、ドラッグした大きさに応じてビュー変換行列を操作する。
マウスでカメラの向きを変更
void mousePressed(int button, int state, int x, int y)
{
printf( "Mouse Button: %d, State: %d, Position %d %dn", button, state, x, y );
// mouse down 時
if (! state) {
// 座標を記録しておく
mouse_pos.x = x;
mouse_pos.y = y;
}
}
マウスでカメラの向きを変更
void mouseDragged(int x, int y)
{
printf( "Mouse Drag Position %d %dn", x, y );
pos2d diff = {mouse_pos.x - x, mouse_pos.y - y};
mouse_pos.x = x;
mouse_pos.y = y;
y_rad += diff.x / window.w * M_PI / 5;
x_rad += diff.y / window.h * M_PI / 5;
// y 軸回転
vm_y[0] = cos(y_rad);
vm_y[2] = -sin(y_rad);
vm_y[8] = sin(y_rad);
vm_y[10] = cos(y_rad);
// x 軸回転
vm_x[5] = cos(x_rad);
vm_x[6] = sin(x_rad);
vm_x[9] = -sin(x_rad);
vm_x[10] = cos(x_rad);
// 視点の再計算
resize(window.w, window.h);
glutPostRedisplay(); // ウィンドウに再描画命令を送る(ポストする)
}
三角錐の自動回転
idle 関数内で定期的にワールド変換行列を操作する。
三角錐の自動回転
void idle()
{
// y 軸に対して毎度 1 度ずつ右ねじ回転
rad += M_PI / 180;
if (rad > M_PI * 2) {
rad = 0;
}
wm[0] = cos(rad);
wm[2] = -sin(rad);
wm[8] = sin(rad);
wm[10] = cos(rad);
glutPostRedisplay(); // ウィンドウに再描画命令を送る(ポストする)
}
デモ
http://git.io/NnYb
描画結果
法線ベクトルの指定
がおかしいので光の
反射が変。
参考資料
・OpenGL Documentation
https://www.opengl.org/sdk/docs/man2/xhtml/
・(Mac・iPhone)プリミティブについて - 強火で進め
http://d.hatena.ne.jp/nakamura001/20081231/1230719279
・OpenGL が世界を描画する仕組み - けんごのお屋敷
http://tkengo.github.io/blog/2014/12/27/opengl-es-2-2d-
knowledge-1/
・ビジュアル情報演習
http://www.wakayama-u.ac.jp/~wuhy/08_3DCGwithGLUT.html

More Related Content

PPTX
Cesiumを用いた3次元リアルタイムデータの可視化について
PPTX
テストコードの DRY と DAMP
PDF
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
PDF
SLAMチュートリアル大会 Direct Sparse Odometry 紹介
PPTX
確率ロボティクス第13回
PPTX
Go-ICP: グローバル最適(Globally optimal) なICPの解説
PDF
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
PDF
SLAMチュートリアル大会資料(ORB-SLAM)
Cesiumを用いた3次元リアルタイムデータの可視化について
テストコードの DRY と DAMP
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
SLAMチュートリアル大会 Direct Sparse Odometry 紹介
確率ロボティクス第13回
Go-ICP: グローバル最適(Globally optimal) なICPの解説
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
SLAMチュートリアル大会資料(ORB-SLAM)

What's hot (20)

PPTX
ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜
PDF
つくばチャレンジ2019技術調査報告
PDF
Getting started with MLOps
PDF
SSII2018TS: 3D物体検出とロボットビジョンへの応用
PDF
ImageJを使った画像解析実習〜数・形態・分布の解析〜
PPTX
Github Actionsで始めるROS/ROS2のCI
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PDF
うちのRedmineの使い方(2)
PDF
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
PPTX
ドメイン駆動設計とマイクロサービス
PDF
20190307 visualslam summary
PPTX
Structure from Motion
PDF
20190825 vins mono
PPTX
[DL輪読会]Whole-Body Human Pose Estimation in the Wild
PDF
MLOpsの概要と初学者が気をつけたほうが良いこと
PDF
DLL_言語系MicrosoftAIサービス最新情報_202302.pdf
PPTX
深層学習とTensorFlow入門
PDF
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
PDF
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜
つくばチャレンジ2019技術調査報告
Getting started with MLOps
SSII2018TS: 3D物体検出とロボットビジョンへの応用
ImageJを使った画像解析実習〜数・形態・分布の解析〜
Github Actionsで始めるROS/ROS2のCI
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
うちのRedmineの使い方(2)
ROS の活用による屋外の歩行者空間に適応した自律移動ロボットの開発
ドメイン駆動設計とマイクロサービス
20190307 visualslam summary
Structure from Motion
20190825 vins mono
[DL輪読会]Whole-Body Human Pose Estimation in the Wild
MLOpsの概要と初学者が気をつけたほうが良いこと
DLL_言語系MicrosoftAIサービス最新情報_202302.pdf
深層学習とTensorFlow入門
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
Ad

Viewers also liked (20)

PDF
ネイティブ原理主義
PPTX
OpenGLと行列
PDF
Math1 Vector
PDF
今Cinderが熱い! #cinder
ODP
The Introduction to Vector Graphics
DOCX
Rでの対称行列の固有値・固有ベクトルの最適な求め方
KEY
SurfaceTextureとシェーダを使って遊んでみる
PPTX
どこでも動くゲームを作るためのベタープラクティス
PDF
簡単!OpenGL ES 2.0フラグメントシェーダー
PDF
FiltersでGLSLを楽しく学んじゃおう!
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PPTX
Live2Dの描画の裏側の話
PDF
ピーFIの研究開発現場
PPT
視野変換1(基礎編)
PDF
GLSLによるシェーダーアートことはじめ
PDF
Dbts2015 tokyo vector_in_hadoop_vortex
PDF
数式を綺麗にプログラミングするコツ #spro2013
PDF
Tabc vol3 テクニカルアーティストを始めるにあたって
PPT
Direct xとopenglの隠蔽実装例
ネイティブ原理主義
OpenGLと行列
Math1 Vector
今Cinderが熱い! #cinder
The Introduction to Vector Graphics
Rでの対称行列の固有値・固有ベクトルの最適な求め方
SurfaceTextureとシェーダを使って遊んでみる
どこでも動くゲームを作るためのベタープラクティス
簡単!OpenGL ES 2.0フラグメントシェーダー
FiltersでGLSLを楽しく学んじゃおう!
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Live2Dの描画の裏側の話
ピーFIの研究開発現場
視野変換1(基礎編)
GLSLによるシェーダーアートことはじめ
Dbts2015 tokyo vector_in_hadoop_vortex
数式を綺麗にプログラミングするコツ #spro2013
Tabc vol3 テクニカルアーティストを始めるにあたって
Direct xとopenglの隠蔽実装例
Ad

Similar to OpenGL 3DCG (7)

PPTX
CG2013 09
PPTX
CG2013 08
PDF
さらに一歩踏み込んだCSS3の使い方!コツとポイントを理解して 楽しくサイトを彩る方法
PDF
Android OpenGL HandsOn
PPTX
CG2013 06
PDF
スマートフォン対応、気をつけたいトラブル JavaScript編
PPTX
CG2013 07
CG2013 09
CG2013 08
さらに一歩踏み込んだCSS3の使い方!コツとポイントを理解して 楽しくサイトを彩る方法
Android OpenGL HandsOn
CG2013 06
スマートフォン対応、気をつけたいトラブル JavaScript編
CG2013 07

More from Takenori Nakagawa (20)

PDF
TensorFlow 入門
PDF
機械学習を用いたパターンロック認証の強化手法
PDF
Docker で Deep Learning
PDF
GitHub Travis-CI Go!
PDF
Service Workers Push API Hands-on
PDF
Service Workers
PDF
01:artificial life
PDF
PDF
PDF
PDF
densan2014-late01
PDF
Git 初心者のための GitHub Pages
PDF
OpenIL vol.1
PPTX
後期講座08
PPTX
後期講座07
PPTX
後期講座05
PPTX
後期講座03
TensorFlow 入門
機械学習を用いたパターンロック認証の強化手法
Docker で Deep Learning
GitHub Travis-CI Go!
Service Workers Push API Hands-on
Service Workers
01:artificial life
densan2014-late01
Git 初心者のための GitHub Pages
OpenIL vol.1
後期講座08
後期講座07
後期講座05
後期講座03

OpenGL 3DCG