Go to the documentation of this file.00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "btTriangleShapeEx.h"
00025
00026
00027
00028 void GIM_TRIANGLE_CONTACT::merge_points(const btVector4 & plane,
00029 btScalar margin, const btVector3 * points, int point_count)
00030 {
00031 m_point_count = 0;
00032 m_penetration_depth= -1000.0f;
00033
00034 int point_indices[MAX_TRI_CLIPPING];
00035
00036 int _k;
00037
00038 for ( _k=0;_k<point_count;_k++)
00039 {
00040 btScalar _dist = - bt_distance_point_plane(plane,points[_k]) + margin;
00041
00042 if (_dist>=0.0f)
00043 {
00044 if (_dist>m_penetration_depth)
00045 {
00046 m_penetration_depth = _dist;
00047 point_indices[0] = _k;
00048 m_point_count=1;
00049 }
00050 else if ((_dist+SIMD_EPSILON)>=m_penetration_depth)
00051 {
00052 point_indices[m_point_count] = _k;
00053 m_point_count++;
00054 }
00055 }
00056 }
00057
00058 for ( _k=0;_k<m_point_count;_k++)
00059 {
00060 m_points[_k] = points[point_indices[_k]];
00061 }
00062 }
00063
00065 bool btPrimitiveTriangle::overlap_test_conservative(const btPrimitiveTriangle& other)
00066 {
00067 btScalar total_margin = m_margin + other.m_margin;
00068
00069 btScalar dis0 = bt_distance_point_plane(m_plane,other.m_vertices[0]) - total_margin;
00070
00071 btScalar dis1 = bt_distance_point_plane(m_plane,other.m_vertices[1]) - total_margin;
00072
00073 btScalar dis2 = bt_distance_point_plane(m_plane,other.m_vertices[2]) - total_margin;
00074
00075 if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
00076
00077
00078 dis0 = bt_distance_point_plane(other.m_plane,m_vertices[0]) - total_margin;
00079
00080 dis1 = bt_distance_point_plane(other.m_plane,m_vertices[1]) - total_margin;
00081
00082 dis2 = bt_distance_point_plane(other.m_plane,m_vertices[2]) - total_margin;
00083
00084 if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
00085
00086 return true;
00087 }
00088
00089 int btPrimitiveTriangle::clip_triangle(btPrimitiveTriangle & other, btVector3 * clipped_points )
00090 {
00091
00092
00093 btVector3 temp_points[MAX_TRI_CLIPPING];
00094
00095
00096 btVector4 edgeplane;
00097
00098 get_edge_plane(0,edgeplane);
00099
00100
00101 int clipped_count = bt_plane_clip_triangle(
00102 edgeplane,other.m_vertices[0],other.m_vertices[1],other.m_vertices[2],temp_points);
00103
00104 if (clipped_count == 0) return 0;
00105
00106 btVector3 temp_points1[MAX_TRI_CLIPPING];
00107
00108
00109
00110 get_edge_plane(1,edgeplane);
00111
00112
00113 clipped_count = bt_plane_clip_polygon(edgeplane,temp_points,clipped_count,temp_points1);
00114
00115 if (clipped_count == 0) return 0;
00116
00117
00118 get_edge_plane(2,edgeplane);
00119
00120 clipped_count = bt_plane_clip_polygon(
00121 edgeplane,temp_points1,clipped_count,clipped_points);
00122
00123 return clipped_count;
00124 }
00125
00126 bool btPrimitiveTriangle::find_triangle_collision_clip_method(btPrimitiveTriangle & other, GIM_TRIANGLE_CONTACT & contacts)
00127 {
00128 btScalar margin = m_margin + other.m_margin;
00129
00130 btVector3 clipped_points[MAX_TRI_CLIPPING];
00131 int clipped_count;
00132
00133
00134
00135 GIM_TRIANGLE_CONTACT contacts1;
00136
00137 contacts1.m_separating_normal = m_plane;
00138
00139
00140 clipped_count = clip_triangle(other,clipped_points);
00141
00142 if (clipped_count == 0 )
00143 {
00144 return false;
00145 }
00146
00147
00148 contacts1.merge_points(contacts1.m_separating_normal,margin,clipped_points,clipped_count);
00149 if (contacts1.m_point_count == 0) return false;
00150
00151 contacts1.m_separating_normal *= -1.f;
00152
00153
00154
00155 GIM_TRIANGLE_CONTACT contacts2;
00156 contacts2.m_separating_normal = other.m_plane;
00157
00158 clipped_count = other.clip_triangle(*this,clipped_points);
00159
00160 if (clipped_count == 0 )
00161 {
00162 return false;
00163 }
00164
00165
00166 contacts2.merge_points(contacts2.m_separating_normal,margin,clipped_points,clipped_count);
00167 if (contacts2.m_point_count == 0) return false;
00168
00169
00170
00171
00173 if (contacts2.m_penetration_depth<contacts1.m_penetration_depth)
00174 {
00175 contacts.copy_from(contacts2);
00176 }
00177 else
00178 {
00179 contacts.copy_from(contacts1);
00180 }
00181 return true;
00182 }
00183
00184
00185
00187
00188 bool btTriangleShapeEx::overlap_test_conservative(const btTriangleShapeEx& other)
00189 {
00190 btScalar total_margin = getMargin() + other.getMargin();
00191
00192 btVector4 plane0;
00193 buildTriPlane(plane0);
00194 btVector4 plane1;
00195 other.buildTriPlane(plane1);
00196
00197
00198 btScalar dis0 = bt_distance_point_plane(plane0,other.m_vertices1[0]) - total_margin;
00199
00200 btScalar dis1 = bt_distance_point_plane(plane0,other.m_vertices1[1]) - total_margin;
00201
00202 btScalar dis2 = bt_distance_point_plane(plane0,other.m_vertices1[2]) - total_margin;
00203
00204 if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
00205
00206
00207 dis0 = bt_distance_point_plane(plane1,m_vertices1[0]) - total_margin;
00208
00209 dis1 = bt_distance_point_plane(plane1,m_vertices1[1]) - total_margin;
00210
00211 dis2 = bt_distance_point_plane(plane1,m_vertices1[2]) - total_margin;
00212
00213 if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
00214
00215 return true;
00216 }
00217
00218