es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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).

Tags:  , ,

Answer

  1. Avatar for 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:

    1. Definir la línea: se necesita definir los dos puntos finales de la línea, digamos A y B.
    2. Recorrer todas las cajas en el tablero y comprobar si la línea se interseca con cada caja:
      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.
    3. Si la línea interseca una caja, resáltala.

    Aquí hay un código de muestra en JavaScript:

    // Definir los puntos finales de la línea
    var A = new THREE.Vector3 (0, 0, 0);
    var B = new THREE.Vector3 (10, 0, 0);
    
    // Recorrer todas las cajas
    for (var i = 0; i <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) {
    
          // 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 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) {

      // 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 información.>

Comments are closed.