Blender V2.61 - r43446
Public Member Functions | Public Attributes

GIM_TRIANGLE Class Reference

Class for colliding triangles. More...

#include <gim_tri_collision.h>

List of all members.

Public Member Functions

 GIM_TRIANGLE ()
SIMD_FORCE_INLINE GIM_AABB get_box () const
SIMD_FORCE_INLINE void get_normal (btVector3 &normal) const
SIMD_FORCE_INLINE void get_plane (btVector4 &plane) const
SIMD_FORCE_INLINE void apply_transform (const btTransform &trans)
SIMD_FORCE_INLINE void get_edge_plane (GUINT edge_index, const btVector3 &triangle_normal, btVector4 &plane) const
SIMD_FORCE_INLINE void get_triangle_transform (btTransform &triangle_transform) const
 Gets the relative transformation of this triangle.
bool collide_triangle_hard_test (const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
 Test triangles by finding separating axis.
SIMD_FORCE_INLINE bool collide_triangle (const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
 Test boxes before doing hard test.
SIMD_FORCE_INLINE bool get_uv_parameters (const btVector3 &point, const btVector3 &tri_plane, GREAL &u, GREAL &v) const
SIMD_FORCE_INLINE bool is_point_inside (const btVector3 &point, const btVector3 &tri_normal) const
 is point in triangle beam?
SIMD_FORCE_INLINE bool ray_collision (const btVector3 &vPoint, const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, GREAL &tparam, GREAL tmax=G_REAL_INFINITY)
 Bidireccional ray collision.
SIMD_FORCE_INLINE bool ray_collision_front_side (const btVector3 &vPoint, const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, GREAL &tparam, GREAL tmax=G_REAL_INFINITY)
 one direccion ray collision

Public Attributes

btScalar m_margin
btVector3 m_vertices [3]

Detailed Description

Class for colliding triangles.

Definition at line 125 of file gim_tri_collision.h.


Constructor & Destructor Documentation

GIM_TRIANGLE::GIM_TRIANGLE ( ) [inline]

Definition at line 131 of file gim_tri_collision.h.


Member Function Documentation

SIMD_FORCE_INLINE void GIM_TRIANGLE::apply_transform ( const btTransform trans) [inline]

Definition at line 150 of file gim_tri_collision.h.

References m_vertices.

SIMD_FORCE_INLINE bool GIM_TRIANGLE::collide_triangle ( const GIM_TRIANGLE other,
GIM_TRIANGLE_CONTACT_DATA contact_data 
) const [inline]

Test boxes before doing hard test.

Parameters:
otherTriangle for collide
contact_dataStructure for holding contact points, normal and penetration depth; The normal is pointing toward this triangle from the other triangle \

Definition at line 206 of file gim_tri_collision.h.

References collide_triangle_hard_test(), GIM_AABB::has_collision(), m_margin, and m_vertices.

bool GIM_TRIANGLE::collide_triangle_hard_test ( const GIM_TRIANGLE other,
GIM_TRIANGLE_CONTACT_DATA contact_data 
) const

Test triangles by finding separating axis.

Parameters:
otherTriangle for collide
contact_dataStructure for holding contact points, normal and penetration depth; The normal is pointing toward this triangle from the other triangle

Definition at line 626 of file gim_tri_collision.cpp.

References m_margin, m_vertices, and GIM_TRIANGLE_CALCULATION_CACHE::triangle_collision().

Referenced by collide_triangle().

SIMD_FORCE_INLINE GIM_AABB GIM_TRIANGLE::get_box ( ) const [inline]

Definition at line 135 of file gim_tri_collision.h.

References m_margin, and m_vertices.

SIMD_FORCE_INLINE void GIM_TRIANGLE::get_edge_plane ( GUINT  edge_index,
const btVector3 &  triangle_normal,
btVector4 plane 
) const [inline]

Definition at line 157 of file gim_tri_collision.h.

References EDGE_PLANE, and m_vertices.

Referenced by is_point_inside().

SIMD_FORCE_INLINE void GIM_TRIANGLE::get_normal ( btVector3 &  normal) const [inline]

Definition at line 140 of file gim_tri_collision.h.

References m_vertices, and TRIANGLE_NORMAL.

Referenced by get_triangle_transform().

SIMD_FORCE_INLINE void GIM_TRIANGLE::get_plane ( btVector4 plane) const [inline]
SIMD_FORCE_INLINE void GIM_TRIANGLE::get_triangle_transform ( btTransform triangle_transform) const [inline]

Gets the relative transformation of this triangle.

The transformation is oriented to the triangle normal , and aligned to the 1st edge of this triangle. The position corresponds to vertice 0:

  • triangle normal corresponds to Z axis.
  • 1st normalized edge corresponds to X axis,

Definition at line 171 of file gim_tri_collision.h.

References get_normal(), btTransform::getBasis(), m_vertices, MAT_SET_X, MAT_SET_Y, MAT_SET_Z, btTransform::setOrigin(), and VEC_NORMALIZE.

SIMD_FORCE_INLINE bool GIM_TRIANGLE::get_uv_parameters ( const btVector3 &  point,
const btVector3 &  tri_plane,
GREAL &  u,
GREAL &  v 
) const [inline]

Solve the System for u,v parameters:

u*axe1[i1] + v*axe2[i1] = vecproj[i1] u*axe1[i2] + v*axe2[i2] = vecproj[i2]

sustitute: v = (vecproj[i2] - u*axe1[i2])/axe2[i2]

then the first equation in terms of 'u':

--> u*axe1[i1] + ((vecproj[i2] - u*axe1[i2])/axe2[i2])*axe2[i1] = vecproj[i1]

--> u*axe1[i1] + vecproj[i2]*axe2[i1]/axe2[i2] - u*axe1[i2]*axe2[i1]/axe2[i2] = vecproj[i1]

--> u*(axe1[i1] - axe1[i2]*axe2[i1]/axe2[i2]) = vecproj[i1] - vecproj[i2]*axe2[i1]/axe2[i2]

--> u*((axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])/axe2[i2]) = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1])/axe2[i2]

--> u*(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) = vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]

--> u = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]) /(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])

if 0.0<= u+v <=1.0 then they are inside of triangle

Returns:
false if the point is outside of triangle.This function doesn't take the margin

Definition at line 247 of file gim_tri_collision.h.

References btFabs(), G_EPSILON, GUINT, and m_vertices.

SIMD_FORCE_INLINE bool GIM_TRIANGLE::is_point_inside ( const btVector3 &  point,
const btVector3 &  tri_normal 
) const [inline]

is point in triangle beam?

Test if point is in triangle, with m_margin tolerance

Definition at line 296 of file gim_tri_collision.h.

References DISTANCE_PLANE_POINT, get_edge_plane(), GREAL, and m_margin.

Referenced by ray_collision(), and ray_collision_front_side().

SIMD_FORCE_INLINE bool GIM_TRIANGLE::ray_collision ( const btVector3 &  vPoint,
const btVector3 &  vDir,
btVector3 &  pout,
btVector3 &  triangle_normal,
GREAL &  tparam,
GREAL  tmax = G_REAL_INFINITY 
) [inline]

Bidireccional ray collision.

Definition at line 316 of file gim_tri_collision.h.

References GUINT, is_point_inside(), LINE_PLANE_COLLISION(), m_vertices, VEC_CROSS, and VEC_NORMALIZE.

SIMD_FORCE_INLINE bool GIM_TRIANGLE::ray_collision_front_side ( const btVector3 &  vPoint,
const btVector3 &  vDir,
btVector3 &  pout,
btVector3 &  triangle_normal,
GREAL &  tparam,
GREAL  tmax = G_REAL_INFINITY 
) [inline]

one direccion ray collision

Definition at line 349 of file gim_tri_collision.h.

References GUINT, is_point_inside(), LINE_PLANE_COLLISION(), m_vertices, VEC_CROSS, and VEC_NORMALIZE.


Member Data Documentation


The documentation for this class was generated from the following files: