Three.JS Orbite Commandes d'activation et de désactivation sans position de saut

Je suis entrain de créer une géométrie de manipulation de prototype Three.JS. Je suis à l'aide de OrbitControls.JS de manipuler la caméra et je rencontre des problèmes de l'activation et de la désactivation des contrôles.

Voici ma version de démonstration:
http://moczys.com/webGL/Prototype_V02-05.html

L'idée est que lorsque vous passez la souris sur l'un des sommets du Tétraèdre, un gris sphère apparaît. En cliquant sur la sphère, vous apportez un sommet de manipulation de la poignée. Puis en cliquant sur un glisser sur une flèche, vous pouvez déplacer le sommet dans cette direction. Vous devriez alors être en mesure de clic de souris à partir de la géométrie de sortir de ce mode.

Le problème se produit lorsque vous cliquez à l'extérieur. Si vous cliquez sur & faites glisser le curseur après le déplacement au sommet, l'appareil photo passe un peu fou. En fonction de la distance à partir du point d'origine, vous êtes, OrbitControls tourner la caméra à une distance dans cette direction. C'est juste un vraiment choquante/confus d'action vraiment que les impacts de la facilité d'utilisation, donc je voudrais le réparer, mais n'arrive pas à localiser le problème.

Je pense que c'est l'enregistrement de la position initiale dans le OrbitControls.js et puis les garder jusqu'à ce qu'ils sont réactivées... je n'ai cependant pas été en mesure de savoir où. Cela se produit quelque part dans le MouseUp, MouseDown, et MouseMove des gestionnaires d'événements. J'espérais que cela pourrait être intéressant pour quelqu'un qui pourrait en savoir plus sur le fonctionnement de OrbitControls que je fais.

Et voici mon cliquant/glissant code de gestionnaire d'événements:

    function onDocumentMouseMove( event ) 
{
//the following line would stop any other event handler from firing
//(such as the mouse's TrackballControls)
//event.preventDefault();
//update the mouse variable
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
if(MOUSEDOWN&&editMode==2)
{
var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
projector.unprojectVector( vector, camera );
var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
//lastPoint = vertexIntersects[0].object;
var instance = vertexTargets.indexOf(lastPoint);
if(vertexEdit==1){
var intersects = raycaster.intersectObject(XYplane);
vertexTargets[instance].position.x=intersects[0].point.x;
targetList[0].geometry.vertices[instance].x=intersects[0].point.x;
//console.log("x = "+intersects[0].point.x);
}
else if(vertexEdit==2){
var intersects = raycaster.intersectObject(XYplane);
vertexTargets[instance].position.y=intersects[0].point.y;
targetList[0].geometry.vertices[instance].y=intersects[0].point.y;
//console.log("y = "+intersects[0].point.y);
}
else if(vertexEdit==3){
var intersects = raycaster.intersectObject(YZplane);
vertexTargets[instance].position.z=intersects[0].point.z;
targetList[0].geometry.vertices[instance].z=intersects[0].point.z;
//console.log("z = "+intersects[0].point.z);
}
setAxisPosition(vertexTargets[instance].position.clone());
var geom = targetList[0].geometry;
geom.computeCentroids();
geom.computeFaceNormals();
geom.computeVertexNormals();
geom.verticesNeedUpdate = true;
geom.normalsNeedUpdate = true;
updatePanels(targetList[0]);
}
}
function onDocumentMouseDown( event ) 
{
//the following line would stop any other event handler from firing
//(such as the mouse's TrackballControls)
//event.preventDefault();
//console.log("Click.");
MOUSEDOWN = true;
//update the mouse variable
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
checkSelection();   
if(editMode==2){
controls.enabled = false;
controls.rotate = false;
}
else{
controls.enabled = true;
controls.rotate = true;
}
}
function onDocumentMouseUp( event ) 
{
//event.preventDefault();
if (editMode!=2){
controls.enabled = true;
controls.rotate = true;
}
MOUSEDOWN = false;
if(editMode==2){
//editMode=1;
//updateVertexTargets(targetList[0].geometry);
}
}

J'aimerais entendre toutes les suggestions que les gens pourraient avoir, merci!

OriginalL'auteur moczys | 2014-05-11