NB

Similar documents
JAPLAシンポジウム資料 2009/12/5

JAPLA研究会資料 2013/5/25

Fair Curve and Surface Design System Using Tangent Control

OpenGL & GLUTの基本関数の説明

/*p7-1-1*/

コンピューターグラフィックスS

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックスS 演習資料

Microsoft PowerPoint - info_eng3_05ppt.pptx

3D グラフィックス処理の一般過程 1. 3D グラフィックス処理の一般過程

コンピューターグラフィックスS

コンピューターグラフィックスS

manual.dvi

スライド 1

STEP 数学 Ⅰ を解いてみた から直線 に下ろした垂線の足を H とすると, H in( 80 ) in より, S H in H 同様にして, S in, S in も成り立つ よって, S in 三角形の面積 ヘロンの公式 in in 辺の長

コンピューターグラフィックスS

1 1. Program 1 OpenCV (OpenCV Sample001) 1 /* 2 - > - > - >VC++ 3 ( ) 4 C:\opencv\build\include 5 ( ) 6 C:\opencv\build\x86\vc10\lib 7 - > - > - > - >

1 3 2 OpenGL 4 3 OpenGL 5 4 OpenGL 6 OpenGl : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6 : : : : : : : : : : : : : : : : : : : : :

コンピュータグラフィックス特論Ⅱ

0 21 カラー反射率 slope aspect 図 2.9: 復元結果例 2.4 画像生成技術としての計算フォトグラフィ 3 次元情報を復元することにより, 画像生成 ( レンダリング ) に応用することが可能である. 近年, コンピュータにより, カメラで直接得られない画像を生成する技術分野が生

3D の作図ツールについて 3D 画面を表示すると 以下の新しい作図ツールが表示されます より多くのオプションを見るためには ボタンの右下の小さな矢印 をクリックして下さい 28

OpenGL Programming Course OpenGL Programming Course FAQ

補足 中学で学習したフレミング左手の法則 ( 電 磁 力 ) と関連付けると覚えやすい 電磁力は電流と磁界の外積で表される 力 F 磁 電磁力 F li 右ねじの回転の向き電 li ( l は導線の長さ ) 補足 有向線分とベクトル有向線分 : 矢印の位

vecrot

J-OOPによる数独ゲーム

コンピュータグラフィックス第8回

ライティングの基本要素ライト ( 光源 ) の位置や種類 強さを決め モデルやシーンの見せ方を決めることをライティングとよぶ また モデルの表面での光の反射の度合いを調節することで ライティングの効果を変化させることができる 今回は ライティングの基本的な要素を解説し SketchUp のライティン

p tn tn したがって, 点 の 座標は p p tn tn tn また, 直線 l と直線 p の交点 の 座標は p p tn p tn よって, 点 の座標 (, ) は p p, tn tn と表され p 4p p 4p 4p tn tn tn より, 点 は放物線 4 p 上を動くこと

2017年度 神戸大・理系数学

コンピュータグラフィックス第6回

untitled

免許法認定公開講座: コンピュータグラフィックス

2015年度 岡山大・理系数学

XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1-

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックス特論Ⅱ

数学 Ⅲ 無限等比級数の問題解答 問 1 次の無限級数の和を求めよ (1) (5) (2) (6) (7) (3) ( 解 )(1) 初項 < 公比 < の無限等比級数より収束し (4) (2) (3) その和は ( 答 ) であるから 初項 < 公比 となっている よって 収束し その和は よって

殿塚勲 藤原祥史 吉田政春 を観察しながら各面の色の塗り分けをしてゆくと, 色の塗り分けの全体像が理解しやすく, 色の種類の最小解にたどりつくことが分かった この方法によればグローバルな見地から色の塗り分けができ, かつ色の種類が最小であることの見通しを直観的に理解できることがよい点である ここで得

(Microsoft Word - \213\363\212\324\220}\214`_\220\263\216l\226\312\221\314_.doc)

Sudoku2

計算幾何学入門 Introduction to Computational Geometry

#include <stdio.h> 2 #include <stdlib.h> 3 #include <GL/glut.h> 4 Program 1 (OpenGL GameSample001) 5 // 6 static bool KeyUpON = false; // 7 sta

2 2 OpenGL ( ) OpenGL ( ) glclearcolor(glclampf red, GLclampf green, GLclampf

PowerPoint プレゼンテーション

Tekutama AR ~ 拡張現実感によるオーバーレイ表示と動作 ~ 情報物理研究室 渡部 修平 1

中学 1 年生 e ライブラリ数学教材一覧 学校図書 ( 株 ) 中学 1 年 数学 文字式式の計算 項と係数 中学 1 年 数学 次式 中学 1 年 数学 項のまとめ方 中学 1 年 数学 次式の加法 中学 1 年 数学 77

謗域・ュ逕ィppt

20~22.prt

/* drawing function */ function_graph();// drawing graph glflush(); int main(int argc, char **argv ) glutinit( &argc, argv ); glutinitdisplaymode( GLU

2017年度 長崎大・医系数学

モデリングとは

< D8C6082CC90AB8EBF816989A B A>

2 3 OpenGL 2 OpenGL OpenGL(Open Graphics Library) Silicon Graphics (SGI) 3D OpenGL SGI HP, SUN, IBM UNIX Linux, FreeBSD PC UNIX Windows, Mac OS API PD

2 2 OpenGL OpenGL OpenGL(Open Graphics Library) Silicon Graphics (SGI) 3D OpenGL SGI HP, SUN,

中学 1 年数学 ( 東京書籍 ) 単元別コンテンツ一覧 単元ドリル教材解説教材 確認問題ライブラリ (OP) プリント教材 教材数 :8 問題数 : 基本 40, 標準 40, 挑戦 40 正の数 負の数などの問題を収録 解説教材 :3 確認問題 :3 数直線 数の大小と絶対値などの解説 確認問題

double rx[natom], ry[natom], rz[natom]; 原子の座標 速度 力 ポテンシャルエ double vx[natom], vy[natom], vz[natom]; ネルギーを受ける配列を準備 double fx[natom], fy[natom], fz[natom

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

untitled

沼津工業高等専門学校

エンマの唇

学習指導要領

座標系.rtf

複素数平面への誘い

Transcription:

JAPLA 研究会資料 2010/2/27 J の OpenGL グラフィックス - その 7 - フラー ドームと照光表示 - 西川利男 0. はじめに OpenGL 正多面体グラフィックスとして 今回はフラー ドームに挑戦してみた バックミンスター フラー (Richard Buckminster Fuller, 1895-1983 は多才な建築家 科学者 思想家として知られ その名前を冠した (eponymous フラー ドームは世界各地の記念碑的建築物として話題を呼んでいる これは正 20 面体の面をさらに分割して出来た 一種の球面近似の立体であり 富士山頂のレーダー ドームにその形を見た人も多いだろう このようなグラフィックスでは 各面を色で塗り分けるのはあまり実用的ではない ふつうはそれぞれの面を明暗で示す照光表示で行う これと境界線だけのワーヤーフレームの 2 種類のフラー ドームのグラフィックスを比較して示す - 1 -

1. フラー ドームの頂点座標フラー ドームを図示するには次のように行う 単位となる正 20 面体の正 3 角形の各頂点の中点をとり これを正 20 面体の外接球まで膨らました点を新たに頂点として作る これらの点を 3 つずつつないで正 3 角形を作る このようにして 正 20 面体の 1 つの面から 4 つの正 3 角形ができる つまり全部で 80 の面から成る多面体ができる これがフラー ドームと呼ばれるものである なお もうこのときは多面体ではあるが 正多面体ではなくなる 最初に出発点として正 20 面体の頂点座標が必要になるが それには J の locale 機能を用いて 前回のプログラム [1] をそのまま利用することができる [1] 西川利男 J の OpenGL グラフィックス - その 4 - 正 12 面体と正 20 面体の頂点座標の計算 - JAPLA シンポジウム資料 2009/12/5 まず 次のように前回のプログラムファイルをロケール 'polyh' に登録する 'polyh' load 'user\polyhedron.ijs' すると この中の動詞 名詞が自由に使えるので 頂点座標 VIC と連結インデックス INDIC は次のように得られる VIC =: icosa_polyh_ 2 INDIC =: IND_ICO_polyh_ 一般に 2つ点 A と B とが与えられたとき 中点 D の座標は次のようにして求められる 1 VD = ( VA + VB 2 ここで VA VB, VD は点 A, B, D のそれぞれ座標値 (X, Y, Z である 次に この点を外接球まで延長するには Dから中心までの距離 Dから中心までの距離 Ratio = = 外接球の半径 Aから中心までの距離 なる比を掛けて正規化すればよい これを正 3 角形 ABC の各頂点に対して行う このようなフラー ドームの頂点座標を得て 4 つの正 3 角形を描く J の関数 fuller は次のように定義される fuller =: 3 : 0 'VA VB VC' =. y. R =. %: +/ *: VA VD =. -: VA + VB Ratio =: (%: +/ *: VD % R VD =. Ratio * VD VE =. -: VB + VC VE =. Ratio * VE VF =. -: VC + VA VF =. Ratio * VF polygon >VA;VD;VF polygon >VD;VB;VE polygon >VF;VE;VC polygon >VD;VE;VF - 2 -

なお ここで使用している関数 polygon は前回も使用したが 複数の頂点から多角形を描く処理を OpenGL の書式に合わせて まとめてコーディングするものである polygon=: 3 : 0 glbegin GL_POLYGON y =. y. n =. #y i =. 0 while. i < n do. glcolor 1 1 1 0 glvertex > i { y i =. i + 1 glend'' 2. 照光処理と法線ベクトル OpenGL の照光 (Lighting 表示とは次のような原理に基づいている 3 次元表示された立体のある面に対して適当な光を当てると 光と面との傾斜角に応じて明暗に差が生ずる これにより面の凹凸が明らかになり立体感があらわれる OpenGL の操作としては レンダリングとモデリングの両方が必要である まず レンダリングについて行う 立体表面の明るさは次に図示したように 3 つの要素に分けられる (a 環境光 (ambient light (b 拡散光 (diffuse light (c 鏡面光 (specular light そして これは OpenGL のレンダリング プログラムとして次の書式で示す light=: verb define gllight GL_LIGHT0, GL_AMBIENT, 0.1 0.1 0.1 1 gllight GL_LIGHT0, GL_DIFFUSE, 0.6 0.6 0.6 1 gllight GL_LIGHT0, GL_SPECULAR, 0.0 0.0 0.0 1 gllight GL_LIGHT0, GL_POSITION, 0.0 0.0 1.0 0 NB. Parallel Light NB. gllight GL_LIGHT0, GL_POSITION, 4.0 6.0 10.0 1 NB. Positioned Light glenable GL_LIGHT0 glenable GL_LIGHTING glmaterial GL_FRONT,GL_AMBIENT_AND_DIFFUSE, 1 0 0 1-3 -

すなわち オブジェクト GL_LIGHT0 に対して その方式を指定しコマンド glenable で有効化する また glenable GL_LIGHTING は照光処理の実行である これらを立体の材質特性 (Material として 前方表面 (GL_FRONT に対して指定する なお GL_POSITION の指定により平行光源 点光源の選択も可能である 一方 モデリングとしては モデルの立体面の向きを示してやらなくてはならない そのためには面の法線ベクトルを利用することが必要になる 法線ベクトルとは 3 次元上の 3 つの点 P0, P1, P2 で定まる 1 つの平面に対して垂直なベクトル N である これはベクトルを用いて ベクトル積として得られる N = ( P1 P0 ( P2 P0 これを行う J の関数は次のようになる norm_vec =: 3 : 0 M =. > y. NX =. -/. * (<0 1;1 2 { M NY =. - -/. * (<0 1;0 2 { M NZ =. -/. * (<0 1;0 1 { M NX, NY, NZ ここで 上図のように 3 つの点を左まわり 右ネジの向きに取ったとき 正の法線ベクトルが得られるようにした 頂点の取り方の順序には注意が必要である 先に出した多角形表示の関数 polygon は次のような関数 polygonnormal に修正される すなわち右引数は頂点の値を 左引数には上の norm_vec で得られた法線ベクトルの値を入れる すると OpenGL 処理としてはこの法線ベクトルに対して glnormal を作用させることにより 照光処理を行ったモデリングプログラムとなる polygonnormal=: 4 : 0 glbegin GL_POLYGON glnormal x. NB. revised by TN. y =. y. n =. #y i =. 0 while. i < n do. glvertex > i { y i =. i + 1 glend'' 以上 レンダリングの light モデリングの polygonnormal の 2 つの追加により OpenGL 照光処理のグラフィックスが実行される - 4 -

3. プログラムの実行例 OpenGL 照光処理のテストのために ドラム状の立体を表示してみる フラー ドームは最初のページに示したが 中央部分を除いたスケレトン表示は裏側のようすがわかり これもなかなかおもしろい - 5 -

プログラム リスト NB. OpGLN_Fuller.ijs NB. 2010/2/10 OK NB. Fuller Dome with Lighting NB. run '' => Fuller Solid NB. run 0 => Fuller Skeleton NB. run 1 => Fuller Wired NB. run 2 => Icosahedron NB. run 3 => Dodecahedron NB. run 4 => Octahedron NB. run 5 => Drum require 'gl3' A=: 0 : 0 pc a closeok; xywh 0 0 220 200;cc g isigraph ws_clipchildren ws_clipsiblings rightmove bottommove; pas 0 0; rem form end; run=: a_run a_run=: 3 : 0 T =: y. NB. Select '' = Fuller wd :: ] 'psel a;pclose' wd A glarc '' LS =: 0 NB. LS=1: Fill LS<>1: Line Hid =: 1 R =: 0 0 0 glafont 'arial 30' glausefontbitmaps 0 32 26 32 wd 'pshow;ptop' NB. paint a model picture ======================================= a_g_paint =: verb define glclearcolor 1 1 1 0 glclear GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT glenable GL_DEPTH_TEST glmatrixmode GL_MODELVIEW glloadidentity'' gltranslate 0 0 0 NB. for Ortho - 6 -

NB. gltranslate 0 0 _10 NB. for Perspective light '' if. 0 = #T do. drawfuller '' select. T case. 0 do. drawfuller '' case. 1 do. drawfuller '' case. 2 do. drawicosa '' NB. Omitted Listing case. 3 do. drawdodec '' NB. Omitted Listing case. 4 do. drawocta '' NB. Omitted Listing case. 5 do. drawdrum '' drawtext'' glaswapbuffers '' NB. project the picture on the screen =================== a_g_size =: verb define glviewport 0 0, glqwh '' glmatrixmode GL_PROJECTION glloadidentity '' glortho _2 2 _2 2 _2 2 NB. Ortho wh =: glqwh '' NB. gluperspective 90, (%/wh,1 30 NB. key-in x, y, z, X, Y, Z for rotation a_g_char =: verb define R =: 360 R + 5 * 'xyz' = 0 { sysdata R =: 360 R - 5 * 'XYZ' = 0 { sysdata NB. LS =: ('w' = 0 { sysdata { LS, -. LS NB. Hid =: ('h' = 0 { sysdata { Hid, -. Hid glpaintx'' NB. indicate rotated angle x, y, z in degree ============ drawtext =: verb define glmatrixmode GL_MODELVIEW glloadidentity '' glcolor 0 0 0 0 glrasterpos _2 _1.9 0 glcalllists 5 ": R - 7 -

NB. Lighting & Normal Vector ============================================ norm_vec =: 3 : 0 M =. > y. NX =. -/. * (<0 1;1 2 { M NY =. - -/. * (<0 1;0 2 { M NZ =. -/. * (<0 1;0 1 { M NX, NY, NZ light=: verb define gllight GL_LIGHT0, GL_AMBIENT, 0.1 0.1 0.1 1 gllight GL_LIGHT0, GL_DIFFUSE, 0.6 0.6 0.6 1 gllight GL_LIGHT0, GL_SPECULAR, 0.0 0.0 0.0 1 glenable GL_LIGHTING glenable GL_LIGHT0 glmaterial GL_FRONT,GL_AMBIENT_AND_DIFFUSE, 1 0 0 1 polygon=: 3 : 0 glbegin GL_POLYGON y =. y. n =. #y i =. 0 while. i < n do. glcolor 1 1 1 0 glvertex > i { y i =. i + 1 glend'' NB. Lighting version of polygon polygonnormal=: 4 : 0 glbegin GL_POLYGON gledgeflag GL_TRUE glnormal x. NB. revised by TN. y =. y. n =. #y i =. 0 while. i < n do. glvertex > i { y i =. i + 1-8 -

glend'' normpolygon =: 3 : 0 V =. y. 'VA VB VC' =. 3 {. V (norm_vec (VB-VA;(VC-VA polygonnormal V NB. Drum Graphic for Test Lighting ====================================== DS =: 0.5 DC =: 0.866 D0 =: 1, 0, 1 D1 =: _1, 0, 1 D2 =: 1, DS, DC D3 =: _1, DS, DC D4 =: 1, DC, DS D5 =: _1, DC, DS D6 =: 1, 1, 0 D7 =: _1, 1, 0 D8 =: 1, DC, -DS D9 =: _1, DC, -DS D10 =: 1, DS, -DC D11 =: _1, DS, -DC D12 =: 1, 0, _1 D13 =: _1, 0, _1 drawdrum =:verb define glmatrixmode GL_MODELVIEW glloadidentity '' glclearcolor 1 1 1 0 glclear GL_COLOR_BUFFER_BIT gltranslate 0 0 0 glrotate R,. 3 3 $ 1 0 0 0 glpolygonmode GL_BACK, Hid{GL_LINE, GL_POINT glmaterial GL_FRONT,GL_AMBIENT_AND_DIFFUSE, 0 1 0 1 NB. Green normpolygon D0;D2;D3;D1 normpolygon D2;D4;D5;D3 normpolygon D4;D6;D7;D5 normpolygon D6;D8;D9;D7 normpolygon D8;D10;D11;D9-9 -

normpolygon D10;D12;D13;D11 NB. import polyhedron.ijs ========================================= 'polyh' load 'user\polyhedron.ijs' VIC =: icosa_polyh_ 2 INDIC =: IND_ICO_polyh_ NB. Fuller Dome =================================================== drawfuller =:verb define glmatrixmode GL_MODELVIEW glloadidentity '' glclearcolor 1 1 1 0 glclear GL_COLOR_BUFFER_BIT gltranslate 0 0 0 glrotate R,. 3 3 $ 1 0 0 0 glpolygonmode GL_BACK, Hid{GL_LINE, GL_POINT glmaterial GL_FRONT,GL_AMBIENT_AND_DIFFUSE, 0 1 0 1 NB. Green I =. 0 while. I<20 do. fuller (>I{INDIC { VIC I =. I + 1 fuller =: 3 : 0 VV =. y. R =. {. +/"(1 *: VV 'VA VB VC' =. VV VD =. -: VA + VB Ratio =: (%: R % %: +/ *: VD VD =. Ratio * VD VE =. -: VB + VC VE =. Ratio * VE VF =. -: VC + VA VF =. Ratio * VF if. (0 = #T +. (0 = T do. glpolygonmode GL_FRONT_AND_BACK, GL_FILL normpolygon >VA;VD;VF normpolygon >VD;VB;VE normpolygon >VF;VE;VC if. 0 = #T do. normpolygon >VD;VE;VF glpolygonmode GL_FRONT, GL_LINE - 10 -

glpolygonmode GL_BACK, GL_POINT polygon >VA;VD;VF polygon >VD;VB;VE polygon >VF;VE;VC polygon >VD;VE;VF - 11 -