ThreeJS de la caméra.lookAt() n'a aucun effet, y a-t-il quelque chose que je fais de mal?

En Trois.js, je veux qu'une caméra soit pointée sur un point dans L'espace 3D.

Pour cela, j'ai essayé d'utiliser le camera.lookAt la fonction comme ceci:

camera.lookAt(new THREE.Vector3(-100,-100,0));

cependant, j'ai découvert que l'appel n'a aucun effet. Il n'a tout simplement rien du tout. J'ai essayé de changer les nombres dans le vecteur, et j'ai toujours le même regard à l'écran, quand il devrait changer.

je viens de trouver maintenant que si je supprime le THREE.TrackballControls j'ai dans mon code,camera.lookAt() fonctionne comme il devrait. Il y a quelque chose qui ne va pas avec la façon dont J'en utilise trois.TrackballControls? C'est de cette façon que je les initialiser:

    controls = new THREE.TrackballControls( camera, renderer.domElement );

    controls.rotateSpeed = 10.0;
    controls.zoomSpeed = 1.2;
    controls.panSpeed = 0.2;

    controls.noZoom = false;
    controls.noPan = false;

    controls.staticMoving = true;
    controls.dynamicDampingFactor = 1.0;

    var radius = 5;
    controls.minDistance = radius * 1.1;
    controls.maxDistance = radius * 100;

    controls.keys = [ 65, 83, 68 ]; // [ rotateKey, zoomKey, panKey ]*/

Et puis, dans ma fonction rendu je fais:

function render() {
  controls.update();
  renderer.render(scene, camera);
}

Documentation à trois.js est plutôt rare, alors j'ai pensé demander ici. Suis-je en train de faire quelque chose de mal?

25
demandé sur houbysoft 2012-04-26 03:12:32

5 réponses

en Regardant le code source de THREE.TrackballControls, j'ai compris que je peux faire de la caméra là où je veux en paramètre trackballControls.targetTHREE.Vector3 je veux qu'il regarde, et puis relire la scène.

43
répondu houbysoft 2012-04-26 16:33:05

Oui veuillez faire attention... Il semble que le fait d'avoir TROIS.TrackballControls ou TROIS.Les OrbitControls semblent surpasser la caméra.regardez la fonction pendant que vous passez dans votre caméra quand vous instanciez une instance des contrôles. Vous pourriez vouloir vous débarrasser des contrôles et ensuite effectuer caméra.lookAt () ou tween votre caméra d'une autre façon pour vérifier que les contrôles ont un effet prépondérant sur votre caméra. J'ai cherché sur Google pendant un moment pourquoi caméra.lookat() semble n'avoir aucun effet.

3
répondu Leon 2014-03-12 22:34:14

à mon avis, nous ne sommes pas censés brouiller le code original. J'ai trouvé un moyen d'atteindre l'objectif d'examiner un point en particulier. Après avoir déclaré votre "contrôle" variable, il suffit d'exécuter ces deux lignes de code:

// Assuming you know how to set the camera and myCanvas variables
control = new THREE.OrbitControls(camera, myCanvas);

// Later in your code
control.object.position.set(camX, camY, camZ);
control.target = new THREE.Vector3(targetX, targetY, targetZ);

gardez à l'esprit que cela va changer le centre de la mise au point à votre nouvelle cible. En d'autres termes, votre nouvelle cible sera le centre de toutes les rotations de la caméra. Certaines parties seront difficiles pour regarder comme vous êtes devenu familier de manipuler la caméra en supposant le centre par défaut. Essayez de zoomer autant que vous le pouvez et vous aurez une idée de ce que je dis Espérons que cette aide.

1
répondu Khoubeib Bouthour 2017-08-18 19:51:47

j'ai pensé à elle. Pour prévenir THREE.TrackballControls ou THREE.OrbitControls de remplacer les camera.lookAt lors de l'initialisation, vous devez changer la ligne qui définit les target propriété égale à sommecamera.position vecteur et l' camera.getWorldDirection() vectoriel, au lieu de la façon dont il est actuellement mis en œuvre en utilisant un new THREE.Vector3() (qui est par défaut (0, 0, 0)).

Donc, pour THREE.TrackballControls, remplacer la ligne 39 par:

this.target = new THREE.Vector3().addVectors(/*new line for readability*/
    object.position, object.getWorldDirection());

idem pour THREE.OrbitControls, sur la ligne 36. Je actaully ne l'ai pas testé sur TrackballControls.js mais il fonctionne sur OrbitControls.js. Espérons que cette aide.

0
répondu Andrea Aloi 2014-10-27 21:43:04

Voici une solution alternative: créer un objet (i.e. cube) avec 0 dimensions.

var cameraTarget = new THREE.Mesh( new THREE.CubeGeometry(0,0,0));

Dans la fonction rendu régler l'appareil photo.regardez la position du cameraTarget.

function render() {
    camera.lookAt( cameraTarget.position );
    renderer.render( scene, camera );
}

alors déplacez la caméra comme vous le souhaitez.

0
répondu sebjwallace 2016-01-12 15:24:41