2013-11-22 35 views
0

我有这个代码工作很好,我想添加一个情况,当我点击红色立方体所有页面“跳跃”更接近立方体。 (也许是相机?)。 我没有任何想法,我希望你能帮助我。如何点击并滑入三个js立方体?

一般来说,我想学习如何点击三个j中的一个对象并移动到页面中的第二个对象。

这是我的代码:

<html> 
<head> 
    <script src="js/three.js"></script> 
</head> 

<body> 
    <script> 
     var renderer = new THREE.WebGLRenderer({ antialias: true }); 
     renderer.setSize(document.body.clientWidth, document.body.clientHeight); 
     document.body.appendChild(renderer.domElement); 
     renderer.setClearColorHex(0xEEEEEE, 1.0); 
     renderer.clear(); 
     renderer.shadowCameraFov = 50; 
     renderer.shadowMapWidth = 1024;; 
     renderer.shadowMapHeight = 1024; 


     var fov = 45; // camera field-of-view in degrees 
     var width = renderer.domElement.width; 
     var height = renderer.domElement.height; 
     var aspect = width/height; // view aspect ratio 
     var near = 1; // near clip plane 
     var far = 10000; // far clip plane 
     var camera = new THREE.PerspectiveCamera(fov, aspect, near, far); 
     camera.position.z = -400; 
     camera.position.x = 200; 
     camera.position.y = 350; 
     var scene = new THREE.Scene(); 
     var cube = new THREE.Mesh(
      new THREE.CubeGeometry(50, 50, 50), 
      new THREE.MeshLambertMaterial({ color: 0xff0000 }) 
     ); 
     scene.add(cube); 
     cube.castShadow = true; 
     cube.receiveShadow = true; 

     var plane = new THREE.Mesh(
      new THREE.PlaneGeometry(400, 200, 10, 10), 
      new THREE.MeshLambertMaterial({ color: 0xffffff })); 
     plane.rotation.x = -Math.PI/2; 
     plane.position.y = -25.1; 
     plane.receiveShadow = true; 
     scene.add(plane); 

     var light = new THREE.SpotLight(); 
     light.castShadow = true; 
     light.position.set(170, 330, -160); 
     scene.add(light); 
     var litCube = new THREE.Mesh(
      new THREE.CubeGeometry(50, 50, 50), 
      new THREE.MeshLambertMaterial({ color: 0xffffff })); 
     litCube.position.y = 50; 
     litCube.castShadow = true; 
     scene.add(litCube); 

     renderer.shadowMapEnabled = true; 


     renderer.render(scene, camera); 
     var paused = false; 
     var last = new Date().getTime(); 
     var down = false; 
     var sx = 0, sy = 0; 
     window.onmousedown = function (ev) { 
      down = true; sx = ev.clientX; sy = ev.clientY; 
     }; 
     window.onmouseup = function() { down = false; }; 
     window.onmousemove = function (ev) { 
      if (down) { 
       var dx = ev.clientX - sx; 
       var dy = ev.clientY - sy; 
       camera.position.x += dx; 
       camera.position.y += dy; 
       sx += dx; 
       sy += dy; 
      } 
     } 
     function animate(t) { 
      if (!paused) { 
       last = t; 
       litCube.position.y = 60 - Math.sin(t/900) * 25; 
       litCube.position.x = Math.cos(t/600) * 85; 
       litCube.position.z = Math.sin(t/600) * 85; 
       litCube.rotation.x = t/500; 
       litCube.rotation.y = t/800; 
       renderer.clear(); 
       camera.lookAt(scene.position); 
       renderer.render(scene, camera); 
      } 
      window.requestAnimationFrame(animate, renderer.domElement); 
     }; 
     animate(new Date().getTime()); 
     onmessage = function (ev) { 
      paused = (ev.data == 'pause'); 
     }; 
    </script> 
</body> 

</html> 

, 谢谢:)

回答

1

等待你的重播您需要实现不同和分离的部分做到这一点:

  • 选择对象可以通过使用Raycaster完成,你会在这里找到很多例子,并在three.js的例子中,例如this one
  • 照相机的方向 - 请参见camera.lookAt(target.position) - 可以通过多种方式进行缩放,但您可能需要使用某种控制来简化相机放置过程,例如one of these。例如TrackballControls似乎是合适的。

  • 最后一点,就像你的标题所说的“滑动”一样,是“摄像机跳转”完成的方式。如果你想要平滑的缩放,你需要一种缓动功能。看看这个Tween.js

0

vincent写了一个很好的答案。我只是想添加一个示例来帮助理解。

Jsfiddle

<script> 
     var container, stats; 
     var camera, scene, projector, raycaster, renderer, selected; 
     var target, zoom=false; 

     var mouse = new THREE.Vector2(), INTERSECTED; 
     var radius = 100, theta = 0; 

     init(); 
     animate(); 

     function init() { 

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

      camera = new THREE.PerspectiveCamera(70, window.innerWidth/window.innerHeight, 1, 10000); 

      scene = new THREE.Scene(); 

      var light = new THREE.DirectionalLight(0xffffff, 2); 
      light.position.set(1, 1, 1).normalize(); 
      scene.add(light); 

      var light = new THREE.DirectionalLight(0xffffff); 
      light.position.set(-1, -1, -1).normalize(); 
      scene.add(light); 

      var geometry = new THREE.CubeGeometry(20, 20, 20); 
      var cube = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: '#F3B557' })); 
      cube.rotation = new THREE.Euler(0,Math.PI/4,0); 
      cube.position = new THREE.Vector3(-20,0,0); 
      scene.add(cube); 

      cube = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: '#F05B47' })); 
      cube.rotation = new THREE.Euler(0,Math.PI/4,0); 
      cube.position = new THREE.Vector3(20,0,0); 
      scene.add(cube); 


      projector = new THREE.Projector(); 
      raycaster = new THREE.Raycaster(); 

      renderer = new THREE.WebGLRenderer(); 
      renderer.setClearColor(0xf0f0f0); 
      renderer.setSize(window.innerWidth, window.innerHeight); 
      renderer.sortObjects = false; 
      container.appendChild(renderer.domElement); 

      document.addEventListener('mousemove', onDocumentMouseMove, false); 
      window.addEventListener('resize', onWindowResize, false); 
      renderer.domElement.addEventListener('mousedown', onCanvasMouseDown, false); 
     } 

     function animate() { 

      requestAnimationFrame(animate); 
      render(); 

     } 

     function render() { 
      // set lookAt position according to target position 
      if(target){ 
       camera.lookAt(target.position); 
      }else{ 
       camera.lookAt(new THREE.Vector3(0,0,0)); 
      } 

      //zoom in and out 
      if(zoom && camera.fov>10){ 
       camera.fov-=1; 
       camera.updateProjectionMatrix(); 
      }else if(!zoom && camera.fov<70){ 
       camera.fov+=1; 
       camera.updateProjectionMatrix(); 
      } 


      camera.position = new THREE.Vector3(0,100,100); 


      // find intersections 
      var vector = new THREE.Vector3(mouse.x, mouse.y, 1); 
      projector.unprojectVector(vector, camera); 
      raycaster.set(camera.position, vector.sub(camera.position).normalize()); 

      var intersects = raycaster.intersectObjects(scene.children); 
      if (intersects.length > 0) { 
       if (INTERSECTED != intersects[ 0 ].object) { 
        if (INTERSECTED) INTERSECTED.material.emissive.setHex(INTERSECTED.currentHex); 

        INTERSECTED = intersects[ 0 ].object; 
        INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex(); 
        INTERSECTED.material.emissive.setHex(0xff0000); 
       } 
      } else { 
       if (INTERSECTED) INTERSECTED.material.emissive.setHex(INTERSECTED.currentHex); 
       INTERSECTED = null; 
      } 
      renderer.render(scene, camera); 

     } 

     function onWindowResize() { 

      camera.aspect = window.innerWidth/window.innerHeight; 
      camera.updateProjectionMatrix(); 

      renderer.setSize(window.innerWidth, window.innerHeight); 

     } 

     function onDocumentMouseMove(event) { 

      event.preventDefault(); 

      mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
      mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 

     } 

     //detect selected cube 
     function onCanvasMouseDown(event){ 
      if(INTERSECTED){ 
       target = INTERSECTED; 
       zoom = true; 
      }else{ 
       zoom = false; 
      } 
     } 

    </script>