예제 #1
0
  /**
   * Intersect the given Ray with this shape. Tests for every triangle of the shape. Speed depends
   * hence on the complexity of the shape.
   *
   * @param Ray ray The Ray to be intersected
   * @param Matrix4f transformation The transformation of the Shape into its actual position
   * @return a RayShapeIntersection with the coordinates of the HitPoint if any.
   */
  public RayShapeIntersection intersect(Ray ray, Matrix4f transformation) {
    RayShapeIntersection intersection = new RayShapeIntersection();
    List<RayShapeIntersection> hitTriangles = new ArrayList<RayShapeIntersection>();

    // get all triangles
    Iterator<Triangle> it = getTriangles().iterator();
    Triangle triangle;
    // calculate intersection of ray and triangle
    while (it.hasNext()) {
      triangle = it.next();
      triangle.transform(transformation);
      intersection = calculateIntersection(ray, triangle);
      if (intersection.hit) {
        hitTriangles.add(intersection);
      }
    }

    Vector3f distance = new Vector3f();
    float shortestDist = Float.MAX_VALUE;
    for (RayShapeIntersection in : hitTriangles) {
      distance.sub(ray.getOrigin(), in.hitPoint);
      if (distance.length() < shortestDist) {
        intersection = in;
        shortestDist = distance.length();
      }
    }

    // return the intersected point if any
    return intersection;
  }
예제 #2
0
  private List<Triangle> getTriangles() {
    List<Triangle> triangles = new ArrayList<Triangle>();

    IntBuffer verticesBuffer = mVertexBuffers.getVertexBuffer();
    int[] verticesInt = new int[verticesBuffer.capacity()];

    for (int i = 0; i < verticesBuffer.capacity(); i++) {
      verticesInt[i] = verticesBuffer.get(i);
    }

    // Fixed Point Conversion
    float[] vertices = new float[verticesInt.length];
    for (int i = 0; i < verticesInt.length; i++) {
      vertices[i] = (float) verticesInt[i] / 65536;
    }

    ShortBuffer indicesBuffer = mVertexBuffers.getIndexBuffer();
    short[] indices = new short[indicesBuffer.capacity()];
    for (int i = 0; i < indicesBuffer.capacity(); i++) {
      indices[i] = indicesBuffer.get(i);
    }

    Triangle triangle;
    Point3f vec;
    for (int i = 0; i < indices.length; i++) {
      triangle = new Triangle();
      vec = new Point3f();
      vec.x = vertices[indices[i] * 3];
      vec.y = vertices[indices[i] * 3 + 1];
      vec.z = vertices[indices[i] * 3 + 2];
      triangle.mX = vec;
      i++;
      vec = new Point3f();
      vec.x = vertices[indices[i] * 3];
      vec.y = vertices[indices[i] * 3 + 1];
      vec.z = vertices[indices[i] * 3 + 2];
      triangle.mY = vec;
      i++;
      vec = new Point3f();
      vec.x = vertices[indices[i] * 3];
      vec.y = vertices[indices[i] * 3 + 1];
      vec.z = vertices[indices[i] * 3 + 2];
      triangle.mZ = vec;

      triangles.add(triangle);
    }

    return triangles;
  }