Comments
Description
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)