void MakeNorm(void) { int i, j; float a[3],b[3],c[3]; for(i=0; i<size; i++) for(j=0; j<size; j++) { if (i!=size-1 && j!=size-1) { sub(a, a_points[i][j+1], a_points[i][j]); sub(b, a_points[i+1][j], a_points[i][j]); } else { sub(a, a_points[i][j-1], a_points[i][j]); sub(b, a_points[i-1][j], a_points[i][j]); } cross(c, a, b); normz(c); if (i==0 && j==size-1) { sub(a, a_points[i][j-1], a_points[i][j]); sub(b, a_points[i+1][j], a_points[i][j]); cross(c, a, b); normz(c); c[0]=-c[0]; c[1]=-c[1]; c[2]=-c[2]; } if (i==size-1 && j==0) { sub(a, a_points[i-1][j], a_points[i][j]); sub(b, a_points[i][j+1], a_points[i][j]); cross(c, a, b); normz(c); } copy(norm[i][j], c); } }
void calcul(int xx,int yy) { if ((xx==0)&&(yy==0)) MakeNorm(); sub(cameraray,camera,a_points[xx][yy]); normz(cameraray); rray[0]=norm[xx][yy][0]*coeff+cameraray[0]; rray[1]=norm[xx][yy][1]*coeff+cameraray[1]; rray[2]=norm[xx][yy][2]*coeff+cameraray[2]; scalDiv(rray,-1); normz(rray); GLfloat depth=gendep+a_points[xx][yy][2]; GLfloat t=depth/rray[2]; GLfloat mapx=a_points[xx][yy][0]+rray[0]*t; GLfloat mapz=a_points[xx][yy][1]+rray[1]*t; newcoord[xx][yy][0]=-(mapx-a_points[0][0][0])/25.6; newcoord[xx][yy][1]=(mapz-a_points[size][size][1])/25.6; }
float4 RotationQuaternionFromToVec(const float3 & fromVector, const float3 & toVector) { auto a = norm(fromVector), b = norm(toVector); return RotationQuaternionAxisAngle(normz(cross(a,b)), std::acos(dot(a,b))); }