struct mat3 {
float3 x;
float3 y;
float3 z;
};
float3 rotation(float3 mp, float3 pos) {
float s = 0.0f;
float c = 0.0f;
struct mat3 rotX;
s = sin(mp.x); c = cos(mp.x);
rotX.x = (float3)(1.0f, 0.0f, 0.0f);
rotX.y = (float3)(0.0f, c, -s);
rotX.z = (float3)(0.0f, s, c);
struct mat3 rotY;
s = sin(mp.y); c = cos(mp.y);
rotY.x = (float3)(c, 0.0f, s);
rotY.y = (float3)(0.0f, 1.0f, 0.0f);
rotY.z = (float3)(-s, 0.0f, c);
struct mat3 rotZ;
s = sin(mp.z); c = cos(mp.z);
rotZ.x = (float3)(c, -s, 0.0f);
rotZ.y = (float3)(s, c, 0.0f);
rotZ.z = (float3)(0.0f, 0.0f, 1.0f);
float3 m2x = (float3)(rotY.x.x, rotY.y.x, rotY.z.x);
float3 m2y = (float3)(rotY.x.y, rotY.y.y, rotY.z.y);
float3 m2z = (float3)(rotY.x.z, rotY.y.z, rotY.z.z);
struct mat3 m;
m.x.x = dot(m2x, rotX.x);
m.x.y = dot(m2y, rotX.x);
m.x.z = dot(m2z, rotX.x);
m.y.x = dot(m2x, rotX.y);
m.y.y = dot(m2y, rotX.y);
m.y.z = dot(m2z, rotX.y);
m.z.x = dot(m2x, rotX.z);
m.z.y = dot(m2y, rotX.z);
m.z.z = dot(m2z, rotX.z);
float3 m3x = (float3)(rotZ.x.x, rotZ.y.x, rotZ.z.x);
float3 m3y = (float3)(rotZ.x.y, rotZ.y.y, rotZ.z.y);
float3 m3z = (float3)(rotZ.x.z, rotZ.y.z, rotZ.z.z);
struct mat3 mm;
mm.x.x = dot(m3x, m.x);
mm.x.y = dot(m3y, m.x);
mm.x.z = dot(m3z, m.x);
mm.y.x = dot(m3x, m.y);
mm.y.y = dot(m3y, m.y);
mm.y.z = dot(m3z, m.y);
mm.z.x = dot(m3x, m.z);
mm.z.y = dot(m3y, m.z);
mm.z.z = dot(m3z, m.z);
float3 result = 0.0f;
result.x = dot(mm.x, pos.xyz);
result.y = dot(mm.y, pos.xyz);
result.z = dot(mm.z, pos.xyz);
return result;
}
float3 makeRotationMatrix(float3 input, float3 pos){
float3 a;
a.x = input.z;
a.y = input.y;
a.z = input.x;
float3 result = 0.0f;
struct mat3 m;
m.x = (float3)(cos(a.x) * cos(a.z) - sin(a.x) * cos(a.y) * sin(a.z),
-cos(a.x) * sin(a.z) - sin(a.x) * cos(a.y) * cos(a.z),
sin(a.x) * sin(a.y));
m.y = (float3)(sin(a.x) * cos(a.z) + cos(a.x) * cos(a.y) * sin(a.z),
-sin(a.x) * sin(a.z) + cos(a.x) * cos(a.y) * cos(a.z),
-cos(a.x) * sin(a.y));
m.z = (float3)(sin(a.y) * sin(a.z),
sin(a.y) * cos(a.z),
cos(a.y));
result.x = dot(m.x, pos.xyz);
result.y = dot(m.y, pos.xyz);
result.z = dot(m.z, pos.xyz);
return result;
}
float3 rotationMatrix(float3 axis, float angle, float3 pos) {
float3 a = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0f - c;
float sx = s * a.x;
float sy = s * a.y;
float sz = s * a.z;
float ocx = oc * a.x;
float ocy = oc * a.y;
float ocz = oc * a.z;
float ocxx = ocx * a.x;
float ocxy = ocx * a.y;
float ocxz = ocx * a.z;
float ocyy = ocy * a.y;
float ocyz = ocy * a.z;
float oczz = ocz * a.z;
struct mat3 mm;
mm.x = (float3)(ocxx + c, ocxy - sz, ocxz + sy);
mm.y = (float3)(ocxy + sz, ocyy + c, ocyz - sx);
mm.z = (float3)(ocxz - sy, ocyz + sx, oczz + c);
float3 result = 0.0f;
result.x = dot(mm.x, pos.xyz);
result.y = dot(mm.y, pos.xyz);
result.z = dot(mm.z, pos.xyz);
return result;
}
繞固定 xyz 軸旋轉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.