gpt4 book ai didi

javascript - STL 加载和不正确的世界矩阵访问

转载 作者:行者123 更新时间:2023-11-30 19:11:32 25 4
gpt4 key购买 nike

对于一个 three.js 项目,我在从 STL 加载顶点并将它们充分转换为世界坐标时遇到了一些问题。似乎矩阵没有正确应用,我认为这可能与加载机制本身有关。

loader.load( './assets/models/trajan_print.stl', function ( geometry ) {
var mesh = new THREE.Mesh( geometry, material );
mesh.name = "target";
mesh.position.set( 0, - 300, - 400 );
mesh.rotation.set( - Math.PI / 2, 0, Math.PI );
mesh.scale.set( 5, 5, 5 );
//mesh.castShadow = true;
//mesh.receiveShadow = true;
mesh.visible = false;
SCENE.add( mesh );
model.setTargets(mesh);
} );

要注意的重要功能是最后一个。 model.setTargets(mesh)。我对世界坐标中对象的顶点感兴趣,这就是该函数的作用...有点:

    setTargets(mesh){
this.matrixWorld = mesh.matrixWorld; //THIS WORKS, PRINTING IT REVEALS VALUES TRANSLATION/SCALE/ROTATION THAT MATCH THE MODEL'S
var buffer = mesh.geometry.attributes.position.array;
for(var i = 0; i < buffer.length /3; i = i + 3){
var point = new THREE.Vector3(buffer[i], buffer[i+1],buffer[i+2]);
point.applyMatrix4(this.matrixWorld);//DOES NOT WORK
this.unassignedVertices.push(point);
}
}

现在,如果我在此函数之外执行完全相同的操作,它将按预期工作。这个只有在 this.unassignedVertices 时才会被调用,所以这是我解决需要等待异步加载发生这一事实的方法。

    insertParticle(part) {
var point = this.unassignedVertices.pop();
point.applyMatrix4(this.matrixWorld); //THIS WORKS BUT HERE BUT WHY?
part.setTargetPoint(point);
this.octree.add(part);
this.particles.add(part);
}

第二个问题,与 setTargets(mesh) 相关 我似乎只从 mesh.geometry.attributes.position.array 加载大约一半的顶点.现在这实际上可能是由代码中的其他部分引起的,我认为这超出了 SO 问题的范围,所以我的问题是该函数是否有任何问题可以对此负责?我是不是加载不当,是不是转换错了,是不是漏点了?

至于进一步的上下文:如果我删除 visible = false 标签,模型加载和显示会很好。

最佳答案

好的,如果有人遇到这个问题。该数组将具有重复的位置,因为并非所有位置都指向顶点(可能)。 if(position.x == ... 的简单情况将其清理到预期的程度。

关于javascript - STL 加载和不正确的世界矩阵访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com