20131023 intersection

10
独自のタッチ部位判別処理

Upload: nobu-naka

Post on 01-Jul-2015

3.256 views

Category:

Health & Medicine


0 download

TRANSCRIPT

Page 1: 20131023 intersection

独自のタッチ部位判別処理

Page 2: 20131023 intersection

モデル  •  全身で 140  万ポリゴン  •   1000以上のオブジェクト  

タッチ処理  •   MeshCollider  が重い  •  〃を使わずに交差判定  •  iPad  2  で約 30  ミリ秒

概要

Page 3: 20131023 intersection

バウンディングボックス(BB)

三角形メッシュ

タッチ(Ray)と各オブジェクトの  バウンディングボックスの交差判定

Rayとメッシュの各三角形の  交差判定 [Tomas  Möller  1997]

候補の絞りこみ

三角形より奥のBBはスキップ

概要 ・ 二段階の交差判定

Page 4: 20131023 intersection

交差判定・Rayとバウンディングボックス

Bounds  の IntersectRay(Ray)  で交差判定  

残ったオブジェクトを次のステップへ

Rayと三角形の交差判定

Page 5: 20131023 intersection

交差判定・Rayと三角形

P

Ray

プログラミング上の注意点  •  Transform.InverseTransformDirecHon()  •  Ray.direcHon  

これらは、Ray  の方向ベクトルを正規化してしまうため使えない  以下のようにローカル座標の非正規化  Ray  を求める:  

 Vector3  rayOrigin  =  transform.InverseTransformPoint(ray.origin);    Vector3  rayDirecHon  =  transform.worldToLocalMatrix  *  (Vector4)  ray.direcHon;  

交差判定はメッシュのローカル座標系で行う  

Page 6: 20131023 intersection

交差判定・Rayと三角形(cont’d)

計算には  “Fast  ,  Minimum  Storage  Ray/Triangle  IntersecHon”    [Tomas  Möller  1997]  のアルゴリズムを使用。以下その説明

三角形上の位置  P  は  バリセントリック座標(u,v)で  

V0

V1

V2

u

v

P

D

O

t

始点  O、方向  D  の  Ray  が  距離  t  で位置 P  に当たると  

P = (1−u− v)V0 +uV1 + vV2 P =O+ tD

Page 7: 20131023 intersection

交差判定・Rayと三角形(cont’d)

(1−u− v)V0 +uV1 + vV2 =O+ tD

三角形上の位置  P  は  バリセントリック座標(u,v)で  

始点  O、方向  D  の  Ray  が  長さ t  で位置 P  に当たると  

P = (1−u− v)V0 +uV1 + vV2 P =O+ tD

−D,V1 −V0,V2 −V0[ ]tuv

!

"

###

$

%

&&&=O−V0

行列で表せば

Page 8: 20131023 intersection

交差判定・Rayと三角形(cont’d)

−D,V1 −V0,V2 −V0[ ]tuv

!

"

###

$

%

&&&=O−V0

•  t  :  Rayの長さ  •  (u,  v)  :  バリセントリック座標

クラメールの公式を使って

tuv

!

"

###

$

%

&&&=

1−D,E1,E2

T,E1,E2−D,T,E2−D,E1,T

!

"

####

$

%

&&&&

Page 9: 20131023 intersection

交差判定・Rayと三角形(cont’d)

•  t  :  Rayの長さ  •  (u,  v)  :  バリセントリック座標

tuv

!

"

###

$

%

&&&=

1−D,E1,E2

T,E1,E2−D,T,E2−D,E1,T

!

"

####

$

%

&&&&

tuv

!

"

###

$

%

&&&=

1P ⋅E1

Q ⋅E2P ⋅TQ ⋅D

!

"

###

$

%

&&&

     P = (D×E2 ),Q = T ×E1{ }

A,B,C = −(A×C) ⋅B = −(C ×B) ⋅ A

Page 10: 20131023 intersection

交差判定・Rayと三角形(cont’d)

•  t  :  Rayの長さ  •  (u,  v)  :  バリセントリック座標  •  P  =  D  x  E2  •  Q  =  T  x  E1

tuv

!

"

###

$

%

&&&=

1P ⋅E1

Q ⋅E2P ⋅TQ ⋅D

!

"

###

$

%

&&&  ここが 0  だと、Ray  と三角形が平行  

(交差しないので処理をスキップ)

0 ≤ u ≤1,  0 ≤ v ≤1,  0 ≤ u+ v ≤1,交差するのは以下の時だけ(それ以外はスキップ)

距離 t  を求めて、最近メッシュを保持

候補を絞りこんで

•  データベースからその部位の情報を取得  •  その部位のマテリアル変更