2012-10-11 4 views
8

Weiß jemand, ob und wie die Trackball-Steuerung geändert werden kann, um den Horizont beizubehalten, aber immer noch um ein Objekt drehen zu können?three.js Trackball-Steuerung ohne die Rolle

Wenn Sie axis.x und axis.z auf 0 setzen, wird die Rolle gestoppt, aber auch die Fähigkeit, sich über das Objekt zu drehen, wird gestoppt.

Die Orbit-Kontrolle ist nah an dem, was ich suche, aber nicht die Fähigkeit zu schwenken.

Irgendwelche Hilfe?

+5

'OrbitControls' unterstützt jetzt das Schwenken in three.js r.58. – WestLangley

+0

Ich denke, dass WestLangleys Kommentar in eine Antwort umgewandelt werden sollte, damit er das Kopfgeld bekommen kann - es scheint die Frage zu beantworten, OrbitControls hat, soweit ich das beurteilen kann, alle Funktionen eines Trackballs, außer dass es keinen Wurf gibt der Horizont wird eben bleiben. –

+0

Ich stimme dem zu, obwohl ich nicht weiß, wie ich seinen Kommentar in eine Antwort umwandeln kann. – gimg1

Antwort

0

Dies scheint für mich zu arbeiten, arbeiten an der Mathematik dahinter noch. [Bearbeiten] Ich verwende camera.lookAt(someObj) zuerst, dann das.

camera.rotation.z = Math.sin(camera.rotation.y)/3.5 
+0

Das funktioniert nicht für mich – Tyguy7

3

Es ist eine Weile her, seit diese Frage gestellt wurde, aber ich lief in das gleiche Problem und viel Diskussion nicht online finden, so dass ich dachte, dass ich meine Lösung veröffentlichen würde.

Wenn Sie TrackballControls verwenden müssen, und Sie wollen einen flachen Horizont, können Sie einfach die TrackballControls.js Bibliothek bearbeiten, indem Sie die folgende Zeile am Ende des Verfahrens ‚this.rotateCamera‘ Zugabe

this.object. oben = neu DREI.Vektor3 (0,1,0); Dies sperrt die Aufwärtsrichtung der Kamera in der Richtung (0,1,0) (d. H. In der y-Richtung). Die gesamte modifizierte Methodenfunktion würde dann lauten:

this.rotateCamera = function() { 

var angle = Math.acos(_rotateStart.dot(_rotateEnd)/_rotateStart.length()/_rotateEnd.length()); 

if (angle) { 

    var axis = (new THREE.Vector3()).crossVectors(_rotateStart, _rotateEnd).normalize(); 
     quaternion = new THREE.Quaternion(); 

    angle *= _this.rotateSpeed; 

    quaternion.setFromAxisAngle(axis, -angle); 

    _eye.applyQuaternion(quaternion); 
    _this.object.up.applyQuaternion(quaternion); 

    _rotateEnd.applyQuaternion(quaternion); 

    if (_this.staticMoving) { 

     _rotateStart.copy(_rotateEnd); 

    } else { 

     quaternion.setFromAxisAngle(axis, angle * (_this.dynamicDampingFactor - 1.0)); 
     _rotateStart.applyQuaternion(quaternion); 

    } 

} 

// Lock the camera up direction 
this.object.up = new THREE.Vector3(0,1,0); 

}; 
+1

Angenommen, es funktioniert, nicht ein neues Objekt instanziieren. 'this.object.up.set (0, 1, 0);' – WestLangley