Я использую Three.js. Нашел действительно хорошую библиотеку Decal, написанную Benpurdy. Он очень легко модифицируется, а также использует описанные методы. hereПересечение геометрии, переходящее от прямой геометрии к буферной геометрии
Однако технология использует геометрию. Проект, в котором я работаю, использует BufferGeometry. Я проследил код, который пересекает геометрию, и не может определить преобразование из граней и вершин в атрибуты.
this.createGeometry = function(matrix, mesh) {
var geom = mesh.geometry;
var decalGeometry = new THREE.Geometry();
var projectorInverse = matrix.clone().getInverse(matrix);
var meshInverse = mesh.matrixWorld.clone().getInverse(mesh.matrixWorld);
var faces = [];
for(var i = 0; i < geom.faces.length; i++){
var verts = [geom.faces[i].a, geom.faces[i].b, geom.faces[i].c];
var pts = [];
var valid = false;
for(var v = 0; v < 3; v++) {
var vec = geom.vertices[verts[v]].clone();
vec.applyMatrix4(mesh.matrixWorld);
vec.applyMatrix4(matrix);
if((vec.z > 1) || (vec.z < -1) || (vec.x > 1) || (vec.x < -1) || (vec.y > 1) || (vec.y < -1)) {
} else {
valid = true;
}
pts.push(vec);
}
if(valid) {
var uv = [];
for(var n = 0; n < 3; n++){
uv.push(new THREE.Vector2((pts[n].x + 1)/2, (pts[n].y + 1)/2));
pts[n].applyMatrix4(projectorInverse);
pts[n].applyMatrix4(meshInverse);
decalGeometry.vertices.push(pts[n]);
}
// update UV's
decalGeometry.faceVertexUvs[0].push(uv);
var newFace = geom.faces[i].clone();
newFace.a = decalGeometry.vertices.length - 3;
newFace.b = decalGeometry.vertices.length - 2;
newFace.c = decalGeometry.vertices.length - 1;
decalGeometry.faces.push(newFace);
}
}
return decalGeometry;
}
Цените, если кто-нибудь может пролить свет на то, как это сделать? Благодарю.
Спасибо, я пробовал. В то время как он работает, функция «деколь», которую я использую, быстро становится дорогой и медленной на моделях с умеренной значимостью. Но спасибо за это. –
Я обновил ответ. – prisoner849
Спасибо за обновление. Да, они преобразуются между геометрией и буферометрией. Я попробовал их и, как уже упоминалось, вызывает всплеск памяти от 200 до 900 мб. У меня есть решение, которое я кодировал, обратился к проблеме в ее корне, имея дело с пересечением сетки и создавая сетку, способную обрабатывать буферную метрику. –