【问题标题】:Problems rendering a list of threeJs renderers渲染threeJs渲染器列表的问题
【发布时间】:2019-11-07 14:52:17
【问题描述】:

我正在尝试在同一 html 页面上显示渲染器/场景/相机“组”列表。我在尝试使用 requestAnimationFrame 在所有这些上实现渲染循环时遇到了问题。但是,我无法通过循环遍历列表来成功渲染单个帧。

在我实例化它们的同一函数中对每个“组”调用 renderer.render 可以正常工作。我重构了代码以允许在所述函数之外的每个渲染器上调用渲染,我的蓝色球体消失了;

我有一些元素...

 <div class="1"></div>
 <div class="2"></div>
 <div class="3"></div>
 <div class="4"></div>

我添加了一些threeJs的东西

$(document).ready(function(){
    addResizeandCenterListener(window, $("#container"), 4/3);
    addResizeListener($("#container"), $(".playerhalf"), 2/1);
    for (let item of [".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8"]) {
        var threeDetails = addThreeRendererToElem($(item), item);
        var scene = threeDetails["scene"];
        addClickListenerToElem($(item), scene);
    }
});
threeList = [];

//this adds a renderer/scene/camera to the element "elem"
function addThreeRendererToElem(elem, name){
    var width = elem.innerWidth();
    var height = elem.innerHeight();
    var scene = newScene();
    scene.name = name;
    addDefaultLight(scene);
    addBlueBall(scene);
    var camera = addDefaultCamera(scene, width, height);
    var renderer = newRenderer(width, height);
    elem[0].appendChild(renderer.domElement);
    //this works fine regardless of how many renderer/scene/camera groups I have placed in the DOM
    //renderer.render(scene, camera);
    var threeDict = {"renderer":renderer, "scene":scene, "camera":camera}
    threeList.push(threeDict)
    //this does not work, even if I only place a single renderer/scene camera group in the DOM
    renderList();
}

function renderList() {
    var tlist = threeList;
    for (var i = 0; i< tlist;i++) {
        var threeDict = tlist[i];
        threeDict["renderer"].render(threeDict["scene"], 
                                     threeDict["camera"]);
    }
}

function newScene(){
    scene = new THREE.Scene();
    return scene;
}

function newCamera(w, h){
    camera = new THREE.PerspectiveCamera(45, w / h, 0.1, 100);
    return camera;
}

function newRenderer(w, h){
    renderer = new THREE.WebGLRenderer({alpha:true, antialias:true});
    renderer.setSize(w, h);
    return renderer;
}

function addObjectToScene(obj, scene){    
    scene.add(obj);
}

function ballObj(color){
    var ballGeometry = new THREE.SphereGeometry(3, 16, 16);
    var ballMaterial = new THREE.MeshPhongMaterial({color: 0x33aaff});
    var ball = new THREE.Mesh(ballGeometry, ballMaterial);
    return ball;
}

function spotLightObj(){
    var spot = new THREE.SpotLight(0xffffff);
    return spot;
}

function addDefaultCamera(scene, width, height){
    var camera = newCamera(width, height);    
    camera.position.set(1,1,20);
    camera.lookAt(scene.position);
    return camera;
}

function addDefaultLight(scene){    
    var spot = spotLightObj();
    spot.position.set(1, 10, 4);
    addObjectToScene(spot, scene);
}

function addBlueBall(scene){
    var hexcolor = "0x33aaff";
    bball = ballObj(hexcolor);
    addObjectToScene(bball, scene);
}

我希望看到一些蓝色球体,例如当我从 addThreeRendererToElem 内部调用渲染时,但我没有。相反,画布都是空白的。画布在网页上的正确位置,在控制台中检查 threeList 显示所有对象确实在那里。没有错误消息。

【问题讨论】:

  • 仅供参考,我建议您可能想使用一个渲染器。它将加载更快,使用更少的内存,并且性能更高。见this article
  • @gman 我在寻求做我想做的事情时阅读了这篇文章。稍后我很可能会转向该模式,但是将每个场景都放在自己的画布中对我来说更快,因为让画布使用其父元素调整大小是微不足道的。在画布上定位每个场景并不是我目前非常熟悉的,所以我最初选择了这种方式。

标签: javascript three.js scene renderer


【解决方案1】:

renderList 函数内的 for 循环的结束条件不正确。

您缺少.length。应该是:

function renderList() {
    var tlist = threeList;
    for ( var i = 0; i < tlist.length; i++ ) {
        var threeDict = tlist[i];
        threeDict["renderer"].render( threeDict["scene"], threeDict["camera"] );
    }
}

【讨论】:

  • 哇哦。我今天不是很注意。太感谢了。我一直在用渲染器尝试各种事情。我什至在该函数中进行了日志记录,但如果我将它放在循环中,我可能会发现我的错误。非常感谢先生。
  • 很高兴我能帮上忙,不要自责哈哈。附带说明一下,您可能希望为每个画布重用场景/网格/相机对象。仅在您真正需要时重新创建事物。祝你好运。
  • 我在看这个,但是单独使用有一定的易用性。我很可能会转而使用单个渲染器,也可能是单个摄像机,但是要正确调整大小和缩放比例,每个 div 会按比例调整其中的场景大小,这种方法让我获得了最快的速度。不过感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2015-07-28
  • 2013-07-06
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多