需要帮助,
我正在尝试将活动浏览器选项卡中加载的一个对象的旋转与第二个选项卡中加载的另一个对象同步。旋转时,在活动浏览器选项卡中加载的对象将向另一个发送消息。在第二个选项卡中,将侦听从第一个选项卡发送的消息,并使用旋转值相应地旋转对象。我的代码如下所示,(我参考了这个例子)
let objectLoaded;
let previousMousePosition = {x : 0, y : 0 };
function mouseDown(e) {
isDragging = true;
}
function mouseUp() {
isDragging = false;
if (objectLoaded) {
// publishing the rotation value to another tab using 'hermes' package.
hermes.send('rotation', JSON.stringify({
rotation: objectLoaded.rotation,
quaternion: objectLoaded.getWorldQuaternion(),
matrix: objectLoaded.matrixWorld
}));
}
}
function mouseMove(e) {
const deltaMove = { x : e.offsetX - previousMousePosition.x,y : e.offsetY - previousMousePosition.y };
if (isDragging && objectLoaded) {
const deltaRotationQuaternion = new THREE.Quaternion().setFromEuler(new THREE.Euler(toRadians(deltaMove.y * 1), toRadians(deltaMove.x * 1), 0, 'XYZ'));
objectLoaded.quaternion.multiplyQuaternions(deltaRotationQuaternion, objectLoaded.quaternion);
}
previousMousePosition = {x : e.offsetX, y : e.offsetY };
}
function toRadians(angle) {
return angle * (Math.PI / 180);
}
监听器代码,
hermes.on('rotation', (rotationObj) => {
// rotationObj structure: {rotation: { _x: 0, _y: 0: _z: 0}, quaternion: { _x: 0, _y: 0: _z: 0, _w: 0}}
const target = JSON.parse(rotationObj);
SecondObject.rotateX(target.rotation._x);
SecondObject.rotateY(target.rotation._y);
SecondObject.rotateZ(target.rotation._z);
})
这里的问题是第二个对象未与第一个对象正确同步。有人知道我做错了什么吗?
谢谢
在一个选项卡中,您可以请求当前(绝对)旋转。在另一个中,除了当前旋转之外,您还可以按这些值旋转。这将在您第一次设置非零旋转后立即中断。
你想要的是分配旋转,通过
SecondObject.rotation.copy(target.rotation);