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);