Three.js使用和不使用morphTargets加载2个网格时出错

时间:2016-12-22 05:45:09

标签: javascript three.js

最初加载没有morphTargets的模型并克隆几何体。 使用webworker读取包含morphTargets的文件,并使用此代码转换为THREE对象

i = timeStep;
dstVertices = [];
srcVertices = morphTargets.vertices;
for (v = 0, vl = srcVertices.length; v < vl; v += 3) {
    var vertex = new THREE.Vector3();
    vertex.x = srcVertices[ v ];
    vertex.y = srcVertices[ v + 1 ];
    vertex.z = srcVertices[ v + 2 ];
    dstVertices.push(vertex);
}
geo.morphTargets.push(dstVertices);
timeStep += 1;

在稍后阶段创建的新几何体包括克隆几何体的顶点和面以及dstVertices作为morphTargets。

从场景中删除了先前创建的网格,并添加了新创建的包含morphTargets的网格。

控制台抛出此错误:

Uncaught TypeError: Cannot read property '52' of undefined
    at setMeshBuffers (three_70.js:18797)
    at updateObject (three_70.js:21142)
    at THREE.WebGLRenderer.renderBuffer (three_70.js:19970)
    at renderObjects (three_70.js:20681)
    at THREE.WebGLRenderer.render (three_70.js:20544)
    at animate (index1.php:70)

任何人都可以指导我出错的地方吗?

1 个答案:

答案 0 :(得分:0)

我假设你解析了一个图形文件,并且你试图在web worker中创建webgl对象。当我使用web worker解析3d文件和启动WebGL的对象时,我遇到了同样的问题。首先,我遇到了像你这样的错误然后我意识到每个web工作者都有自己的范围。所以,我将(postMessage)值传递给触发了web worker的main.js,然后我就可以在main.js的onmessage方法上定义对象了。

您可以使用postmessage方法发布v,v + 1和v + 2值,并且可以在定义和调用Web worker的位置创建三个verctor对象。

我想说的是你不应该在web worker中初始化three.vectors对象,因为它很难处理。不要忘记web worker支持postmessage上的简单对象传输。因此,您应该尝试简化。使用postmessage时不要尝试发布three.vector对象。