【发布时间】:2016-09-27 16:02:32
【问题描述】:
我在 3D 应用程序中结合使用了 three.js 和 OrbitControls.js。有时WebGLRenderer.render 会被未定义的摄像头调用。当我使用 OrbitConrols 提供的控件使用鼠标导航 3D 模型时会发生这种情况。
未定义的相机参数很奇怪,因为我的animate 函数(见下面的代码)总是使用定义明确的相机调用WebGLRenderer.render。此外,在实例化 OrbitControls 时,我给它一个定义明确的相机。所以问题是 - WebGLRenderer.render 怎么会在某个时候被未定义的摄像头调用?
注意:WebGLRenderer.render函数的源代码可以在three.js源代码中的line 20426看到。
我试图通过搜索文本字符串render( 来定位所有潜在的呼叫站点。字符串 render( 上有 14 个这样的匹配项,但这些匹配项都没有给出未定义的相机作为参数。因此,这条小路很冷。
我尝试从被调用者(WebGLRenderer.renderfunction 的函数体)进行堆栈跟踪,但这只会导致返回到一些混合的事件中心。但它给了我一个提示,调用者可能是 Javascript 本身,从它的 DOM 事件系统调用。这就解释了为什么我在 three.js 源代码中找不到调用站点。
因此,问题可能与 OrbitControls 与 Javascript 事件系统交互的点有关。初始化我的应用程序时,我在 OrbitControls 实例上注册了一个事件。请参阅下面的代码。这会引起麻烦吗?发生这种情况时,没有相机作为参数给出:/
var myControls = require('../../instances/three/myControls');
var myRenderer = require('../../instances/three/myRenderer');
myControls.damping = 0.2;
myControls.domElement.addEventListener( 'change', myRenderer.render );
编辑: 我正在使用这些版本:
three.js 0.81.0
three-orbit-controls 72.0.0
【问题讨论】:
-
您的问题令人困惑-您是说您的
myCamera变量未定义吗?那只是你自己做的一个变量。您可以控制它的实例化和传递方式。如果不知道你是如何/在哪里制作myCamera,就不可能知道发生了什么。 -
此外,几乎每个示例的源代码都包含一个简单的场景和相机设置,以及渲染循环threejs.org/examples。点击任何示例上的“查看源代码”按钮。
-
myCamera 总是被定义。我有一个 if 语句,如果它变得未定义,应该对我大喊大叫(可以在上面引用的代码中看到)。为了清晰起见(希望如此),我进行了编辑,并在我定义 myCamera 的位置添加了源代码。
-
有人用未定义的相机调用渲染,这不是我的动画功能。当我单击鼠标拖动模型(使用轨道控制)时,会发生错误。因此,也许 orbitcontrols 正在使用未定义的相机。我需要追踪坏呼叫站点。
-
当您设置轨道控制时,您是否根据需要将相机传递给它?
new THREE.OrbitControls( camera, renderer.domElement );
标签: three.js