Javascript 使用4x4矩阵动态移动、旋转透视摄影机
亲爱的社区: 我最近几天一直在处理相同的问题,这是我相机的视图矩阵(4x4)的更新。它应该用于通过three.js中的AR场景设置位置 自定义矩阵包含直接稀疏里程计的值,该值将通过WebView的JavaScript界面解析为字符串,并提供我当前姿势的值。根据我的初始点,DSO开始跟踪房间和相机位置(让我们忽略这一点以保持简单),之后应该与透视相机同步。 将此字符串转换为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?)没有引起任何问题(不更新,也不使用任何
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独有的,在所有主要的增强现实框架中都是相同的
通常,场景的原点和摄影机的初始位置相同,这使得框架更容易相对于原点(摄影机的起始位置)放置内容
一旦场景的原点建立,相机就可以自由地在场景中移动,由用户自行决定,因此不能强制相机朝某个方向看,因为渲染引擎没有该控制
[更新]
如果您试图强迫用户关注场景中的特定内容,那么您可以尝试移动场景内容,使其直接出现在用户的视图中。我更新了我的回复,并针对您的问题提出了可能的解决方案。非常感谢您提供的信息。我非常感谢!遗憾的是,我必须使用场景的绝对位置框,因为用户应该能够扫描此边界框内的对象。