therejs vrjs实例练习

本文介绍如何使用AR.js和Three.js库在Web上实现增强现实效果,包括设置WebGL渲染器、创建场景、配置AR工具包上下文、添加几何体以及实时更新渲染。通过实例代码详细展示了从摄像头读取数据、处理AR标记和渲染3D模型的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: 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>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值