Encontrar los objetos que intersecta una línea en three.js.
Actualmente, estoy trabajando en un proyecto de three.js donde debo seleccionar dos cajas de un tablero y dibujar una línea recta que las conecte, luego debo resaltar todas las cajas que la línea intersecta. Mi gran pregunta ahora es ¿cómo encontrar las cajas que la línea intersecta?
Cualquier ayuda sería apreciada (código, enlaces, sugerencias de material, fórmulas matemáticas).
davy.ai
Para encontrar en qué cajas se intersecta la línea, se puede usar el algoritmo de intersección línea-caja. Aquí están los pasos que se pueden seguir:
a. Definir la caja: se necesitan definir los ocho vértices de la caja.
b. Comprobar si la línea corta la caja englobante: se puede usar la técnica de la caja alineada con los ejes (AABB) para comprobar si la línea interseca la caja englobante. Si la línea no interseca la caja englobante, entonces no interseca la caja.
c. Comprobar si la línea interseca las caras de la caja: se puede usar el algoritmo de intersección de planos y cajas para comprobar si la línea interseca las caras de la caja.
Aquí hay un código de muestra en JavaScript:
nota: las clases
three.box3
,three.plane
,three.line3
ythree.vector3
son de la biblioteca three.js. se puede consultar la documentación de three.js para obtener más información. i=”” ++)=”” {=”” definir=”” los=”” vértices=”” de=”” la=”” caja=”” var=”” box=”boxes” [i];=”” var=”” vertices=”[” new=”” three.vector3=”” (box.min.x,=”” box.min.y,=”” box.min.z),=”” new=”” three.vector3=”” (box.max.x,=”” box.min.y,=”” box.min.z),=”” new=”” three.vector3=”” (box.max.x,=”” box.min.y,=”” box.max.z),=”” new=”” three.vector3=”” (box.min.x,=”” box.min.y,=”” box.max.z),=”” new=”” three.vector3=”” (box.min.x,=”” box.max.y,=”” box.min.z),=”” new=”” three.vector3=”” (box.max.x,=”” box.max.y,=”” box.min.z),=”” new=”” three.vector3=”” (box.max.x,=”” box.max.y,=”” box.max.z),=”” new=”” three.vector3=”” (box.min.x,=”” box.max.y,=”” box.max.z)=”” ];=”” comprobar=”” si=”” la=”” línea=”” interseca=”” la=”” caja=”” englobante=”” var=”” lineboxintersection=”new” three.box3().setfrompoints(vertices).intersectsline(a,=”” b);=”” if=”” (lineboxintersection)=”” {=”” comprobar=”” si=”” la=”” línea=”” interseca=”” una=”” cara=”” de=”” la=”” caja=”” var=”” intersects=”false;” for=”” (var=”” j=”0;” j=”” <=”” 6;=”” j=”” ++)=”” {=”” var=”” face=”new” three.plane().setfromcoplanarpoints(vertices[faceindices[j][0]],=”” vertices[faceindices[j][1]],=”” vertices[faceindices[j][2]]);=”” var=”” linefaceintersection=”new” three.line3(a,=”” b).intersectsplane(face);=”” if=”” (linefaceintersection)=”” {=”” intersects=”true;” break;=”” }=”” }=”” resalta=”” la=”” caja=”” si=”” la=”” línea=”” interseca=”” con=”” ella=”” if=”” (intersects)=”” {=”” resalta=”” la=”” caja=”” }=”” }=”” }=”” “`=”” nota:=”” las=”” clases=””three.box3
,=””three.plane
,=””three.line3
=”” y=””three.vector3
=”” son=”” de=”” la=”” biblioteca=”” three.js.=”” se=”” puede=”” consultar=”” la=”” documentación=”” de=”” three.js=”” para=”” obtener=”” más=””></boxes.length; i ++) {// definir los vértices de la caja
var box = boxes [i];
var vertices = [
new three.vector3 (box.min.x, box.min.y, box.min.z),
new three.vector3 (box.max.x, box.min.y, box.min.z),
new three.vector3 (box.max.x, box.min.y, box.max.z),
new three.vector3 (box.min.x, box.min.y, box.max.z),
new three.vector3 (box.min.x, box.max.y, box.min.z),
new three.vector3 (box.max.x, box.max.y, box.min.z),
new three.vector3 (box.max.x, box.max.y, box.max.z),
new three.vector3 (box.min.x, box.max.y, box.max.z)
];
// comprobar si la línea interseca la caja englobante
var lineboxintersection = new three.box3().setfrompoints(vertices).intersectsline(a, b);
if (lineboxintersection) {
}
}
“`
nota: las clases
three.box3
,three.plane
,three.line3
ythree.vector3
son de la biblioteca three.js. se puede consultar la documentación de three.js para obtener más información.>