/** * This is a <b>VERY </b> brute force method of detecting if two TriMesh objects intersect. * * @param mesh1 The first TriMesh. * @param mesh2 The second TriMesh. * @return True if they intersect, false otherwise. */ public static boolean meshIntersection(TriMesh mesh1, TriMesh mesh2) { IntBuffer indexA = mesh1.getIndexBuffer(); IntBuffer indexB = mesh2.getIndexBuffer(); TransformMatrix aTransform = new TransformMatrix(); aTransform.setRotationQuaternion(mesh1.getWorldRotation()); aTransform.setTranslation(mesh1.getWorldTranslation()); aTransform.setScale(mesh1.getWorldScale()); TransformMatrix bTransform = new TransformMatrix(); bTransform.setRotationQuaternion(mesh2.getWorldRotation()); bTransform.setTranslation(mesh2.getWorldTranslation()); bTransform.setScale(mesh2.getWorldScale()); Vector3f[] vertA = BufferUtils.getVector3Array(mesh1.getVertexBuffer()); for (int i = 0; i < vertA.length; i++) aTransform.multPoint(vertA[i]); Vector3f[] vertB = BufferUtils.getVector3Array(mesh2.getVertexBuffer()); for (int i = 0; i < vertB.length; i++) bTransform.multPoint(vertB[i]); for (int i = 0; i < mesh1.getTriangleCount(); i++) { for (int j = 0; j < mesh2.getTriangleCount(); j++) { if (intersection( vertA[indexA.get(i * 3 + 0)], vertA[indexA.get(i * 3 + 1)], vertA[indexA.get(i * 3 + 2)], vertB[indexB.get(j * 3 + 0)], vertB[indexB.get(j * 3 + 1)], vertB[indexB.get(j * 3 + 2)])) return true; } } return false; }
public static void generate(TriMesh mesh) { FloatBuffer tangents = BufferUtils.createFloatBuffer(mesh.getVertexCount() * 3); FloatBuffer binormals = BufferUtils.createFloatBuffer(mesh.getVertexCount() * 3); IntBuffer indexBuffer = mesh.getIndexBuffer(); FloatBuffer vertexBuffer = mesh.getVertexBuffer(); FloatBuffer textureBuffer = mesh.getTextureCoords(0).coords; indexBuffer.rewind(); Vector3f tangent = new Vector3f(); Vector3f binormal = new Vector3f(); Vector3f normal = new Vector3f(); Vector3f verts[] = new Vector3f[3]; Vector2f texcoords[] = new Vector2f[3]; for (int i = 0; i < 3; i++) { verts[i] = new Vector3f(); texcoords[i] = new Vector2f(); } for (int t = 0; t < indexBuffer.capacity() / 3; t++) { int index[] = new int[3]; for (int v = 0; v < 3; v++) { index[v] = indexBuffer.get(); verts[v].x = vertexBuffer.get(index[v] * 3); verts[v].y = vertexBuffer.get(index[v] * 3 + 1); verts[v].z = vertexBuffer.get(index[v] * 3 + 2); texcoords[v].x = textureBuffer.get(index[v] * 2); texcoords[v].y = textureBuffer.get(index[v] * 2 + 1); } computeTriangleTangentSpace(tangent, binormal, normal, verts, texcoords); for (int v = 0; v < 3; v++) { tangents.position(index[v] * 3); tangents.put(tangent.x); tangents.put(tangent.y); tangents.put(tangent.z); binormals.position(index[v] * 3); binormals.put(binormal.x); binormals.put(binormal.y); binormals.put(binormal.z); } } mesh.setTangentBuffer(tangents); mesh.setBinormalBuffer(binormals); }