1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
struct PathPoint {
Vector3 position;
Vector3 lookat;
};
Vector3 PointOnCurve(Vector3 &p1, Vector3 &p2, Vector3 &p3, Vector3 &p4, float t)
{
float var1, var2, var3;
Vector3 vPoint;
var1 = 1 - t;
var2 = var1 * var1 * var1;
var3 = t * t * t;
vPoint.x = var2*p1.x + 3*t*var1*var1*p2.x + 3*t*t*var1*p3.x + var3*p4.x;
vPoint.y = var2*p1.y + 3*t*var1*var1*p2.y + 3*t*t*var1*p3.y + var3*p4.y;
vPoint.z = var2*p1.z + 3*t*var1*var1*p2.z + 3*t*t*var1*p3.z + var3*p4.z;
return(vPoint);
}
Vector3 PointOnCurvePath(vector <PathPoint> &pnt,float t ,int pos ) {
if (pnt.size() == 0 ) return ( Vector3(0,0,0) );
float nt,rt;
int ipt0,ipt1,ipt2,ipt3,index;
nt = t * (float)(pnt.size() - 1 );
nt /= 3.0f ;
index = 0;
rt = nt-floor(nt);
while (floor(nt)>0) {
nt--;
index+=3;
}
ipt0 = index;
ipt1 = index + 1;
ipt2 = index + 2;
ipt3 = index + 3;
if (ipt1 >= pnt.size() ) ipt1 = ipt1 - pnt.size();
if (ipt2 >= pnt.size() ) ipt2 = ipt2 - pnt.size();
if (ipt3 >= pnt.size() ) ipt3 = ipt3 - pnt.size();
if (pos == VGL_POSITION) {
return PointOnCurve(pnt[ipt0].position,pnt[ipt1].position,pnt[ipt2].position,pnt[ipt3].position,rt);
}
else {
return PointOnCurve(pnt[ipt0].lookat,pnt[ipt1].lookat,pnt[ipt2].lookat,pnt[ipt3].lookat,rt);
}
} |
Partager