1. 程式人生 > >VR開發 入門 使用Three.js 開發的WebVR demo

VR開發 入門 使用Three.js 開發的WebVR demo

使用Three.js,並且參考網上開源的程式碼,終於實現了第一個VR程式。

線上演示:

https://ritterliu.github.io/WebVR_Demo/


<!DOCTYPE html>
<html>
<head>
  <title>WebVR Demo</title>
  <style>
  body {
    width: 100%;
    height: 100%;
    background-color: #000;
  }
  </style>
</head>
<body>
  <script src="./js/three.min.js"></script>
  <script src="./js/StereoEffect.js"></script>
  <script src="./js/OrbitControls.js"></script>
  <script src="./js/DeviceOrientationControls.js"></script>
  <script src="./js/helvetiker_regular.typeface.js"></script>

  <script>
  var scene, camera, renderer, effect, element, controls, word = "Ritter's VR World";
  init();

  function init() {
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.001, 700);
    camera.position.set(0, 15, 0);
    scene.add(camera);

    renderer = new THREE.WebGLRenderer();
    element = renderer.domElement;
    document.body.appendChild(renderer.domElement);

    effect = new THREE.StereoEffect(renderer);

    //Handle mouse control
    controls = new THREE.OrbitControls(camera, renderer.domElement);
    controls.target.set(
      camera.position.x + 0.01,
      camera.position.y,
      camera.position.z
    );
    window.addEventListener('deviceorientation', setDeviceOrientationControls, true);

    //Create light
    var light = new THREE.PointLight( 0xffffff, 1.2, 0 );
    light.position.set(0, 50, 0);
    scene.add(light);

    // Create floor
    var floorTexture = THREE.ImageUtils.loadTexture('img/grass.jpg');
    floorTexture.wrapS = THREE.RepeatWrapping;
    floorTexture.wrapT = THREE.RepeatWrapping;
    floorTexture.repeat = new THREE.Vector2(50, 50);
    var floorMaterial = new THREE.MeshPhongMaterial({
      map: floorTexture
    });
    var floorGeometry = new THREE.PlaneBufferGeometry(1000, 1000);
    var floor = new THREE.Mesh(floorGeometry, floorMaterial);
    floor.rotation.x = -Math.PI / 2;
    scene.add(floor);

    // Create box
    var geometry = new THREE.BoxGeometry(6, 6, 6);
    var material = new THREE.MeshNormalMaterial();
    var cube = new THREE.Mesh(geometry, material);
    cube.position.set(-15, 30, 10);
    scene.add(cube);

    //Create text
    var textGeometry = new THREE.TextGeometry(word, {
      size: 5,
      height: 1
    });
    var text = new THREE.Mesh(textGeometry, new THREE.MeshBasicMaterial({
      color: 0xffffff
    }));
    text.position.set(15, 15, -25);
    text.rotation.set(0, 30, 0);
    scene.add(text);

    animate();
  }

  // Our preferred controls via DeviceOrientation
  function setDeviceOrientationControls(e) {
    controls = new THREE.DeviceOrientationControls(camera, true);
    controls.connect();
    controls.update();
    window.removeEventListener('deviceorientation', setDeviceOrientationControls, true);
  }

  function animate() {
    requestAnimationFrame(animate);

    var width = window.innerWidth;
    var height = window.innerHeight;

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

    renderer.setSize(width, height);
    effect.setSize(width, height);

    camera.updateProjectionMatrix();

    controls.update();
    effect.render(scene, camera);
  }
  </script>
</body>
</html>

原始碼下載:

https://github.com/ritterliu/WebVR_Demo

參考文獻:

http://threejs.org/docs/

http://mt.sohu.com/20151026/n424132314.shtml

http://www.sitepoint.com/bringing-vr-to-web-google-cardboard-three-js/