...

M - Embarcadero Community

by user

on
Category: Documents
37

views

Report

Comments

Transcript

M - Embarcadero Community
【C4】 テクニカルケーススタディ
テク カルケ ススタデ
慶應義塾大学大学院 理工学研究科
藤代研究室 研究生 中山 雅紀
中山雅紀
身分 ①


慶應義塾大学大学院 理工学研究科
藤代研究室 研究生
藤代 一成
成
 球面幾何に基づく情報処理
 球面ディスプレイ
 フォトリアルレンダリング
 立体視映像
慶應義塾大学 矢上キャンパス
身分 ②

和洋女子大学
和洋女子大学 講師
山本 高美
 アパレルCAD

山本研究室 共同研究者
 3Dアパレルデザイン
② 人体形状分析アプリケーション
① 3D スキャナ
人体 3D モデル
断面輪郭データ
前面
2011-A1岡
パーツ2
Layer
④ 縫製
⑤ スカート着装
スカート
パターン
③ スカート原型プラグイン
身分 ③

日蓮宗 玉泉山 安国院 副住職
 テレビ朝日「ちい散歩」で 故・地井武男 さんも参詣
中山雅紀
中学時代

「フラクタル幾何学」に出会う
 名著『フラクタルとは何か』

CGの美しさに魅せられる
 教育用プログラミング言語「LOGO」
高校時代 ①


Delphi に出会う
複素系フラクタルに魅せられる
高校時代 ②

「レンダリング」事始め
 Z-Buffer法
大学時代 ①

「ステレオグラム」の描画に成功
 宝島社からオファー
大学時代 ②

フラクタルも進化
 画質にこだわり始める
中山雅紀
『 孔雀 』

複素系フラクタルへのテクスチャマッピング
複素系フラクタル
のテクスチャマッピング
『 果てを越える空 』

ブラックホールによる時空歪みの可視化
ブラックホ
ルによる時空歪みの可視化
曲線レイトレーシング
『 摂理の明窓 』

2次元陰関数の適応メッシュ分割
ドロネー図
『 sprout of cosmos 』

リ マン球面による
リーマン球面による
複素系フラクタルの立体化
『 夢限燈華 』

Buddhabrot の探求
『 captive julia 』


3Dジュリア集合の
ポリゴン化
3次元陰関数の
適応メッシュ分割
『 shelling julia 』

3Dプリンタによる具現化
『 FLOSVOLARE 』

マンデルブロ集合の
スペクトル可視化
中山雅紀
学士研究

『微粒子形状に基づく大気散乱光シミュレーション』
『微粒子形状に基づく大気散乱光シミュレ
ション』
 雪の基本結晶「氷晶」による太陽光散乱現象を再現
結果
氷晶における大気散乱光シミ レ シ ン
氷晶における大気散乱光シミュレーション
ランダム姿勢
• 内暈(22度ハロ)
• 外暈(46度ハロ)
垂直姿勢
水平姿勢
• 幻日
• 外接ハロ
• 映日
• 映幻日
• 環水平アーク
• タンジェントアーク
• ラテラルアーク
• 幻日環
• 映日アーク
23
修士研究

『関与媒体における複雑な散乱光のレンダリング』
 散乱特性を球面ウェーブレットで情報圧縮
F: 5
F: 15
F: 40
F: 5
F: 15
F: 40
動画への応用
ライトピラー以外の光学現象の再現
現行研究 ①

球面幾何に基づく情報処理
 曲面生成
 モーションデータ処理
モ ションデ タ処理
 球面データ構造
現行研究 ②

球面ディスプレイ
 20面体をベース
 ㈱五藤光学研究所
現行研究 ③

3Dアパレルデザイン
 3Dスキャナによる人体計測
 和洋女子大学 山本研究室
現行研究 ④

学習/研究に適した レイトレ
レイトレーシング
シング フレ
フレームワーク
ムワ ク
藤代研究室
研究分野



フォトリアリティ
ユーザーインタフェース
ビジュアライゼーション
ビジュアライゼ
ション
藤代研究室
金子徳秀

『葉脈パタ ンを反映した
『葉脈パターンを反映した
虫食い跡をもつ葉のビジュアルシミュレーション』
 葉の生物学特性に基づいた虫食いシミュレ
葉の生物学特性に基づいた虫食いシミュレーション
ション
佐野昂洋

『大規模半構造デ タに対する
『大規模半構造データに対する
環境可視化システムの提案』
 内包構造や階層構造を持つデ
内包構造や階層構造を持つデータの閲覧システム
タの閲覧システム
芳賀直樹

『基礎的リズムパターンにおけるグルーヴの可視化』
『基礎的リズムパタ
ンにおけるグル ヴの可視化』
 音楽におけるグルーブ感の品質解析
北見 翔

『布における折り目生成のビジュアルシミュレーション』
『布における折り目生成のビジュアルシミュレ
ション』
 繊維の塑性特性
コンタクト

中山雅紀
 サイト





:
メール :
f
facebook:
b k:
YouTube :
Twitter :
http://www.luxidea.net
[email protected]
htt //
http://www.facebook.com/luxidea
f
b k
/l id
http://www.youtube.com/luxidea
https://twitter.com/luxidea
藤代研究室
 サイト
 メール
メ ル
: http://www.fj.ics.keio.ac.jp
: [email protected]
contact@fj ics keio ac jp
○ 藤代一成: [email protected]
○ 中山雅紀: [email protected]
 facebook: http://www.facebook.com/fujishiro.lab
http://www facebook com/fujishiro lab
 YouTube : http://www.youtube.com/fujishirolab
FireMonkey テクニック
意義


2D/3D GUI フレ
フレームワーク
ムワ ク
マルチプラットフォーム
 OS固有APIからの脱却

CG と GUI の融合
CG と UI

両者ともツリー構造で表現できる
両者ともツリ
構造で表現できる
床
机
コップ
赤リンゴ
TFrom
椅子
皿
人間
青リンゴ
CGにおけるオブジェクトの関係
TGroupBox
TLabel
TPanel
TViewport3D
TSphere
TButton
TCube
UIにおけるコンポーネントの関係
床
シーングラフ
シ
ングラフ

木材
シ ン構造を各種ノ ドの
シーン構造を各種ノードの
非循環有向グラフ(DAG)として表現
 オブジェクトノ
オブジェクトノード
ド
 座標変換ノード
 マテリアル(質感)ノ
マテリアル(質感)ノード
ド
複数の親で
インスタンス(コピー)
を表現
前
40cm
後
40cm
机
椅子
上
70cm
肌
ガラス
陶器
上
40cm
コップ
皿
人間
左
10cm
緑
赤
右
10cm
10
リンゴ
シーングラフ
シ
ングラフ @ FireMonkey

ツリー構造
ツリ
構造
床
木材
 複数の親を持たない


座標変換は
オブジェクトと統合
マテリアルはツリーに
マテリアルはツリ
に
上70cm
含まれない
前40
前40cm
後40
後40cm
陶器
机
上70cm
コップ
 下流には
椅子
上40cm
皿
人間
適応されない

インスタンスは
専用のノードで
ガラス
ラ
右10cm
リンゴ
赤
左10cm
肌
(インスタンス)
緑
FireMonkey テクニック
種類
Z

反転した右手座標系
X
 X: 親指
 Z: 中指
Y
右手 座標系
左手 座標系
Y
Y: 人差し指
Y
FireMonkey
Y
Z
X
X
Z
Direct3D
OpenGL
基準

ローカル座標
ロ
カル座標
ワールド
球体
立方体
 オブジェクト座標

グローバル座標
グロ
バル座標
相対
 ワールド座標
 絶対座標

ローカル
ロ カル
ローカル
相対座標
 TControl3D
が保持
絶対
絶対
グローバル
グロ バル
FireMonkey テクニック
同次座標系

座標変換
A
Bl
>
B
X
/B l W
B
H>
H
X
B l Y /B l W =
BY = B
B l Z /B l W
BZ
座標変換は行列(4×4)の演算で表現できる
 位置座標
>M
M
H>A H >M
11
M
12
M
13
M
14
AX
21
M
22
M
23
M
24
Y
M
31
M
32
M
33
M
34
AZ
M
41
M
42
M
43
M
44
1
#
=
H >B l H
11
AX+ M
12
AY+ M
13
AZ+ M
14
21
AX+ M
22
AY+ M
23
AZ+ M
24
M
31
AX+ M
32
AY+ M
33
AZ+ M
34
Bl Z
M
41
AX+ M
42
AY+ M
43
AZ+ M
44
BlW
11
AX+ M
12
AY+ M
13
AZ
21
AX+ M
22
AY+ M
23
AZ
H >B l H
M
31
AX+ M
32
AY+ M
33
AZ
Bl Z
M
41
AX+ M
42
AY+ M
43
AZ
M
Bl X
=
Y
 ベクトル(方向のみ)
>M
M
H>A H >M
11
M
12
M
13
M
14
AX
21
M
22
M
23
M
24
Y
M
31
M
32
M
33
M
34
AZ
M
41
M
42
M
43
M
44
0
#
M
=
Bl X
=
Y
BlW
ベクトル仕様
クトル仕様

行ベクトル:
行
クトル DirectX, FireMonkey
>
M
6
AX
AY
@M
1#
M
AZ
M
12
M
13
M
14
21
M
22
M
23
M
24
31
M
32
M
33
M
34
M 41 M 42 M 43 M 44
M 11 A X +
M 12 A X +
M
M 21 A Y +
M 22 A Y +
M
M 31 A Z +
M 32 A Z +
M
>
=
M

H
11
M
41
AX+
23 A Y +
13
33
M
42
AZ+
43
AX+
M 24 A Y +
M 34 A Z +
M
M
14
H
6
= Bl
Bl Y
X
Bl Z
44
列ベクトル: OpenGL
 数学では一般的
>M
M
H>A H >M
11
M
12
M
13
M
14
AX
21
M
22
M
23
M
24
Y
M
31
M
32
M
33
M
34
AZ
M
41
M
42
M
43
M
44
1
#
=
H >B l H
11
AX+ M
12
AY+ M
13
AZ+ M
14
21
AX+ M
22
AY+ M
23
AZ+ M
24
M
31
AX+ M
32
AY+ M
33
AZ+ M
34
Bl Z
M
41
AX+ M
42
AY+ M
43
AZ+ M
44
BlW
M
Bl X
=
Y
Bl W
@
定義
 座標系の 基底
基底ベクトル
クトル を並
を並べたもの
たもの
○ ベクトル仕様により 転置 の関係にある

行ベクトル仕様
行
仕様
>Y
X

H
XY
X
X
YY
YZ
0
ZX
ZY
ZZ
0
PX
PY
PZ
1
>X
X
YX
ZX
PX
Y
YY
ZY
PY
X
Z
YZ
ZZ
PZ
0
0
1
0
X
親:基準
P
列ベクトル仕様
X
Z
0
X
Z
Y
H
合成変換
自分:子
親
 座標変換は
逐次的に合成可能

行ベクトル仕様
> 子 H>変換前 H> 親 H >変換後 H
基準 # 相対 # 基準 =
変換

列ベクト 仕様
列ベクトル仕様
変換
変換
相対
変換
> 親 H>変換前 H> 子 H >変換後 H
基準 # 相対 # 基準 =
変換
変換
変換
相対
変換
基本 ①

平行移動
>0
0
0
0
1
0
0
0
0
1
0
0
0
1 TZ
TX
TY
TZ
1
0
0
0
1
H >0 1
1
行ベクトル仕様

拡大/縮小:スケーリング
 ベクトル仕様に依存しない
0
0 TX
0 TY
H
1
列ベクトル仕様
>0
0
0
0
SY
0
0
0
0
SZ
0
0
0
0
1
SX
H
基本 ②

回転
○ ベクトル仕様の違いによって回転方向が変わる
 X軸
軸
>0
1
0
0
cos i
- sin i
0
cos i
0
0 - sin i
0
1
0
0 + sin i
0
0
H
0
0
0
cos i
+ sin i
0
cos i
0
0
1
0
H >0
cos i
H
0 - sin i
0
1
0
0
1
0
0
- sin i
0
cos i
0
+ sin i
0
cos i
0
0
0
0
1
0
0
0
1
>+ sin i
cos i
 Z軸
1
>0
cos i
 Y軸
H >0
0
0 + sin i
0
H >- sin i
- sin i
0
0
cos i
0
0
0
0
1
0
0
0
0
1
行ベクトル仕様
H
+ sin i
0
0
cos i
0
0
0
0
1
0
0
0
0
1
cos i
列ベクトル仕様
逆行列


h
M # M - 1 = M - 1 # M = I (単位行列)
M A # M B # M -B 1 = M
^
h
- 1
#
#
M A MB = M
M A
行列の逆数に相当 除算が可能
行列の逆数に相当:除算が可能
逆方向の座標変換は逆行列
A
B
#
h
M
M A# M B ] M
^
h
M A # M B # M -A 1 ] M
- 1
B
ワールド
球体
立方体
 球体座標系
M
W " S
立方体
 立方体座標系
M W"
球体
C
 相対変換行列
行ベクト 仕様
○ 行ベクトル仕様
M S" C = M W " C M W- 1" S
○ 列ベクトル仕様
M S" C = M W- 1" S M W " C
順
順
逆
逆
ワールド
ワ ルド
A
B
演算関数

FMX.Types3D
 function CreateTranslateMatrix3D :TMatrix3D
 function CreateScaleMatrix3D :TMatrix3D
 function CreateRotationMatrix3D :TMatrix3D
○ 任意のベクトルを軸とした回転行列
 function InvertMatrix :TMatrix3D
○ 逆行列
 function Matrix3DMultiply :TMatrix3D
○ 行列の積
 function Vector3DTransform :TVector3D
○ ベクトル×行列
FireMonkey テクニック
クラス
TCamera
TCube
TDummy
TPlane
TControl3D
TLight
g
TDisk
TStrokeCube
TMesh
TFmxObject
TShape3D
TCustomMesh
TSphere
TColorMaterialSource
TCylinder
TMaterialSource
TTextureMaterialSource
TRoundCube
TLightMaterialSource
TCone
FMX Types3D ①
FMX.Types3D

TControl3D = class( TFmxObject, IControl )
 property LocalMatrix :TMatrix3D
○ 相対変換行列
 property AbsoluteMatrix :TMatrix3D
○ 絶対変換行列
 property AutoCapture :Boolean
○ マウスポインタが図形外へ出てもイベントを発生させる
○ TControl3D. Capture / ReleaseCapture をコール
 TViewport3D は デフォルトで True
 property Context :TContext3D
○ 描画エンジン
TControl3D LocalMatrix
TControl3D.LocalMatrix

読取専用プロパティだが クラス
クラスヘルパ
ルパ で改造可能
interface
type
HControl3D = class Helper for TControl3D
protected
function GetLocalMatrix :TMatrix3D;
procedure SetLocalMatrix( const LocalMatrix_:TMatrix3D ); virtual;
public
property LocalMatrix :TMatrix3D read GetLocalMatrix write SetLocalMatrix;
end;
implementation
直接 FLocalMatrix は指定できない
function HControl3D.GetLocalMatrix :TMatrix3D;
begin
Result := FLocalMatrix
end;
procedure HControl3D.SetLocalMatrix( const LocalMatrix_:TMatrix3D );
begin
FLocalMatrix := LocalMatrix_; RecalcAbsolute; Repaint
end;
d
絶対変換行列を再計算
FireMonkey テクニック
法線
ポリゴンモデル
連続面
面

三角ポリゴンの集合
 GPU は 三角形ポリゴン
しか描けない

面
面
座標
不連続面
構成要素
 面:Face
面 Face
○ 頂点を右回りに参照
 頂点:Vertex
○ 位置座標
○ 法線
 面の垂直ベクトル
○ テクスチャ座標
0,0
0,1
0,0
0,1
0.5,0
1,0
1,1
1,0
1,1
FMX Types3D ②
FMX.Types3D

TShape3D = class( TControl3D )
 property MaterialSource :TMaterialSource
○ マテリアルコンポーネントへの参照
リ
ネ
参照

TCustomMesh = class( TShape3D )
p
property
p y Data :TMeshData
○ ポリゴンデータを保持する
 function DoRayCastIntersect :Boolean
○ ボリゴンと光線(ray)との交点を求める
 Data.RayCastIntersect をコール
FMX Types3D ③
FMX.Types3D

レイ交差判定
 function RayCastPlaneIntersect :Boolean;
○ 対 平面
 function RayCastSphereIntersect :Integer;
○ 対 球体
 function RayCastEllipsoidIntersect :Integer;
○ 対 楕円体
 function RayCastCuboidIntersect :Integer;
○ 対 直方体
 function RayCastTriangleIntersect :Boolean;
○ 対 三角ポリゴン(一枚)
FMX Types3D ④
FMX.Types3D

TMeshData = class( TPersistent )
 function RayCastIntersect :Boolean;
○ ポリゴン群とのレイ交差判定
リ
群
交差判定
 総当たりで RayCastTriangleIntersect をコール
- ポリゴン数が多いと処理が重い: 空間分割最適化の検討
 property
t VertexBuffer
V t B ff :TVertexBuffer
TV t B ff
○ 頂点のリスト
 位置座標
 法線ベクトル
 テクスチャ座標
 property IndexBuffer :TIndexBuffer
○ ポリゴンのリスト
FMX Types3D ⑤
FMX.Types3D

TVertexBuffer = class( TPersistent )
 property Length :Integer
○ 頂点数
 property Vertices[ AIndex:Integer ] :TPoint3D
○ 頂点の位置座標
 property Normals[ AIndex:Integer ] :TPoint3D
○ 頂点の法線ベクトル
 property TexCoord0[ AIndex:Integer ] :TPointF
○ 頂点のテクスチャ座標
FMX Types3D ⑥
FMX.Types3D

TIndexBuffer = class( TPersistent )
 property Length :Integer
○ 面数
面数×3 :ポリゴン
リ
○ 線数×2 :ワイヤーフレーム
○ 点数×1 :ポイントクラウド
 property Indices[ AIndex:Integer ] :Integer
○ N番目ポリゴン
 Indices[ 3×N+0 ] = 頂点①のインデックス番号
点①
デ
番
 Indices[ 3×N+1 ] = 頂点②のインデックス番号
 Indices[ 3×N+2 ] = 頂点③のインデックス番号
描画エンジン

TCustomMesh
procedure TCustomMesh.Render;
begin
Context.SetMatrix( Matrix3DMultiply( CreateScaleMatrix3D( Vector3D( Width, Height, Depth ) ),
AbsoluteMatrix ) );
C t t D
Context.DrawTriangles(
T i
l ( FData.VertexBuffer,
FD t V t B ff
FD t I d B ff
FData.IndexBuffer,
TMaterialSource.ValidMaterial( FMaterialSource ), AbsoluteOpacity );
end;

TContext3D = class abstract( TInterfacedPersistent, IFreeNotification )
 procedure DoDrawTriangles
○ 面群の描画
 procedure DoDrawLines
○ 線群の描画
例:TStrokeCube
 procedure DoDrawPoints
○ 点群の描画
モデル構築

不連続面
面
TCustomMesh
面
面
with Data do
begin
with VertexBuffer do
begin
Length
L
th := 7{頂点数};
7{頂点数}
Vertices [ 0 ] := TPoint3D.Create( *, *, * ){位置座標};
Normals [ 0 ] := TPoint3D.Create( *, *, * ){法線ベクトル};
TexCoord0[ 0 ] := TPointF.Create( *, * ){テクスチャ座標};
~
Vertices [ 6 ] := TPoint3D.Create( *, *, * );;
: TPoint3D.Create(
TPoint3D Create( *, *, * );
Normals [ 6 ] :=
TexCoord0[ 6 ] := TPointF.Create( *, * );
end;
with IndexBuffer do
begin
Length := 3{頂点数/ポリゴン} * 3{ポリゴン数};
Indices[ 3
0+0 ] := 6;
3*0+0
Indices[ 3*0+1 ] := 1;
Indices[ 3*0+2 ] := 0;
Indices[ 3*1+0 ] := 6;
Indices[ 3*1+1 ] := 5;
Indices[ 3*1+2 ] := 1;
Indices[ 3
3*2+0
2+0 ] :
:= 4;
Indices[ 3*2+1 ] := 3;
Indices[ 3*2+2 ] := 2;
end;
end;
(0)
分
解
(5)
(6)
(4)
<1>
<0>
(1)
<2>
(2)
(3)
Fly UP