示例#1
0
void Fluid::update() {
    //fprintf(stderr, "\n--- Diffuse 1 ---\n");
    /*diffuse ( 1, vx0, vx, viscosity );
    //fprintf(stderr, "\n--- Diffuse 2 ---\n");
    diffuse ( 2, vy0, vy, viscosity );

    //fprintf(stderr, "\n--- Project 1 ---\n");
    project ( vx0, vy0, vx, vy );

    //fprintf(stderr, "\n--- Advect 1 ---\n");
    advect ( 1, vx, vx0, vx0, vy0 );
    //fprintf(stderr, "\n--- Advect 2 ---\n");
    advect ( 2, vy, vy0, vx0, vy0 );

    //fprintf(stderr, "\n--- Project 2 ---\n");
    project ( vx, vy, vx0, vy0 );

    //fprintf(stderr, "\n--- Diffuse 1 ---\n");
    diffuse ( 0, s, dens, diffusion );
    advect ( 0, dens, s, vx, vy );*/

    std::thread d1(&Fluid::diffuse, this, 1, vx0, vx, viscosity);
    std::thread d2(&Fluid::diffuse, this, 2, vy0, vy, viscosity);
    std::thread d3(&Fluid::diffuse, this, 3, vz0, vz, viscosity);
    //diffuse(1, vx0, vx, viscosity);
    //diffuse(2, vy0, vy, viscosity);
    //diffuse(3, vz0, vz, viscosity);
    d1.join();
    d2.join();
    d3.join();

    project3D (vx0, vy0, vz0, vx, vy);

    std::thread a1(&Fluid::advect3D, this, 1, vx, vx0, vx0, vy0, vz0);
    std::thread a2(&Fluid::advect3D, this, 2, vy, vy0, vx0, vy0, vz0);
    std::thread a3(&Fluid::advect3D, this, 3, vz, vz0, vx0, vy0, vz0);
    a1.join();
    a2.join();
    a3.join();
    /*advect3D(1, vx, vx0, vx0, vy0, vz0);
    advect3D(2, vy, vy0, vx0, vy0, vz0);
    advect3D(3, vz, vz0, vx0, vy0, vz0);*/

    project3D(vx, vy, vz, vx0, vy0);

    diffuse(0, s, dens, diffusion);
    advect3D(0, dens, s, vx, vy, vz);
}
示例#2
0
void CCCameraBase::project3DZ(CCVector3 *result, float x, float y, float offset)
{
    if( project3D( x, y ) )
    {
        // Cast the ray from our near plane
        if( offset == -1.0f )
        {
            offset = projectionResults.vNear.z / fabsf( projectionResults.vDirection.z );
        }
		
        *result = CCVector3MulResult( projectionResults.vDirection, offset );
        result->add( projectionResults.vNear );
    }
}
示例#3
0
/*
    finding the closest point on a triangle
*/
double distanceToTriangle(ClosestPointInfo *inf, const Point3D &pTest, const Point3D P[3]){
  //  normal to plane
  Vector3D v1, v2, vC;
  v1.difference(P[1], P[0]);
  v2.difference(P[2], P[0]);
  vC.cross(v1, v2);

  //  transforms to get into 2D
  double minD = REAL_MAX;

  //  test against triangle
  float t;
  if (intersectTriangle(pTest, vC, &t, P[2], P[1], P[0])){
    inf->type = FACE;
    vC.add(&inf->pClose, pTest, t);
    minD = inf->pClose.distanceSQR(pTest);
    }
  else{
    //  project p1 onto each edge
    for (int i = 0; i < 3; i++){
      Point3D pt;
      if (project3D(&pt, pTest, P[i], P[(i+1)%3])){
        double d = pt.distanceSQR(pTest);
        if (d < minD){
          minD = d;
          inf->num = i;
          inf->type = EDGE;
          inf->pClose = pt;
          }
        }
      }

    //  test against each vertex
    for (int i = 0; i < 3; i++){
      double d = P[i].distanceSQR(pTest);
      if (d < minD){
        inf->num = i;
        inf->type = VERTEX;
        inf->pClose = P[i];
        minD = d;
        }
      }
    }

  return sqrt(minD);
}
示例#4
0
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    
    glPointSize(10.0);
    project();
    drawLeftTop();
    drawLeftBottom();
    drawRightBottom();
    
    
    glPointSize(6.0);
    project3D();
    drawRightTop();
    
    
    glutSwapBuffers();
}
示例#5
0
double distanceToTriangleSPECIAL(ClosestPointInfo *inf, double minDS, const Point3D &pTest, const Vector3D &nTri, const Point3D P[3], const int pI[3]){
  //  transforms to get into 2D
  double minD = minDS;

  //  test against triangle
  float t;
  if (intersectTriangle(pTest, nTri, &t, P[2], P[1], P[0])){
    float d = t*t;               //  distance squared
    if (d < minD){
      inf->type = FACE;
      nTri.add(&inf->pClose, pTest, t);
      minD = d;
      }
    }
  else{
    //  project p1 onto each edge
    for (int i = 0; i < 3; i++){
      int i1 = (i+1)%3;

      if (pI[i] < pI[i1]){            //    only need to consider each point once
        Point3D pt;
        if (project3D(&pt, pTest, P[i], P[i1])){
          double d = pt.distanceSQR(pTest);
          if (d < minD){
            minD = d;
            inf->num = i;
            inf->type = EDGE;
            inf->pClose = pt;
            }
          }
        }
      }

    //  vertices are checked outside
    }

  return minD;
}