therejs vrjs实例练习

参考: https://github.com/jeromeetienne/AR.js/blob/master/three.js/examples/basic.html

<html>
  <head>
    <meta charset="utf-8" />
    <title>three ar</title>
    <style>
      #canvas-frame {
        width: 100%;
        height: 600px;
      }
      canvas {
        width: 100%;
        height: 600px;
      }
    </style>
    <script type="text/javascript" src="js/three.min.js"></script>
    <script type="text/javascript" src="js/stats.min.js"></script>
    <script type="text/javascript" src="js/ar.min.js"></script>
    <script>
      THREEx.ArToolkitContext.baseURL = '';
    </script>
    
  </head>
  <body>
    
    <script>
      // 初始化 renderer
      var renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
      });
      renderer.setClearColor(new THREE.Color('lightgrey'), 0);
      renderer.setSize(640, 480);
      renderer.domElement.style.position = 'absolute';
      renderer.domElement.style.top = '0px';
      renderer.domElement.style.left = '0px';
      document.body.appendChild(renderer.domElement);

      //
      var onRenderFcts = [];
      
      // 创建场景
      var scene = new THREE.Scene();
      // 创建相机
      var camera = new THREE.Camera();
      scene.add(camera);

      // arToolkitSource
      var arToolkitSource = new THREEx.ArToolkitSource({
        sourceType: 'webcam', // 从摄像头读取

        // sourceType: 'image', // 从图片读取
        // sourceUrl: THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg', //图片地址

        // sourceType: 'video', // 从视频读取
        // sourceUrl: THREEx.ArToolkitContext.baseURL + '../data/videos/video.mp4', //视频地址
      });
      
      arToolkitSource.init(function onReady() {
        onResize();
      });

      window.addEventListener('resize', function() {
        onResize();
      });

      function onResize() {
        arToolkitSource.onResize();
        arToolkitSource.copySizeTo(renderer.domElement);
        if (arToolkitContext.arController !== null) {
          arToolkitSource.copySizeTo(arToolkitContext.arController.canvas);
        }
      }

      // arToolkitContext
      var arToolkitContext = new THREEx.ArToolkitContext({
        cameraParametersUrl: THREEx.ArToolkitContext.baseURL + 'data/camera_para.dat',
        detectionMode: 'mono'
      });

      arToolkitContext.init(function onCompleted() {
        camera.projectionMatrix.copy(arToolkitContext.getProjectionMatrix());
      });
      onRenderFcts.push(function() {
        if (arToolkitSource.ready === false) {
          return;
        }
        arToolkitContext.update(arToolkitSource.domElement);
        scene.visible = camera.visible;
      });

      // arMarkerControls
      var markerControls = new THREEx.ArMarkerControls(arToolkitContext, camera, {
        type: 'pattern',
        patternUrl: THREEx.ArToolkitContext.baseURL + 'data/patt.hiro',
        changeMatrixMode: 'cameraTransformMatrix'
      });
      scene.visible = false;
      
      // 添加几何体
      // 立方体
      var geometry = new THREE.CubeGeometry(10, 10, 10);
      var material = new THREE.MeshNormalMaterial();
      var mesh = new THREE.Mesh(geometry, material);
      mesh.position.y = geometry.parameters.height / 2;
      scene.add(mesh);
      // 扭曲管道
      var geometry = new THREE.TorusKnotGeometry(0.3, 0.1, 64, 16);
      //var geometry = new THREE.CubeGeometry(10, 10, 10);
      var material = new THREE.MeshNormalMaterial({Color: 0x00ff00});
      var mesh = new THREE.Mesh(geometry, material);
      mesh.position.y = 0.5;
      scene.add(mesh);

      onRenderFcts.push(function(delta) {
        mesh.rotation.x += Math.PI * delta;
      });

      onRenderFcts.push(function() {
        renderer.render(scene, camera);
      });
      
      var lastTimeMsec = null;
      requestAnimationFrame(function animate(nowMsec) {
        requestAnimationFrame(animate);
        lastTimeMsec = lastTimeMsec || nowMsec - 1000 / 60;
        var deltaMsec = Math.min(200, nowMsec - lastTimeMsec);
        lastTimeMsec = nowMsec;
        onRenderFcts.forEach(function(onRenderFct) {
          onRenderFct(deltaMsec / 1000, nowMsec / 1000);
        })
      });

    </script>
  </body>
</html>

 

therejs vrjs实例练习

 

therejs vrjs实例练习