Skip to content

Commit dad6911

Browse files
committed
Optimised Ray a bit more
Removed some clone() calls while still keeping the code somewhat pretty.
1 parent ca38a3f commit dad6911

File tree

7 files changed

+755
-755
lines changed

7 files changed

+755
-755
lines changed

build/Three.js

+362-362
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/custom/ThreeCanvas.js

+70-70
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/custom/ThreeDOM.js

+40-40
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/custom/ThreeSVG.js

+53-53
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/custom/ThreeWebGL.js

+171-171
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/webgl_interactive_cubes.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130

131131
// find intersections
132132

133-
var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
133+
var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
134134
projector.unprojectVector( vector, camera );
135135

136136
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );

src/core/Ray.js

+58-58
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,13 @@ THREE.Ray = function ( origin, direction ) {
77
this.origin = origin || new THREE.Vector3();
88
this.direction = direction || new THREE.Vector3();
99

10-
}
11-
12-
THREE.Ray.prototype = {
13-
14-
constructor: THREE.Ray,
15-
16-
intersectScene: function ( scene ) {
10+
this.intersectScene = function ( scene ) {
1711

1812
return this.intersectObjects( scene.children );
1913

20-
},
14+
};
2115

22-
intersectObjects: function ( objects ) {
16+
this.intersectObjects = function ( objects ) {
2317

2418
var i, l, object,
2519
intersects = [];
@@ -34,52 +28,18 @@ THREE.Ray.prototype = {
3428

3529
return intersects;
3630

37-
},
38-
39-
intersectObject: function ( object ) {
40-
41-
function distanceFromIntersection( origin, direction, position ) {
42-
43-
var vector, dot, intersect, distance;
44-
45-
vector = position.clone().subSelf( origin );
46-
dot = vector.dot( direction );
47-
48-
if ( dot <= 0 ) return null; // check if position behind origin.
49-
50-
intersect = origin.clone().addSelf( direction.clone().multiplyScalar( dot ) );
51-
distance = position.distanceTo( intersect );
52-
53-
return distance;
54-
55-
}
56-
57-
// http://www.blackpawn.com/texts/pointinpoly/default.html
58-
59-
var v0 = new THREE.Vector3(), v1 = new THREE.Vector3(), v2 = new THREE.Vector3();
60-
var dot00, dot01, dot02, dot11, dot12, invDenom, u, v;
61-
62-
function pointInFace3( p, a, b, c ) {
63-
64-
v0.copy( c ).subSelf( a );
65-
v1.copy( b ).subSelf( a );
66-
v2.copy( p ).subSelf( a );
67-
68-
dot00 = v0.dot( v0 );
69-
dot01 = v0.dot( v1 );
70-
dot02 = v0.dot( v2 );
71-
dot11 = v1.dot( v1 );
72-
dot12 = v1.dot( v2 );
73-
74-
invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
75-
u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
76-
v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
31+
};
7732

78-
return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 );
33+
var a = new THREE.Vector3();
34+
var b = new THREE.Vector3();
35+
var c = new THREE.Vector3();
36+
var d = new THREE.Vector3();
7937

80-
}
38+
var origin = new THREE.Vector3();
39+
var direction = new THREE.Vector3();
40+
var normal = new THREE.Vector3();
8141

82-
//
42+
this.intersectObject = function ( object ) {
8343

8444
var intersect, intersects = [];
8545

@@ -125,7 +85,6 @@ THREE.Ray.prototype = {
12585
// Checking faces
12686

12787
var f, fl, face,
128-
a, b, c, d, normal,
12988
vector, dot, scalar,
13089
origin, direction,
13190
geometry = object.geometry,
@@ -153,12 +112,12 @@ THREE.Ray.prototype = {
153112

154113
//
155114

156-
a = objMatrix.multiplyVector3( vertices[ face.a ].position.clone() );
157-
b = objMatrix.multiplyVector3( vertices[ face.b ].position.clone() );
158-
c = objMatrix.multiplyVector3( vertices[ face.c ].position.clone() );
159-
d = face instanceof THREE.Face4 ? objMatrix.multiplyVector3( vertices[ face.d ].position.clone() ) : null;
115+
a = objMatrix.multiplyVector3( a.copy( vertices[ face.a ].position ) );
116+
b = objMatrix.multiplyVector3( b.copy( vertices[ face.b ].position ) );
117+
c = objMatrix.multiplyVector3( c.copy( vertices[ face.c ].position ) );
118+
d = face instanceof THREE.Face4 ? objMatrix.multiplyVector3( d.copy( vertices[ face.d ].position ) ) : null;
160119

161-
normal = object.matrixRotationWorld.multiplyVector3( face.normal.clone() );
120+
normal = object.matrixRotationWorld.multiplyVector3( normal.copy( face.normal ) );
162121
dot = direction.dot( normal );
163122

164123
if ( object.doubleSided || ( object.flipSided ? dot > 0 : dot < 0 ) ) { // Math.abs( dot ) > 0.0001
@@ -212,4 +171,45 @@ THREE.Ray.prototype = {
212171

213172
}
214173

174+
function distanceFromIntersection( origin, direction, position ) {
175+
176+
var vector, dot, intersect, distance;
177+
178+
vector = position.clone().subSelf( origin );
179+
dot = vector.dot( direction );
180+
181+
if ( dot <= 0 ) return null; // check if position behind origin.
182+
183+
intersect = origin.clone().addSelf( direction.clone().multiplyScalar( dot ) );
184+
distance = position.distanceTo( intersect );
185+
186+
return distance;
187+
188+
}
189+
190+
// http://www.blackpawn.com/texts/pointinpoly/default.html
191+
192+
var v0 = new THREE.Vector3(), v1 = new THREE.Vector3(), v2 = new THREE.Vector3();
193+
var dot00, dot01, dot02, dot11, dot12, invDenom, u, v;
194+
195+
function pointInFace3( p, a, b, c ) {
196+
197+
v0.copy( c ).subSelf( a );
198+
v1.copy( b ).subSelf( a );
199+
v2.copy( p ).subSelf( a );
200+
201+
dot00 = v0.dot( v0 );
202+
dot01 = v0.dot( v1 );
203+
dot02 = v0.dot( v2 );
204+
dot11 = v1.dot( v1 );
205+
dot12 = v1.dot( v2 );
206+
207+
invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
208+
u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
209+
v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
210+
211+
return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 );
212+
213+
}
214+
215215
};

0 commit comments

Comments
 (0)