Triangle triangle = new Triangle(); for (int i = 0; i < positions.length; i += 9) { triangle.set(0, positions[i], positions[i + 1], positions[i + 2]); triangle.set(1, positions[i + 3], positions[i + 4], positions[i + 5]); triangle.set(2, positions[i + 6], positions[i + 7], positions[i + 8]); float sgn1 = Math.signum(triangle.get1().x - cx); float sgn2 = Math.signum(triangle.get2().x - cx); float sgn3 = Math.signum(triangle.get3().x - cx); float xSideFactor = sgn1 + sgn2 + sgn3; float ySideFactor = Math.signum(triangle.get1().z - cz) + Math.signum(triangle.get2().z - cz) + Math.signum(triangle.get3().z - cz); if ((xSideFactor > -3 || xSideFactor < 3) && ySideFactor < 0) {// the triangle is on the splitting plane if (sgn1 == 1.0f) {
Triangle triangle = new Triangle(); Vector3f x = new Vector3f(1, 0, 0); Vector3f y = new Vector3f(0, 1, 0); float borderAngle = (float) Math.sqrt(2.0f) / 2.0f; for (int i = 0, pointIndex = 0; i < positions.length; i += 9) { triangle.set(0, positions[i], positions[i + 1], positions[i + 2]); triangle.set(1, positions[i + 3], positions[i + 4], positions[i + 5]); triangle.set(2, positions[i + 6], positions[i + 7], positions[i + 8]); Vector3f n = triangle.getNormal(); float dotNX = Math.abs(n.dot(x)); float dorNY = Math.abs(n.dot(y)); if (dotNX > borderAngle) { if (dotNZ < borderAngle) {// discard X-coordinate uvCoordinates[pointIndex++] = (triangle.get1().y - min.y) / ext[1]; uvCoordinates[pointIndex++] = (triangle.get1().z - min.z) / ext[2]; uvCoordinates[pointIndex++] = (triangle.get2().y - min.y) / ext[1]; uvCoordinates[pointIndex++] = (triangle.get2().z - min.z) / ext[2]; uvCoordinates[pointIndex++] = (triangle.get3().y - min.y) / ext[1]; uvCoordinates[pointIndex++] = (triangle.get3().z - min.z) / ext[2]; } else {// discard Z-coordinate uvCoordinates[pointIndex++] = (triangle.get1().x - min.x) / ext[0]; uvCoordinates[pointIndex++] = (triangle.get1().y - min.y) / ext[1]; uvCoordinates[pointIndex++] = (triangle.get2().x - min.x) / ext[0]; uvCoordinates[pointIndex++] = (triangle.get2().y - min.y) / ext[1]; uvCoordinates[pointIndex++] = (triangle.get3().x - min.x) / ext[0]; uvCoordinates[pointIndex++] = (triangle.get3().y - min.y) / ext[1];
public Triangle getTriangle(Triangle store){ if (store == null) store = new Triangle(); Mesh m = geometry.getMesh(); m.getTriangle(triangleIndex, store); store.calculateCenter(); store.calculateNormal(); return store; }
/** * Gets the triangle vertex positions at the given triangle index * and stores them into the {@link Triangle} argument. * Also sets the triangle index to the <code>index</code> argument. * * @param index The index of the triangle. * Should be between 0 and {@link #getTriangleCount()}. * * @param tri The triangle to store the positions in */ public void getTriangle(int index, Triangle tri){ getTriangle(index, tri.get1(), tri.get2(), tri.get3()); tri.setIndex(index); tri.setNormal(null); }
protected boolean checkTriangles(float gridX, float gridY, Ray pick, Vector3f intersection, TerrainPatch patch, Triangle store) { if (!getTriangles(gridX, gridY, patch)) return false; if (pick.intersectWhere(gridTriA, intersection)) { store.set(gridTriA.get1(), gridTriA.get2(), gridTriA.get3()); return true; } else { if (pick.intersectWhere(gridTriB, intersection)) { store.set(gridTriB.get1(), gridTriB.get2(), gridTriB.get3()); return true; } } return false; }
/** * Get the triangle that the point is on. * * @param x coordinate in local space to the geomap * @param z coordinate in local space to the geomap * @return triangle in local space to the geomap */ protected Triangle getTriangleAtPoint(float x, float z) { Triangle[] triangles = getGridTrianglesAtPoint(x, z); if (triangles == null) { //System.out.println("x,z: " + x + "," + z); return null; } Vector2f point = new Vector2f(x, z); Vector2f t1 = new Vector2f(triangles[0].get1().x, triangles[0].get1().z); Vector2f t2 = new Vector2f(triangles[0].get2().x, triangles[0].get2().z); Vector2f t3 = new Vector2f(triangles[0].get3().x, triangles[0].get3().z); if (0 != FastMath.pointInsideTriangle(t1, t2, t3, point)) { return triangles[0]; } t1.set(triangles[1].get1().x, triangles[1].get1().z); t1.set(triangles[1].get2().x, triangles[1].get2().z); t1.set(triangles[1].get3().x, triangles[1].get3().z); if (0 != FastMath.pointInsideTriangle(t1, t2, t3, point)) { return triangles[1]; } return null; }
for (Triangle t : triangles) Vector3f t1 = t.get1(); Vector3f t2 = t.get2(); Vector3f t3 = t.get3(); addTriangle(new Triangle(t1.add(0, height, 0), t2.add(0, height, 0), t3.add(0, height, 0)), Vector3f.UNIT_Y, index, vertexArray, normalArray, uvArray, indexArray); index += 3; addTriangle(new Triangle(t3, t2, t1), neg, index, vertexArray, normalArray, uvArray, indexArray); index += 3; Vector3f vEnd1 = vEnd.add(0, height, 0); Triangle t = new Triangle(vStart1, vStart, vEnd1); t.calculateNormal(); addTriangle(t, t.getNormal(), index, vertexArray, normalArray, uvArray, indexArray); index += 3; t = new Triangle(vStart, vEnd, vEnd1); t.calculateNormal(); addTriangle(t, t.getNormal(), index, vertexArray, normalArray, uvArray, indexArray); index += 3;
Triangle hit = new Triangle(); checkTriangles(loc.x, loc.y, workRay, intersection, patch, hit); float distance = worldPickRay.origin.distance(intersection); CollisionResult cr = new CollisionResult(intersection, distance); cr.setGeometry(patch); cr.setContactNormal(hit.getNormal()); results.addCollision(cr); return intersection; Triangle hit = new Triangle(); if (checkTriangles(loc.x, loc.y, workRay, intersection, patch, hit)) { cr.setGeometry(patch); results.addCollision(cr); cr.setContactNormal(hit.getNormal()); return intersection; results.addCollision(cr); cr.setGeometry(patch); cr.setContactNormal(hit.getNormal()); return intersection;
private Triangle makeTriangle() { Triangle triangle = new Triangle(v0, v1, v2); /* * Check center and normal before modification. */ Vector3f center = triangle.getCenter(); Vector3f normal = triangle.getNormal(); assert center.equals(new Vector3f(1f, 1f, 0f)); assert normal.equals(new Vector3f(0f, 0f, 1f)); return triangle; }
Triangle t = new Triangle(new Vector3f(), new Vector3f(), new Vector3f()); Triangle t2 = new Triangle(new Vector3f(), new Vector3f(), new Vector3f()); t.get(0).x = (gridX); t.get(0).y = (h1); t.get(0).z = (gridY); t.get(1).x = (gridX); t.get(1).y = (h3); t.get(1).z = (gridY + 1); t.get(2).x = (gridX + 1); t.get(2).y = (h4); t.get(2).z = (gridY + 1); t2.get(0).x = (gridX); t2.get(0).y = (h1); t2.get(0).z = (gridY); t2.get(1).x = (gridX + 1); t2.get(1).y = (h4); t2.get(1).z = (gridY + 1); t2.get(2).x = (gridX + 1); t2.get(2).y = (h2); t2.get(2).z = (gridY); } else { t.get(0).x = (gridX);
/** * <code>intersectWhere</code> determines if the Ray intersects a triangle. It then * stores the point of intersection in the given loc vector * @param t the Triangle to test against. * @param loc * storage vector to save the collision point in (if the ray * collides) * @return true if the ray collides. */ public boolean intersectWhere(Triangle t, Vector3f loc) { return intersectWhere(t.get(0), t.get(1), t.get(2), loc); }
triangles.add(new Triangle(toVector3f(cords[0]), toVector3f(cords[1]), toVector3f(cords[2]))); triangles.add(new Triangle(toVector3f(cords[2]), toVector3f(cords[3]), toVector3f(cords[0]))); if (!cords[4].equals2D(cords[0])) triangles.add(new Triangle(toVector3f(cords[3]), toVector3f(cords[4]), toVector3f(cords[0]))); triangles.add(new Triangle(toVector3f(cords[2]), toVector3f(cords[3]), toVector3f(cords[4]))); triangles.add(new Triangle(toVector3f(cords[4]), toVector3f(cords[5]), toVector3f(cords[2]))); if (!cords[5].equals2D(cords[0])) triangles.add(new Triangle(toVector3f(cords[5]), toVector3f(cords[0]), toVector3f(cords[2])));
private FloatBuffer generateNormals(FloatBuffer positions, Mesh mesh) { FloatBuffer normals = BufferUtils.createFloatBuffer(positions.capacity()); for (int i = 0; i < positions.capacity(); i += 3) { float x = positions.get(i); float y = positions.get(i + 1); float z = positions.get(i + 2); Vector3f n = new Vector3f(); List<Triangle> triangles = getTrianglesSharingIndex(i / 3, mesh); for (Triangle t : triangles) { t.calculateNormal(); n.addLocal(t.getNormal()); } n.normalizeLocal(); normals.put(n.x).put(n.y).put(n.z); // normals.put(0).put(0).put(0); } normals.flip(); return normals; }
/** * obtains the unit length normal vector of this triangle, if set or * calculated * * @return the normal vector */ public Vector3f getNormal() { if (normal == null) { calculateNormal(); } return normal; }
@Test public void testIssue957() { Vector3f v3 = new Vector3f(0f, 0f, 3f); Triangle t1 = makeTriangle(); t1.set(2, v3); checkTriangle(t1); Triangle t2 = makeTriangle(); t2.set(v3, v0, v1); checkTriangle(t2); Triangle t3 = makeTriangle(); t3.set(2, v3.x, v3.y, v3.z); checkTriangle(t3); Triangle t4 = makeTriangle(); t4.set3(v3); checkTriangle(t4); }
@Override public int collideWith(Collidable other) { if (other instanceof Ray) { Ray ray = (Ray) other; return collideWithRay(ray); } else if (other instanceof Triangle) { Triangle t = (Triangle) other; if (intersects(t.get1(), t.get2(), t.get3())) { return 1; } return 0; } else if (other instanceof BoundingVolume) { return intersects((BoundingVolume) other) ? 1 : 0; } else { throw new UnsupportedCollisionException("With: " + other.getClass().getSimpleName()); } }
for (Triangle t : triangles) Vector3f t1 = t.get1(); Vector3f t2 = t.get2(); Vector3f t3 = t.get3(); addTriangle(new Triangle(t1.add(0, height, 0), t2.add(0, height, 0), t3.add(0, height, 0)), Vector3f.UNIT_Y, index, vertexArray, normalArray, uvArray, indexArray); index += 3; addTriangle(new Triangle(t3, t2, t1), neg, index, vertexArray, normalArray, uvArray, indexArray); index += 3; Vector3f vEnd1 = vEnd.add(0, height, 0); Triangle t = new Triangle(vStart1, vStart, vEnd1); t.calculateNormal(); addTriangle(t, t.getNormal(), index, vertexArray, normalArray, uvArray, indexArray); index += 3; t = new Triangle(vStart, vEnd, vEnd1); t.calculateNormal(); addTriangle(t, t.getNormal(), index, vertexArray, normalArray, uvArray, indexArray); index += 3;
/** * Gets the triangle vertex positions at the given triangle index * and stores them into the {@link Triangle} argument. * Also sets the triangle index to the <code>index</code> argument. * * @param index The index of the triangle. * Should be between 0 and {@link #getTriangleCount()}. * * @param tri The triangle to store the positions in */ public void getTriangle(int index, Triangle tri){ getTriangle(index, tri.get1(), tri.get2(), tri.get3()); tri.setIndex(index); tri.setNormal(null); }