【问题标题】:How to link multiple 3D objects to list buttons with Three.js?如何使用 Three.js 将多个 3D 对象链接到列表按钮?
【发布时间】:2020-05-20 11:38:33
【问题描述】:

我对 Three.js 感到困惑,因为我从上周才开始使用它。 我的流程似乎没有错,但错误:Three.js:5630 THREE.Object3D.add: object not an instance of THREE.Object3D。 models/wolf.obj 仍然出现。 我的想法是每个被推入屏幕的 wolf 对象,都会生成一个 wolf 按钮来与之链接。各位大神能不能给点解决办法。关于我的问题?太感谢了!! 我的代码如下:

<script>

        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);


window.addEventListener('resize',function(){
    var width = (window.innerWidth);
    var height = window.innerHeight;
    renderer.setSize(width,height);
    camera.aspect = width/height;
    camera.updateProjectionMatrix();
})
controls  = new THREE.OrbitControls(camera,renderer.domElement);

var index = 0;
var files = ['models/deer.obj','models/wolf.obj'];

var objLoader = new THREE.OBJLoader();

function loadNextFile() {
var name='';
  if (index > files.length - 1) return;

  objLoader.load(files[index], function(object) {

    // scene.add(object);
    console.log(index);
    var menuItems = document.createElement('button');
            console.log(files[index]);
            name = name + files[index];
            menuItems.name = name;
            menuItems.innerHTML = name;
            menuItems.addEventListener('click', onClick);
            rightMenu.appendChild(menuItems);
    index++;
    loadNextFile();

  });

}

loadNextFile();
</script>
function onClick(event){
    var name = event.target.name.trim();
    alert(event.target.name.trim());
     // console.log(event.target.name);
    files.forEach(function(obj){
        console.log("name= "+event.target.name);
        console.log("obj= "+obj);

        if (obj = name) scene.add(obj);
        else scene.remove(obj);
    });
}

【问题讨论】:

标签: javascript three.js


【解决方案1】:

您不会在任何地方存储回调到objLoader 的结果。 files 是一个字符串数组,而不是你加载的东西的数组。

我可能会做点别的。例如

const files = ['models/deer.obj','models/wolf.obj'];
const loadedObjects = [];

const objLoader = new THREE.OBJLoader();

function loadNextFile() {
  if (files.length === 0) {
    return;
  }
  const filename = files.shift();
  objLoader.load(filename, function(object) {
    loadedObjects.push(object);
    const menuItems = document.createElement('button');
    menuItems.textContent = filename;
    menuItems.addEventListener('click', makeOnClick(object));
    rightMenu.appendChild(menuItems);
    loadNextFile();
  });
}

loadNextFile();

function makeOnClick(object) {
  return function(event) {
    for (const obj of loadedFiles) {
        if (object === obj) {
            scene.add(obj);
        } else {
            scene.remove(obj);
        }
    }
  };
}

【讨论】:

  • 我正在寻找您放入的 loadedObjectndx 的声明
  • 没关系,我已经按照您的指南进行操作,但是在 push 对象到新的空 loadedFiles 并运行代码之后,我的控制台日志当为 loadedFiles 创建一个 forEach 循环时,看起来像这样:obj= [object Object] index= 0
猜你喜欢
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2012-02-20
  • 2022-01-20
  • 2019-02-22
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多