Skip to content

Commit 7970681

Browse files
committed
Collision detection for double sided mesh faces.
1 parent 78fb8ac commit 7970681

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

src/extras/physics/Collisions.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ THREE.CollisionSystem.prototype.rayMesh = function( r, me ) {
152152
var p3 = face instanceof THREE.Face4 ? me.mesh.geometry.vertices[ face.d ].position : null;
153153

154154
if (face instanceof THREE.Face3) {
155-
var nd = this.rayTriangle( rt, p0, p1, p2, d, this.collisionNormal );
155+
var nd = this.rayTriangle( rt, p0, p1, p2, d, this.collisionNormal, me.mesh.doubleSided );
156156

157157
if( nd < d ) {
158158

@@ -167,7 +167,7 @@ THREE.CollisionSystem.prototype.rayMesh = function( r, me ) {
167167

168168
else if (face instanceof THREE.Face4) {
169169

170-
var nd = this.rayTriangle( rt, p0, p1, p3, d, this.collisionNormal );
170+
var nd = this.rayTriangle( rt, p0, p1, p3, d, this.collisionNormal, me.mesh.doubleSided );
171171

172172
if( nd < d ) {
173173

@@ -178,7 +178,7 @@ THREE.CollisionSystem.prototype.rayMesh = function( r, me ) {
178178

179179
}
180180

181-
nd = this.rayTriangle( rt, p1, p2, p3, d, this.collisionNormal );
181+
nd = this.rayTriangle( rt, p1, p2, p3, d, this.collisionNormal, me.mesh.doubleSided );
182182

183183
if( nd < d ) {
184184

@@ -188,7 +188,7 @@ THREE.CollisionSystem.prototype.rayMesh = function( r, me ) {
188188
me.normal.normalize();
189189

190190
}
191-
191+
192192
}
193193

194194
}
@@ -197,7 +197,7 @@ THREE.CollisionSystem.prototype.rayMesh = function( r, me ) {
197197

198198
};
199199

200-
THREE.CollisionSystem.prototype.rayTriangle = function( ray, p0, p1, p2, mind, n ) {
200+
THREE.CollisionSystem.prototype.rayTriangle = function( ray, p0, p1, p2, mind, n, doubleSided ) {
201201

202202
var e1 = THREE.CollisionSystem.__v1,
203203
e2 = THREE.CollisionSystem.__v2;
@@ -211,7 +211,20 @@ THREE.CollisionSystem.prototype.rayTriangle = function( ray, p0, p1, p2, mind, n
211211
n.cross( e1, e2 )
212212

213213
var dot = n.dot( ray.direction );
214-
if ( !( dot < 0 ) ) return Number.MAX_VALUE;
214+
if ( !( dot < 0 ) ) {
215+
216+
if ( doubleSided ) {
217+
218+
n.multiplyScalar (-1.0);
219+
dot *= -1.0;
220+
221+
} else {
222+
223+
return Number.MAX_VALUE;
224+
225+
}
226+
227+
}
215228

216229
var d = n.dot( p0 );
217230
var t = d - n.dot( ray.origin );

0 commit comments

Comments
 (0)