Post on 01-Jul-2015
独自のタッチ部位判別処理
モデル • 全身で 140 万ポリゴン • 1000以上のオブジェクト
タッチ処理 • MeshCollider が重い • 〃を使わずに交差判定 • iPad 2 で約 30 ミリ秒
概要
バウンディングボックス(BB)
三角形メッシュ
タッチ(Ray)と各オブジェクトの バウンディングボックスの交差判定
Rayとメッシュの各三角形の 交差判定 [Tomas Möller 1997]
候補の絞りこみ
三角形より奥のBBはスキップ
概要 ・ 二段階の交差判定
交差判定・Rayとバウンディングボックス
Bounds の IntersectRay(Ray) で交差判定
残ったオブジェクトを次のステップへ
Rayと三角形の交差判定
交差判定・Rayと三角形
P
Ray
プログラミング上の注意点 • Transform.InverseTransformDirecHon() • Ray.direcHon
これらは、Ray の方向ベクトルを正規化してしまうため使えない 以下のようにローカル座標の非正規化 Ray を求める:
Vector3 rayOrigin = transform.InverseTransformPoint(ray.origin); Vector3 rayDirecHon = transform.worldToLocalMatrix * (Vector4) ray.direcHon;
交差判定はメッシュのローカル座標系で行う
交差判定・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
交差判定・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
行列で表せば
交差判定・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
!
"
####
$
%
&&&&
交差判定・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
交差判定・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 を求めて、最近メッシュを保持
候補を絞りこんで
• データベースからその部位の情報を取得 • その部位のマテリアル変更