Three.js ThreeJS将属性从一个摄影机应用到另一个摄影机

Three.js ThreeJS将属性从一个摄影机应用到另一个摄影机,three.js,Three.js,在我的webapp中,我在不同的modals/弹出窗口/对话框中使用了三个js场景,它们具有不同的宽高比 此外,我想在这些不同的场景中使用多个用户定义的相机设置(旋转、位置、注视等) 因此,当用户单击“捕获摄影机设置”按钮时,我通过camera.toJSON()保存摄影机对象 (在执行此操作之前,我只保存了对象摄影机,但不幸的是,这些对象非常大,在存储多个摄影机对象时会降低性能。不过,这种方法还是有效的,因为我能够在保存的摄影机对象和当前使用的摄影机之间复制所有所需的值[例如,current\u

在我的webapp中,我在不同的modals/弹出窗口/对话框中使用了三个js场景,它们具有不同的宽高比

此外,我想在这些不同的场景中使用多个用户定义的相机设置(旋转、位置、注视等)

因此,当用户单击“捕获摄影机设置”按钮时,我通过
camera.toJSON()
保存摄影机对象

(在执行此操作之前,我只保存了对象
摄影机
,但不幸的是,这些对象非常大,在存储多个摄影机对象时会降低性能。不过,这种方法还是有效的,因为我能够在保存的摄影机对象和当前使用的摄影机之间复制所有所需的值[例如,
current\u camera.position.x=保存的\u camera.position.x
等等])

在我现在想要使用保存的属性的每个场景中,我尝试了以下操作:

let m = new THREE.Matrix4();
m.fromArray(saved_camera.object.matrix);
current_camera.applyMatrix(m)
current_camera.updateMatrix();
不幸的是,这不起作用


“正常”
摄影机
对象
camera.toJSON()
object

如果您喜欢使用矩阵,那么您可以关闭three.js在渲染过程中所做的矩阵自动更新,并使世界矩阵保持最新。(这包括更改相机方向的任何时间,因此如果您使用某种形式的鼠标交互来控制相机角度,请记住这一点。)

首先,通过将
autoUpdateMatrix
属性设置为
false
,关闭相机的自动矩阵更新。您仍然可以使用便利属性(
position
rotation
scale
),但必须通过调用
camera.updatematrix world(true)手动更新世界矩阵;

最后,当您准备恢复特定的相机方向时,只需使用
matrixWorld
copy
方法复制矩阵值即可

var origin=new THREE.Vector3();
var theCamera=新的三透视照相机(35,1,1,1000);
theCamera.autoUpdateMatrix=false;//关闭自动更新
摄像机位置设置(10,10,10);
摄像机。注视(原点);
theCamera.updateMatrix世界(true);//手动更新矩阵!
log(“摄影机原始矩阵:”,theCamera.matrixWorld.elements.toString());
var saveMatrix=new THREE.Matrix4();
saveMatrix.copy(theCamera.matrixWorld);
//saveMatrix现在包含Camera.matrixWorld的当前值
摄像机位置设置(50,-50,75);
摄像机。注视(原点);
theCamera.updateMatrix世界(true);//手动更新矩阵!
log(“摄像机移动矩阵:”,theCamera.matrixWorld.elements.toString());
//Camera.matrixWorld现在保存的值与saveMatrix不同。
theCamera.matrixWorld.copy(保存矩阵);
//不要升级矩阵,因为你只是设置了它。
log(“摄像机移动矩阵:”,theCamera.matrixWorld.elements.toString());
//Camera.matrixWorld再次包含保存的值。

camera.autoUpdateMatrix=false;对OrbitControl有影响吗?我仍然可以用这种方法使用OrbitControl吗?@d4rty我已经更新了我的答案,并提供了更多信息来回答您的评论。为什么不
camera.copy(savedCamera)
?@WestLangley这会产生一系列错误,因为
savedCamera
不是
3的类型。透视摄影机
,由于应用了
.toJSON()
,所以不使用
.toJSON()
。只需创建名为
savedCamera
的新摄影机实例,然后保存:
savedCamera.copy(摄影机);
。要还原:
camera.copy(savedCamera)