示例#1
0
bool SmoothMeshTriangle::intersects(const Rayd& ray, State& state) const {
  int ku = mod3[k + 1];
  int kv = mod3[k + 2];
  
  const Vector4d& O = ray.origin();
  const Vector3d& D = ray.direction();
  const Vector3d& A = m_mesh->vertices[m_index0].point;
  
  const double lnd = 1.0f / (D[k] + nu * D[ku] + nv * D[kv]);
  
  const double t = (nd - O[k] - nu * O[ku] - nv * O[kv]) * lnd;
  if (t < 0) {
    state.shadowMiss("SmoothMeshTriangle, behind ray");
    return false;
  }
  
  const double hu = O[ku] + t * D[ku] - A[ku];
  const double hv = O[kv] + t * D[kv] - A[kv];
  
  const double beta = hv * bnu + hu * bnv;
  if (beta < 0 || beta > 1) {
    state.shadowMiss("SmoothMeshTriangle, beta not in [0, 1]");
    return false;
  }
  
  const double gamma = hu * cnu + hv * cnv;
  if (gamma < 0 || (beta + gamma) > 1) {
    state.shadowMiss("SmoothMeshTriangle, gamma < 0 or beta + gamma > 1");
    return false;
  }
  
  state.shadowHit("SmoothMeshTriangle");
  return true;
}
示例#2
0
bool Sphere::intersects(const Rayd& ray, State& state) const {
  const Vector3d& o = ray.origin() - m_origin, d = ray.direction();
  
  double od = o * d, dd = d * d;
  double discriminant = od * od - dd * (o * o - m_radius * m_radius);
  
  if (discriminant < 0) {
    state.shadowMiss(this, "Sphere, ray miss");
    return false;
  } else if (discriminant > 0) {
    double discriminantRoot = sqrt(discriminant);
    double t1 = (-od - discriminantRoot) / dd;
    double t2 = (-od + discriminantRoot) / dd;
    if (t1 <= 0 && t2 <= 0) {
      state.shadowMiss(this, "Sphere, behind ray");
      return false;
    }
    
    state.shadowHit(this, "Sphere");
    return true;
  }
  
  state.shadowMiss(this, "Sphere, ray miss");
  return false;
}