2012-12-02 9 views
11

Die three.js-Leinwand ist ein 500 x 500 Quadrat innerhalb einer größeren Webseite mit anderem Inhalt und ich brauche Maussteuerung der Kamera (zum Zoomen und Drehen das Objekt) nur dann passieren, wenn sich die Maus im 500 x 500 Quadrat befindet.Maussteuerung der three.js-Szene nur erlauben, wenn Maus über Leinwand ist

Auch kann ich die Webseite nicht scrollen, aber vielleicht wird das behoben, wenn wir den Mausereignis-Listener auf die Leinwand 500 x 500 isolieren.

Aktuelle Code:

<!DOCTYPE html> 
<html> 
<head> 
    <style> 
    div   { 
      position:relative; 
      left:100px;   
      top:100px; 
      background-color: #eeeeee; 
      border:1px solid black;    
      width:500px; 
      height:500px; 
       } 

    canvas  { 
      width:500px; 
      height:500px; 
       } 

    </style> 
</head>  
<body> 

    <script src="https://raw.github.com/mrdoob/three.js/master/build/three.min.js"></script> 

    <script src="https://raw.github.com/mrdoob/three.js/master/examples/js/loaders/STLLoader.js"></script> 

    <script src="https://raw.github.com/mrdoob/three.js/master/examples/js/controls/TrackballControls.js"></script> 

    <script> 
     var container, camera, scene, renderer, controls; 

     init(); 
     animate(); 

     function init() { 

      container = document.createElement('div'); 
      document.body.appendChild(container); 

      var width = container.clientWidth; 
      var height = container.clientHeight; 


      camera = new THREE.PerspectiveCamera(10 , width/height , .1 , 10000); 

      camera.position.set(0, 0, 10); 

      scene = new THREE.Scene(); 

      controls = new THREE.TrackballControls(camera); // mouse control 
      controls.addEventListener('change', render); // mouse control 

      // object 

      var loader = new THREE.STLLoader(); 
      loader.addEventListener('load', function (event) { 

       var geometry = event.content; 

       var material = new THREE.MeshLambertMaterial({ ambient: 0xff5533, color: 0xff5533 }); 

       var mesh = new THREE.Mesh(geometry, material); 

       scene.add(mesh); 

      }); 

      loader.load('slotted_disk.stl'); // from https://raw.github.com/mrdoob/three.js/master/examples/models/stl/slotted_disk.stl 


      // lights 

      scene.add(new THREE.AmbientLight(0x222222)); 

      var directionalLight = new THREE.DirectionalLight(0xffffff, 1); 
      directionalLight.position = camera.position; 
      scene.add(directionalLight); 

      // renderer 

      renderer = new THREE.WebGLRenderer({ antialias: true }); 
      renderer.setSize(width , height); 
      container.appendChild(renderer.domElement); 

      window.addEventListener('resize', onWindowResize, false); 


     } 

     function addLight(x, y, z, color, intensity) { 

      var directionalLight = new THREE.DirectionalLight(color, intensity); 
      directionalLight.position.set(x, y, z) 
      scene.add(directionalLight); 

     } 

     function onWindowResize() { 

      camera.aspect = width/height; 
      camera.updateProjectionMatrix(); 

      renderer.setSize(width, height); 
     } 

     function animate() { 

      requestAnimationFrame(animate); 
    controls.update(); 
      render(); 

     } 

     function render() { 

      camera.lookAt(scene.position); 
      renderer.render(scene, camera); 

     } 

    </script> 

</body> 
</html> 

Antwort

25

Die meisten Bedienelemente können Sie die DOM-Knoten des Ereignis-Listener angeben, werden zu. Event-Handler hinzugefügt werden standardmäßig zu dokumentieren, aber dies sollte die Maus Handhabung zu Ihrem Containerelement einschränken:

controls = new THREE.TrackballControls(camera , container); 
+1

Ja, es funktioniert! Vielen Dank! – ForumLeech

+0

** Grundsätzlich stellen Sie sicher, diese Zeile: ** 'document.getElementById ("WebGL-Ausgang") appendChild (renderer.domElement);' ** erscheint vor dieser Zeile:. ** 'var trackballControls = new THREE.TrackballControls (Kamera, Renderer.DomElement); ' –

2

Vorgeschlagene Antwort nicht für mich funktioniert, dies jedoch der Fall ist. Hoffe es hilft jemandem!

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

Ich benutze r73 und das scheint nicht für mich arbeiten. Ich habe ein anderes verwandtes Thema hier geöffnet: http://stackoverflow.com/questions/33332655/three-js-dat-gui-trackballcontrols-renderer-domement-disables-rotate-and-p – rjd

Verwandte Themen