Game Development Reference
In-Depth Information
/ /
Compute 3D p o i n t
o f
i n t e r s e c t i o n
V e c t o r 3
p
=
r a y O r g
+
r a y D e l t a
∗
t ;
/ /
F i n d
dominant
a x i s
t o
s e l e c t
which
p l a n e
/ /
t o
p r o j e c t
onto ,
and
compute
u ' s
and
v ' s
f l o a t
u0 ,
u1 ,
u2 ;
f l o a t
v0 ,
v1 ,
v2 ;
i f
( f a b s ( n . x )
>
f a b s ( n . y ) )
{
i f
( f a b s ( n . x )
>
f a b s ( n . z ) )
{
u0
=
p . y
−
p0 . y ;
u1
=
p1 . y
−
p0 . y ;
u2
=
p2 . y
−
p0 . y ;
p . z
−
v0
=
p0 . z ;
p1 . z
−
v1
=
p0 . z ;
v2
=
p2 . z
−
p0 . z ;
}
e l s e
{
u0
=
p . x
−
p0 . x ;
u1
=
p1 . x
−
p0 . x ;
u2
=
p2 . x
−
p0 . x ;
v0
=
p . y
−
p0 . y ;
v1
=
p1 . y
−
p0 . y ;
v2
=
p2 . y
−
p0 . y ;
}
}
e l s e
{
i f
( f a b s ( n . y )
>
f a b s ( n . z ) )
{
u0
=
p . x
−
p0 . x ;
u1
=
p1 . x
−
p0 . x ;
u2
=
p2 . x
−
p0 . x ;
v0
=
p . z
−
p0 . z ;
v1
=
p1 . z
−
p0 . z ;
v2
=
p2 . z
−
p0 . z ;
}
e l s e
{
u0
=
p . x
−
p0 . x ;
u1
=
p1 . x
−
p0 . x ;
u2
=
p2 . x
−
p0 . x ;
v0
=
p . y
−
p0 . y ;
v1
=
p1 . y
−
p0 . y ;
v2
=
p2 . y
−
p0 . y ;
}
}
/ /
Compute
denominator ,
check
f o r
i n v a l i d
∗
v2
−
∗
f l o a t
temp
=
u1
v1
u2 ;
{
i f
( ! ( temp
! =
0 . 0 f ) )
r e t u r n
k N o I n t e r s e c t i o n ;
}
temp
=
1 . 0 f
/
temp ;
/ /
Compute
b a r y c e n t r i c
coords ,
c h e c k i n g
f o r
out
−
of
−
r a n g e
/ /
a t
each
s t e p
f l o a t
a l p h a
=
( u0
∗
v2
−
v0
∗
u2 )
∗
temp ;
i f
( ! ( a l p h a
>
=
0 . 0 f ) )
{
r e t u r n
k N o I n t e r s e c t i o n ;
}
f l o a t
b e t a
=
( u1
∗
v0
−
v1
∗
u0 )
∗
temp ;
i f
( ! ( b e t a
>
=
0 . 0 f ) )
{
r e t u r n
k N o I n t e r s e c t i o n ;
}
Search WWH ::
Custom Search