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