講義スライド3

Download Report

Transcript 講義スライド3

第9回 (2009/12/4)
航空宇宙機設計製図Ⅱ
2009年度
九州大学 工学部 機械航空工学科 航空宇宙工学コース
3年後期 金曜3限
谷 泰寛
ver. 2009/12/3
ワイヤフレームモデル
3次元形状モデルの種類
ワイヤフレームモデル
 点と線で表現
サーフェスモデル
ソリッドモデル
点、線、面で表現
 ソリッド(中身の詰まった
物体)により表現
面の重なりを考える必要がある。
3次元変換マトリックス
操作
変換マトリックス
平行移動
1 0 0

0 1 0
0 0 1

0 0 0

拡大・縮小
a

0
0

0

p

q
r

1 
0 0 0

b 0 0
0 c 0

0 0 1 
備考
x 軸方向に p
y 軸方向に q
z 軸方向に r
だけ移動
原点に対して
x 軸方向に a 倍
y 軸方向に b 倍
z 軸方向に c 倍
3次元変換マトリックス(回転)
x 
x 
 
 
y 
y 
         
z
z 


1 

1 

z


x' x
(x’, y’, z’)
y' y cos   z sin 
(x, y, z)
z' y sin   z cos 





x
y
1
0
0

0 cos  sin 

   
0 sin  cos 

0
0
0
cos 0 sin 

0
1
0

   
sin  0 cos

0
0
 0
cos sin  0

sin  cos 0

   
0
0
1

0
0
 0
0

0
0

1
0

0
0

1
0

0
0

1
物体をいろいろな方向から見る方法
視点
平面図
視点
視点
y
x
y
x
側面図
(a) 視点を動かす
(b) 物体を動かす
投影変換
z
z
投影平面
投影平面
投影中心
投影線
投影線
x
x
y
(a) 平行投影
(機械製図で用いられる)
y
(b) 透視投影
3次元図形を透視変換によって
スクリーン上に表示するプロセス
①
3次元ワールド座標系
③
②
視点座標系
正規透視座標系
スクリーン座標系
① 物体が記述されている XYZ直交座標系から視点を原点
にとった視点座標系への変換
② 視点座標系から正規透視座標系への変換
③ 正規透視座標系からディスプレイ上のスクリーン座標系
への変換
3次元図形を透視変換によって
スクリーン上に表示するプロセス
①
3次元ワールド座標系
③
②
視点座標系
正規透視座標系
A∞
Ye
Yw
スクリーン座標系
Ye
D∞
Ze
A
B∞
B
D
Ze
投影面
Xe
Xw
C∞
C
Xe
Zw
3次元ワールド座標系 ( Xw, Yw, Zw )
視点座標系 ( Xe, Ye, Ze )
3次元図形を透視変換によって
スクリーン上に表示するプロセス
①
3次元ワールド座標系
③
②
視点座標系
A∞
Ye
スクリーン座標系
正規透視座標系
Yp
D∞
Ze
A∞
A
B∞
Zp
A
B
D
B∞
投影面
D∞
C∞
B
C
D
投影面
C∞
Xe
視点座標系 ( Xe, Ye, Ze )
C
正規透視座標系 ( Xp, Yp, Zp )
Xp
3次元図形を透視変換によって
スクリーン上に表示するプロセス
①
3次元ワールド座標系
③
②
視点座標系
正規透視座標系
スクリーン座標系
Yp
1024
0
A
B
1.0
1.0
-1.0
A
B
D
C
Xp
投影面
768
D
-1.0
C
Ys
正規透視座標系 ( Xp, Yp, Zp )
スクリーン座標系 ( Xs, Ys )
Xs
3次元図形を透視変換によって
スクリーン上に表示するプロセス
視点座標系 ( Xe, Ye, Ze ) から正規透視座標系 ( Xp, Yp, Zp ) への変換
Ye
h
k
A
Ze
投影面
Xe
x p  1
  
y p  0
z p  0
  
w p  0
0 x e 
 
1 0
0 y e 
0 k /h k ze 
 
0 k /h 0 1 
0
0
Yp
A
1.0
Zp
1.0
Xp
正規透視座標系での図形は、0≦Zp≦1の
範囲のもののみが表示されると考える。
・Zp=0 → Ze=h
・Zp=1 → Ze=∞
航空機の表現
Start
エンジン
λ,γ,φ,θ,ψ
主翼
[ T(φ,θ,ψ) ]
水平尾翼
胴体
垂直尾翼
End
座標系
回転
3面図(正面図、平面図、側面図)
直線による曲線表現
NACA4桁 翼型
NACA4桁 翼型
肉厚曲線
2
3
4 

x 
x 
x 
x
x
   t1.4845
 0.6300 1.7580   1.4215   0.5075  
c 
c 
c  
c
c

平均キャンバ曲線
yA
y  2 x 2x A  x 
xA
y
yA
c  x A 
2
for 0  x  x A
c  x c  x  2x A 
for x A  x  c
yA /c = 0.02
xA /c = 0.4
NACA 2 4 0 9
t/c = 0.09
Four digits wings
作品(1)
作品(2)
作品(3)
作品(4)
隠れ線処理
隠れ線処理航空機
隠れ線(面)処理法の例
(1) 機体の表面を多数のポリゴン(四角形、三角形等)で表現.
(2) 各ポリゴンが視点の方を向いている → 見える(描く)
向いていない → 見えない(描かない)
※ポリゴンの法線ベクトルと、視線の方向ベクトルの内積を利用
単純な物体(球など)では、これでOK.
重なりがあるような場合には、以下の処理を追加
(3) 見える面について、視点から遠くの面から近くの面の順に
次々と重ね描いていく.
課題 3
(1) 航空機のワイヤフレーム平行投影図を描くプログラムを作成せよ.
(2) 上記プログラムを使用して,航空機の平面図,左側面図および正面
図、斜め上方前方より投影した図を出力せよ.
(3) プレゼンテーション用のパワーポイントデータを作成せよ.
提出物と提出期限
・プログラム説明書,プログラムリスト,計算結果出力図
2010年1月22日(金) 講義前までに提出 (課題2と同様にWord形式で)
・プレゼンテーション用パワーポイントデータ
2010年1月20日(水)
・[email protected] 宛てに電子メールにより提出のこと.
ファイル名は「自分の氏名3.ppt」等とすること.例えば、「谷泰寛3.ppt」
PowerPointによる発表
 発表日 : 2010年1月22日(金)
 発表時間: 2分間
 質疑時間: 1分間
 選んだ機体の概要、プログラミングや作図で工夫し
た点、作図結果の解説等を発表のこと.
31
補足
グラフィックス表示ルーチン群の改訂(ver.2)
グラフィックス表示ルーチン群
・XCgraphics.c
: Xlibを使って画面描画
・PSgraphics.f90 : 作画内容のEPSファイルを作成
に、座標値等に単精度実数型を使えるルーチンを追加した。
(例)直線を引くルーチン:
・call xcline ( x1, y1, x2, y2 ) : x1, y1, x2, y2 は整数型変数
・call xcliner ( x1, y1, x2, y2 ) : x1, y1, x2, y2 は実数型変数
・実数型のルーチン名は、整数型ルーチン名の最後に「r」を付けたものと
なっている。
・プログラムの所在、コンパイル法はこれまでと同じ。
32
XCgraphics.c, PSgraphics.f90 のサブルーチン(1/3)
・Windowの生成、終了
機能
整数型ルーチン
Create Window
幅screen_width高さ
screen_heightのウインドウを
生成する
call xcinit ( screen_width,
screen_height )
integer screen_width,
screen_height
Close Window
ウインドウを閉じる
call xcclose ( pi1 )
integer pi1
実数型ルーチン
call xcinitr ( screen_width,
screen_height )
real screen_width,
screen_height
・引数の型に依存しないもの
機能
Set Color
描画する色を設定する.
Fortranからの呼び出し,引数
call xccolor ( cn )
integer cn
0: black, 1: white, 2: blue, 3: red, 4: magenta,
5: green, 6: cyan, 7: yellow, 8: orange
Set line width
線の太さをline_widthピクセルに設定する
call xclinewidth ( line_width )
integer line_width
33
XCgraphics.c, PSgraphics.f90 のサブルーチン(2/3)
機能
整数型ルーチン
実数型ルーチン
Draw point
座標(x,y)に点を描く
call xcpoint ( x, y )
integer x, y
call xcpointr ( x, y )
real x, y
Draw points
np個の座標(xpoint(i),ypoint(i))
に点を描く
call xcpoints ( xpoint, ypoint, np )
integer np, xpoint(np),
ypoint(np)
call xcpointsr ( xpoint, ypoint, np )
integer np
real xpoint(np), ypoint(np)
Draw line
座標(x1,y1),(x2-y2)点間に直
線を描く
call xcline ( x1, y1, x2, y2 )
integer x1, y1, x2, y2
call xcliner ( x1, y1, x2, y2 )
real x1, y1, x2, y2
Draw line
座標(x1,y1),(x2-y2)点間に直
線を描く
call xcline ( x1, y1, x2, y2 )
integer x1, y1, x2, y2
call xcliner ( x1, y1, x2, y2 )
real x1, y1, x2, y2
Draw lines
座標(xpoint(i),ypoint(i)), i=1,
npに与えられた点を結んだ折
れ線を描く
call xclines ( xpoint, ypoint, np )
integer np, xpoint(np),
ypoint(np)
call xclinesr ( xpoint, ypoint, np )
integer np
real xpoint(np), ypoint(np)
Draw rectangle
座標(x,y)に幅width高さ
heightの長方形を描く
call xcrect ( x, y, width, height )
integer x, y, width, height
call xcrectr ( x, y, width, height )
real x, y, width, height
34
XCgraphics.c, PSgraphics.f90 のサブルーチン(3/3)
機能
整数型ルーチン
実数型ルーチン
Fill rectangle
座標(x,y)に幅width高さheight
の長方形を塗りつぶす
call xcfillrect ( x, y, width, height )
integer x, y, width, height
call xcfillrectr ( x, y, width, height )
real x, y, width, height
Fill polygon
座標(xpoint(i),ypoint(i)), i=1,
npを頂点とする多角形の内部を
塗りつぶす
call xcpolygon ( xpoint, ypoint, np ) call xcpolygonr ( xpoint, ypoint, np )
integer np, xpoint(np), ypoint(np)
integer np
real xpoint(np), ypoint(np)
Draw arc
座標(x,y)を中心として、幅width
高さheightの円弧を描く
call xcarc ( x, y, width, height,
angle1, angle2 )
integer x, y, angle1, angle2,
width, height
call xcarcr ( x, y, width, height,
angle1, angle2 )
real x, y, angle1, angle2, width,
height
Fill arc
座標(x,y)を中心として、幅width
高さheightの円弧の内部を塗り
つぶす
call xcfillarc ( x, y, width, height,
angle1, angle2 )
integer x, y, angle1, angle2,
width, height
call xcfillarcr ( x, y, width, height,
angle1, angle2 )
real x, y, angle1, angle2, width,
height
Draw string
座標(x,y)にn文字の文字列strを
出力する
call xcstring ( x, y, str, n )
integer x, y, n
character str
call xcstringr ( x, y, str, n )
integer n
real x, y
character str
35
XCgraphics.c, PSgraphics.f90 の使用例
sample5.f90
program sample5
implicit none
integer i, j, n, xpoint(10), ypoint(10), np
real xpointr(10), ypointr(10)
real pi
character a*1
! call xcinit ( 400 , 300 )
call xcinitr ( 500.5, 400.5 )
call xccolor ( 2 )
call xcpoint ( 60 , 10 )
call xcpointr ( 66.0, 10.0 )
call xccolor ( 2 )
call xcline ( 10 , 10 , 300 , 300 )
call xcliner ( 10.0, 20.0, 300.0, 310.0 )
call xccolor ( 5 )
call xclinewidth ( 5 )
call xcline ( 10 , 300 , 300 , 10 )
call xcliner ( 20.0, 310.0, 310.0, 20.0 )
call xccolor ( 9 )
call xcfillrect ( 30 , 100 , 50 , 30 )
call xcfillrectr ( 40.0, 110.0, 60.0, 40.0 )
call xccolor ( 4 )
call xclinewidth ( 1 )
call xcrect ( 30 , 100 , 50 , 30 )
call xcrectr ( 40.0, 110.0, 60.0, 40.0 )
call xcarc ( 90 , 200 , 60 , 100 , 0 , 360 )
call xcarcr (100.0, 210.0, 70.0, 110.0, 0.0, 360.0 )
call xccolor ( 8 )
call xcfillarc ( 220 , 230 , 150 , 150 , 5 , 335 )
call xccolor ( 7 )
call xcfillarcr ( 200.0, 240.0, 160.0, 160.0, 5.0, 335.0 )
call xccolor ( 0 )
call xcstring ( 60 , 55 , "Sample5.f", 9 )
call xcstringr ( 70.0, 65.0, "Sample5.f / real", 16 )
pi = 4.0 * atan( 1.0 )
np = 6
do i = 1, 6
xpointr (i) = 200.0 + 40.0 * cos ( ( i - 1 ) * 72.0 * pi / 180.0 )
ypointr (i) = 100.0 + 40.0 * sin ( ( i - 1 ) * 72.0 * pi / 180.0 )
xpoint (i) = int( xpointr (i) + 10.0 )
ypoint (i) = int( ypointr (i) + 10.0 )
end do
call xccolor ( 6 )
call xcpolygon ( xpoint , ypoint , np )
call xcpolygonr ( xpointr, ypointr, np )
call xclinewidth ( 3 )
call xccolor ( 3 )
call xclines ( xpoint , ypoint , np )
call xclinesr ( xpointr, ypointr, np )
call xccolor ( 9 )
call xcpoints ( xpoint , ypoint , np )
call xcpointsr ( xpointr, ypointr, np )
write (6,*) "press enter"
read (5,'(a)') a
call xcclose
end program sample5
36
XCgraphics.c, PSgraphics.f90 の使用例
sample5.f90の出力結果
XCgraphics.cによる画面表示
PSgraphics.f90によるepsファイルを貼付
Tips
画面の表示を拡大したいとき、
● 「control」キーを押しながら、マウスのスクロールボタンを
動かす。
37