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 68 69 70 71
| float4x4 getMatrixByAxisRot(float3 Axis, float angle)
{
double _11 = 0, _12 = 0, _13 = 0;
double _21 = 0, _22 = 0, _23 = 0;
double _31 = 0, _32 = 0, _33 = 0;
angle *= PI / 180;
float c = floor(cos(angle) * 100000000) / 100000000;
float s = floor(sin(angle) * 100000000) / 100000000;
float t = 1 - c;
float x = Axis.x;
float y = Axis.y;
float z = Axis.z;
_11 = t * x * x + c;
_12 = t * x * y - (z * s);
_13 = t * x * z + (y * s);
_21 = t * x * y + (z * s);
_22 = t * y * y + c;
_23 = t * y * z - (x * s);
_31 = t * x * z - (y * s);
_32 = t * y * z + (x * s);
_33 = t * z * z + c;
float4x4 m = float4x4 (_11, _12, _13, 0, _21, _22, _23, 0, _31, _32, _33, 0, 0, 0, 0, 1);
m = float4x4 (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
return m;
}
float3 getRotAlongAxis(float3 norm, float3 axis, float angle)
{
float4x4 rotMat = getMatrixByAxisRot(axis, angle);
return (mul(rotMat, float4(norm,0))).xyz;
}
float3 straightNormals(float3 p1, float3 p2, float3 p3, float3 p4)
{
float3 v1 = p2 - p1;
float3 v2 = p3 - p1;
float3 normal1 = cross(v1,v2);
float3 v3 = p3 - p4;
float3 v4 = p2 - p4;
float3 normal2 = cross(v3,v4);
return normalize(normalize(normal1) + normalize(normal2));
}
float3 CalculateBezierPoint(float3 pt1, float3 pt2, float3 N1, float3 N2, float amount)
{
amount /= 100.0f;
float3 func1 = cube(1-amount) * pt1; //first term
float3 func2 = 3 * care(1-amount) * amount * N1; //second term
float3 func3 = 3 * (1-amount) * care(amount) * N2; //third term
float3 func4 = cube(amount) * pt2; //fourth term
return func1 + func2 + func3 + func4;
}
float3 caluculateUVSpline(float3 pt1, float3 pt2, float3 pt3, float3 pt4, float3 N1, float3 N2, float3 N3, float3 N4, float U, float V)
{
float3 UA, UB, UNA, UNB, axis;
axis = straightNormals(pt1, pt2, pt3, pt4);
axis = float3(0,0,0);
UNA = lerp(getRotAlongAxis(N1, axis, 90), getRotAlongAxis(N2, axis, -90), U / 100);
UNB = lerp(getRotAlongAxis(N3, axis, -90), getRotAlongAxis(N4, axis, 90), U / 100);
UA = CalculateBezierPoint(pt1, pt2, getRotAlongAxis(N1, axis, -90) + pt1, getRotAlongAxis(N2, axis, 90) + pt2, U);
UB = CalculateBezierPoint(pt3, pt4, getRotAlongAxis(N3, axis, 90) + pt3, getRotAlongAxis(N4, axis, -90) + pt4, U);
return CalculateBezierPoint(UA, UB, UNA + UA, UNB + UB, V);
} |
Partager