我用混合器制作了一个Mesh,它有一个附加了命名的非空顶点组。为了正确导出所有内容,使用三个blender导出器,我选择导出»BufferGeometry«并在额外的顶点组字段中添加了一个»*«(见下面的截图)......
这非常有效,导入后会生成一个工作网格和几何体。 但有两件事我不明白:
FIRST:
let vertices = this[DISK]geometry.getAttribute('position');
vertices.count / 3; // 226 -- Blender (edit mode vertices) 282
vertices.itemSize // 3 -- one for x, y and z each, as expected
那么为什么导出模型中的顶点数量会减少呢?
第二
当像这样访问顶点组时:
let hole = this[DISK]geometry.getAttribute('hole');
hole.count/3; // 226 (same number of items as vertices) why not a third?
hole.itemSize; // 1 -- why?
let count = 0;
for (let i = 0; i < hole.count; i += hole.itemSize) {
let value = hole.array[i]; // either 1 or 0
if (value > 0) count++;
}
console.log(count); // 148 (148/3 = 49.333333) ??????
这是否意味着:如果value > 0
顶点:
(vertices.array[i], vertices.array[i+1], vertices.array[i+2])
是否包含在该组中?正值意味着什么?
提前致谢!
更新
在github上抓取导出器的源代码导致我Lines 247 - 265 of utils/exporters/blender/addons/io_three/exporter/api/mesh.py
.因此,例程迭代所有面的所有顶点,然后遍历此顶点的所有组。如果找到的组索引与要导出的组匹配,则组的顶点权重将附加到列表,否则为零。
更新#2
在使用更简单的几何体(平面)和更小的顶点组(一个项目)进行更多测试之后,更容易看到数据是如何创建的。获取顶点如下所示:
let vertices = geometry.getAttribute('position'),
group = geometry.getAttribute('groupname');
for (let i = 0, n = group.count; i < n; i++) {
if (group.array[i] > 0) {
let { x, y, z } = [vertices.getX(i),
vertices.getY(i),
vertices.getZ(i)];
}
}
比起初看起来容易得多。所以我对此有所了解并建议每个人都在摆弄这样的东西:不要从复杂的模型开始,使用最少量的顶点,甚至不要那些优化也不会打扰!