如何从ArrayBuffer构建Float32Array

4

假设我有一个ArrayBuffer,如下截图所示:

Screenshot from google developers console

//recompute object from vertices and normals
const verticesBuffer:ArrayBuffer = e.data.verticesBufferArray;
const normalsBuffer:ArrayBuffer = e.data.normalsBufferArray;

const vertices = new Float32Array(verticesBuffer);
const normals = new Float32Array(normalsBuffer);

但是此时顶点和法向量都未定义。因此,变量 vertices 和 normals 都未定义,而 verticesBuffer 和 normalBuffer 是可以的。
转换时,我遇到以下错误。
const vertices = new Float32Array(verticesBuffer);

未捕获的范围错误:无效的类型化数组长度:39744

所以问题是如何从verticesBuffer:ArrayBuffer转换为vertices:Float32Array?

谢谢!


1
e.data.verticesBufferArraye.data.normalsBufferArray 如何被设置为某个值? - Pointy
1
@AlbertoValero 你确定吗?一个 new 表达式从来不会产生 undefined。我们需要一个 [mcve] 来重现这种行为。 - Bergi
好的,那听起来更真实了。请[编辑]您的问题以包括该错误消息 - 当然,在异常之后变量不会被赋值。 - Bergi
@Pointy ArrayBuffer是一个可转移对象。这就是为什么我在做所有这些的原因。 - Alberto Valero
1
@Pointy 忘掉转移吧。 转移已经完成了(已经检查过了)。 问题并不在转移上,而是在从ArrayBuffer转换为Float32Array时出现的问题。 错误出在这里:const vertices = new Float32Array(verticesBuffer); - Alberto Valero
显示剩余6条评论
1个回答

1
  const vertexCount = verticesBuffer.byteLength / 4;
  const normalCount = normalsBuffer.byteLength / 4;

  const vertices = Float32Array.from(verticesBuffer, 0, vertexCount);
  const normals = Float32Array.from(normalsBuffer, 0, normalCount);

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - nima
2
如果我理解文档正确的话,new Float32Array(buffer) 创建了一个现有数据的视图,而 Float32Array.from(...) 则实例化了一个新缓冲区。在建议的解决方案中似乎发生了不必要的复制。 - SiLiKhon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接