Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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 Three.js Object3D.applyMatrix()设置的比例不正确_Javascript_Node.js_Socket.io_Three.js - Fatal编程技术网

Javascript Three.js Object3D.applyMatrix()设置的比例不正确

Javascript Three.js Object3D.applyMatrix()设置的比例不正确,javascript,node.js,socket.io,three.js,Javascript,Node.js,Socket.io,Three.js,3.js r.71 我刚刚进入Three.js(非常棒的btw),但我遇到了一个问题。我正在尝试使用Socket.io和NodeJS在客户端之间传输几何图形和位置/缩放/旋转更改。在服务器上,我存储了场景和流对象在客户端之间的JSON表示 当对象的矩阵发生变化(位置、比例、旋转)时,我将新矩阵流式传输到服务器并转发给其他客户端。在其他客户机上,我使用流对象(源对象的矩阵)调用applyMatrix() 我遇到的问题是,在调用applyMatrix(sourceMatrix)时,它似乎将现有的比例

3.js r.71

我刚刚进入Three.js(非常棒的btw),但我遇到了一个问题。我正在尝试使用Socket.io和NodeJS在客户端之间传输几何图形和位置/缩放/旋转更改。在服务器上,我存储了场景和流对象在客户端之间的JSON表示

当对象的矩阵发生变化(位置、比例、旋转)时,我将新矩阵流式传输到服务器并转发给其他客户端。在其他客户机上,我使用流对象(源对象的矩阵)调用applyMatrix()

我遇到的问题是,在调用applyMatrix(sourceMatrix)时,它似乎将现有的比例乘以sourceMatrix中找到的比例。例如,当当前对象的比例为x:2、y:1、z:1,并且我应用了具有相同比例的矩阵时,调用applyMatrix后,目标对象的比例为x:4、y:1、z:1

这对我来说似乎是一个错误,但我想再次检查

// Client JS:
client.changeMatrix = function (object) {

    // Set the object's scale to x:2 y:1 z:1 then call this twice.

    var data = {uuid: object.uuid, matrix: object.matrix};
    socket.emit('object:changeMatrix', data);

};

socket.on('object:matrixChanged', function (data) {

    var cIdx = getChildIndex(data.uuid);

    if (cIdx >= 0) {
        scene.children[cIdx].applyMatrix(data.matrix);

        // At this point, the object's scale is incorrect

        ng3.viewport.updateSelectionHelper();
        ng3.viewport.refresh();
    }

});

// Server JS:
socket.on('object:changeMatrix', function (data) {

    socket.broadcast.emit('object:matrixChanged', data);

});

@WestLangley是正确的,我真的不明白apply matrix在做什么(仍然不知道它的用途)

我通过手动设置源矩阵中的每个元素并调用decompose解决了问题:

// Client JS:
socket.on('object:matrixChanged', function (data) {

    var cIdx = getChildIndex(data.uuid);
    var child = null;
    var key;

    if (cIdx >= 0) {
        child = scene.children[cIdx];

        for (key in child.matrix.elements) {
            if (child.matrix.elements.hasOwnProperty(key)) {
                child.matrix.elements[key] = data.matrix.elements[key];
            }
        }

        child.matrix.decompose(child.position, child.quaternion, child.scale);
    }
}
不幸的是,一旦服务器拾取矩阵对象,调用:

child.matrix.copy(data.matrix);

没用。这就是我最终手动设置每个元素的原因。

您不明白
applyMatrix()
在做什么。请看一下该方法的源代码。@WestLangley感谢您提供的指针。我之前仔细阅读了一下代码,但我对3D渲染非常陌生,不太了解矩阵是如何使用的。我想我现在可以使用它了,尽管可能有更好的解决方案
applyMatrix(matrix)
将矩阵表示的变换应用于现有的变换——它不会覆盖现有的变换。如果applyMatrix不是正确的方法,有没有简单的解决方案?将每个元素重新应用到矩阵似乎有点冗长。
matrix.copy(newMatrix)
后跟
matrix.decompose()。