diff --git a/bin/back b/bin/back index 8858bcc..9fe8da6 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/move.o b/obj/move.o index a1ada0b..297dcfa 100644 Binary files a/obj/move.o and b/obj/move.o differ diff --git a/src/move.c b/src/move.c index 5779918..bbf1af1 100644 --- a/src/move.c +++ b/src/move.c @@ -93,26 +93,26 @@ pt_2d normal; double p1, p2, p3; void getSF(cube_0* cb, int sf) { if(sf == 0 || sf == 1) { - project_to_cube(cb->x + (sf==0)*cb->w, cb->y , cb->z , &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + (sf==0)*cb->w, cb->y + cb->h, cb->z , &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + (sf==0)*cb->w, cb->y , cb->z + cb->d, &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*cb->w, cb->y -(min_dist*0), cb->z -(min_dist*0), &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*cb->w, cb->y + cb->h +2*(min_dist*0), cb->z -(min_dist*0), &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + (sf==0)*cb->w, cb->y -(min_dist*0), cb->z + cb->d +2*(min_dist*0), &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } else if(sf == 2 || sf == 3) { - project_to_cube(cb->x , cb->y + (sf==2)*cb->h, cb->z , &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + cb->w, cb->y + (sf==2)*cb->h, cb->z , &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x , cb->y + (sf==2)*cb->h, cb->z + cb->d, &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x -(min_dist*0), cb->y + (sf==2)*cb->h, cb->z -(min_dist*0), &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + cb->w +2*(min_dist*0), cb->y + (sf==2)*cb->h, cb->z -(min_dist*0), &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x -(min_dist*0), cb->y + (sf==2)*cb->h, cb->z + cb->d +2*(min_dist*0), &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } else { - project_to_cube(cb->x , cb->y , cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x + cb->w, cb->y , cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; - project_to_cube(cb->x , cb->y + cb->h, cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); - surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x -(min_dist*0), cb->y -(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); + surface[0] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x + cb->w +2*(min_dist*0), cb->y -(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); + surface[1] = (pt_2d){.x = p1, .y = p2, .z = p3}; + project_to_cube(cb->x -(min_dist*0), cb->y + cb->h +2*(min_dist*0), cb->z + cb->d*(sf==4), &p1, &p2, &p3, cb); + surface[2] = (pt_2d){.x = p1, .y = p2, .z = p3}; } } @@ -131,6 +131,13 @@ void getNormal() { normal.z /= norm; } +void normalize(pt_2d* p) { + double norm = sqrt(p->x*p->x + p->y*p->y + p->z*p->z); + p->x /= norm; + p->y /= norm; + p->z /= norm; +} + void updateF(cube_0* cb, double dtime) { for(int d = 0; d < 6; d++) { getSF(cb, d); @@ -143,7 +150,13 @@ void updateF(cube_0* cb, double dtime) { } pt_2d vt = (pt_2d){.x = camx-camvx*dtime - surface[0].x, .y = camy-camvy*dtime - surface[0].y, .z = camz-camvz*dtime - surface[0].z}; pt_2d vtdt = (pt_2d){.x = camx - surface[0].x, .y = camy - surface[0].y, .z = camz - surface[0].z}; - if((dot3D(vt, normal) <= -min_dist && dot3D(vtdt, normal) > -min_dist) || (dot3D(vt, normal) >= min_dist && dot3D(vtdt, normal) < min_dist)) { + normalize(&vtdt); + normalize(&vt); + if( + (dot3D(vt, normal) <= 0.0 && dot3D(vtdt, normal) > 0.0) || + (dot3D(vt, normal) >= 0.0 && dot3D(vtdt, normal) < 0.0) + ) { + //printf("%d\n", d); double normv = sqrt(camvx*camvx + camvy*camvy + camvz*camvz); double alpha = acos(dot3D(normal, (pt_2d){.x = camvx, .y = camvy, .z = camvz})/normv); @@ -228,13 +241,13 @@ void movePlayerG(double dtime) { camx -= delx; camy -= dely; camz -= delz; - printf("%lf | %lf | %lf\n", fx, fy, fz); + //printf("%lf | %lf | %lf\n", fx, fy, fz); updateForces = false; camvx += fx*dtime; camvy += fy*dtime; camvz += fz*dtime; - printf("%lf | %lf | %lf\n\n", camvx, camvy, camvz); + //printf("%lf | %lf | %lf\n\n", camvx, camvy, camvz); camx += camvx*dtime; camy += camvy*dtime; camz += camvz*dtime;