Javascript THREE.js通过对象克隆将多个视图复制到多个画布。陷阱?

Javascript THREE.js通过对象克隆将多个视图复制到多个画布。陷阱?,javascript,html,canvas,three.js,Javascript,Html,Canvas,Three.js,年,我得到了一种方法,可以用鼠标从一个小(不是全屏)画布上拾取对象。 但现在我想显示同一场景的N个不同视图,并且能够进行对象拾取 var obj = new THREE.Object3D(); function traverseChild( elem ) { if(elem.children instanceof Array && elem.children.length > 0) { for(var k in elem.children) {

年,我得到了一种方法,可以用鼠标从一个小(不是全屏)画布上拾取对象。
但现在我想显示同一场景的N个不同视图,并且能够进行对象拾取

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
为了避免复杂性:-
我不希望在一个画布上有N个视口(根据)
而且我更喜欢不做画布复制(按照gman在中的尼斯方法)

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
我正在考虑为每个世界对象创建多个三个网格对象(克隆),每个场景一个克隆:渲染器:画布。
然后我只需要同步克隆的属性

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
还有其他人做过吗?我是否忽略了任何陷阱

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
更新20151202

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
克隆方法工作正常,但最终我使用了我的答案(下面)中提到的多视口多渲染器解决方案

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);

现在我使用一个全屏渲染器,在一个场景中使用多个摄像头提供的多个视口。

这在完全相同的情况下适用于我。你能看看吗

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);

对我来说,克隆对象并不优雅

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
最终我想出了如何从同一场景的不同视口中拾取对象。 技巧包括一个场景、多个视口和渲染器

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
以下不断发展的html应用程序使用了该方法,但我担心它与许多其他(混乱的)代码混在一起:- 最好使用Chrome/Opera(在Windows 7上)或Firefox(在Android上)观看

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);
单击关键点或以启用左视口和右视口。 然后,当您单击三个视口中的任何一个对象时,文本字段将报告对象名称,并且可能会发生一些其他操作,例如声音或对象颜色的更改或跳转到其他网页

var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);

关键的子例程是SOW\u MouseClick\u Maybe\u\u on\u Object。

这看起来很强大,但我可以在创建原始对象时克隆对象,所以目前不需要它。我还使用了多视口解决方案。你能分享你的多视口拾取解决方案吗?在我的回答中,我添加了一个链接。@gman。谢谢,看起来很有趣。在我的回答中,我使用了多视口多渲染器解决方案,但我将记录您的技术以备将来使用。现在我使用一个带有多个视口的全屏渲染器。
var obj = new THREE.Object3D();
function traverseChild( elem ) {
    if(elem.children instanceof Array && elem.children.length > 0) {
        for(var k in elem.children) {
            traverseChild(elem.children[k]);
            }
        } 

        if (elem instanceof THREE.Mesh) {
            var mesh = new THREE.Mesh(elem.geometry.clone(), elem.material.clone());
            mesh.scale.copy(elem.scale);
            mesh.rotation.copy(elem.rotation);
            mesh.position.copy(elem.position);
            obj.add(mesh);
        }
    }

traverseChild(target);

scene.add(obj);