Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用4x4矩阵动态移动、旋转透视摄影机_Javascript_Matrix_Three.js_Augmented Reality_Move - Fatal编程技术网

Javascript 使用4x4矩阵动态移动、旋转透视摄影机

Javascript 使用4x4矩阵动态移动、旋转透视摄影机,javascript,matrix,three.js,augmented-reality,move,Javascript,Matrix,Three.js,Augmented Reality,Move,亲爱的社区: 我最近几天一直在处理相同的问题,这是我相机的视图矩阵(4x4)的更新。它应该用于通过three.js中的AR场景设置位置 自定义矩阵包含直接稀疏里程计的值,该值将通过WebView的JavaScript界面解析为字符串,并提供我当前姿势的值。根据我的初始点,DSO开始跟踪房间和相机位置(让我们忽略这一点以保持简单),之后应该与透视相机同步。 将此字符串转换为4x4矩阵有效,但设置: matrixWorldInverse(ViewMatrix?)没有引起任何问题(不更新,也不使用任何

亲爱的社区:

我最近几天一直在处理相同的问题,这是我相机的视图矩阵(4x4)的更新。它应该用于通过three.js中的AR场景设置位置

自定义矩阵包含直接稀疏里程计的值,该值将通过WebView的JavaScript界面解析为字符串,并提供我当前姿势的值。根据我的初始点,DSO开始跟踪房间和相机位置(让我们忽略这一点以保持简单),之后应该与透视相机同步。 将此字符串转换为4x4矩阵有效,但设置:

  • matrixWorldInverse(ViewMatrix?)没有引起任何问题(不更新,也不使用任何“通用”更新函数)
  • projectionMatrix会放大和缩小场景,但不会提供任何移动、旋转。就我而言,它只用于特征
  • 是否有其他方法在场景中移动、旋转摄影机

    如果使用Matrix.set()方法或fromArray()和/或threejs提供的任何其他更新函数,则不会有任何更改

    多谢各位

       var renderer, scene, camera, box, geometry, material, poseMatrix;
    
       init();
       animate();
       render();
    
       function init() {
            // renderer
           renderer = new THREE.WebGLRenderer({
               canvas: document.getElementById("mCanvas"),
               alpha: true
           });
           renderer.setClearColor(0xffffff, 0);
           renderer.setSize(window.innerWidth, window.innerHeight);
           document.body.appendChild(renderer.domElement);
           // scene
           scene = new THREE.Scene();
    
           // camera
           camera = new THREE.PerspectiveCamera(
               75,
               window.innerWidth / window.innerHeight,
               1,
               1000
           );
    
           scene.add(camera);
    
           scene.add(new THREE.AxesHelper(100));
    
           placeBox();
           initPose();
    
       }
    
       function render() {
           renderer.render(scene, camera);
       }
    
       function placeBox()
       {
       // Using a test object which needs to have an absolute  position in world coordinates
           geometry = new THREE.BoxBufferGeometry(3, 5, 3 );
           material = new THREE.MeshLambertMaterial({color: 0xfece46, wireframe: true, wireframeLinewidth: 3.1});
           box = new THREE.Mesh(geometry, material);
    
           // depends on parent coordinates
           box.position.set(0, 0, -10);
           scene.add(box);
           }
    
       function animate() {
           setCurrentPose();
           renderer.render(scene, camera);
       }
    
       function initPose(){
           // Default value provided by DSO
           var mTmpPose = "1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1"; //initial point of DSO
           var mDefaultPose = mTmpPose.split(',');
    
           // DSO Standard Pose 4x4 Matrix
          camera.matrixAutoUpdate = false;
          camera.matrixWorldInverse.fromArray(mDefaultPose);
    
           camera.updateWorldMatrix();
    
         //camera.updateProjectionMatrix(); <- does not work
        //camera.updateMatrix(); <- same issue
    
       }
       function setCurrentPose(){
    
       //Provides a string with current pose values
           var tmp = Android.getCurrentPose(); // example: 0.8953773, 0.39648485, 0.20272951, 0.0,
                                               //         -0.3792577, 0.44037524, 0.81377715, 0.0,
                                               //           0.23337325,-0.8055243, 0.5446719, 0.0,
                                               // .          -2.5238492, 13.470952, 0.715593, 1.0
           var pose = tmp[0].split(',');
    
           camera.matrixWorldInverse.fromArray(pose);
       // camera.projectionMatrix.fromArray(pose);
    
           camera.updateWorldMatrix();
        //   camera.updateProjectionMatrix(); <- does not work
       // camera.updateMatrix(); <- same issue
       }
    
    
    
    
    var渲染器、场景、摄影机、长方体、几何体、材质、poseMatrix;
    init();
    制作动画();
    render();
    函数init(){
    //渲染器
    renderer=new THREE.WebGLRenderer({
    画布:document.getElementById(“mCanvas”),
    阿尔法:是的
    });
    setClearColor(0xffffff,0);
    renderer.setSize(window.innerWidth、window.innerHeight);
    document.body.appendChild(renderer.doElement);
    //场面
    场景=新的三个。场景();
    //摄像机
    摄像机=新的三视角摄像机(
    75,
    window.innerWidth/window.innerHeight,
    1.
    1000
    );
    场景。添加(摄影机);
    场景。添加(新的三个。AxeHelper(100));
    placeBox();
    initPose();
    }
    函数render(){
    渲染器。渲染(场景、摄影机);
    }
    函数placeBox()
    {
    //使用需要在世界坐标中具有绝对位置的测试对象
    几何体=新的三个。几何体(3,5,3);
    material=new THREE.MeshLambertMaterial({color:0xfece46,线框:true,线框线宽:3.1});
    长方体=新的三个网格(几何体、材质);
    //取决于父坐标
    框。位置。设置(0,0,-10);
    场景。添加(框);
    }
    函数animate(){
    setCurrentPose();
    渲染器。渲染(场景、摄影机);
    }
    函数initPose(){
    //DSO提供的默认值
    var mTmpPose=“1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1”;//DSO的初始点
    var mDefaultPose=mTmpPose.split(',');
    //DSO标准姿势4x4矩阵
    camera.matrixAutoUpdate=false;
    camera.matrixWorldInverse.fromArray(mDefaultPose);
    camera.updateWorldMatrix();
    
    //camera.UpdateProjectMatrix();在增强现实中无法设置相机矩阵(在VR中可以设置),因为在AR中,相机位置由用户控制。这不是Aframe/Three.js独有的,在所有主要的增强现实框架中都是相同的

    通常,场景的原点和摄影机的初始位置相同,这使得框架更容易相对于原点(摄影机的起始位置)放置内容

    一旦场景的原点建立,相机就可以自由地在场景中移动,由用户自行决定,因此不能强制相机朝某个方向看,因为渲染引擎没有该控制

    [更新]


    如果您试图强迫用户关注场景中的特定内容,那么您可以尝试移动场景内容,使其直接出现在用户的视图中。

    我更新了我的回复,并针对您的问题提出了可能的解决方案。非常感谢您提供的信息。我非常感谢!遗憾的是,我必须使用场景的绝对位置框,因为用户应该能够扫描此边界框内的对象。