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); }
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 ); } }
/* 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); }
void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPointSize(10.0); project(); drawLeftTop(); drawLeftBottom(); drawRightBottom(); glPointSize(6.0); project3D(); drawRightTop(); glutSwapBuffers(); }
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; }