Util.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { KeyCode, math, Quat, Vec3 } from "cc";
  2. export function clampLength(vec: Vec3, maxLength: number) {
  3. if (vec.lengthSqr() > maxLength * maxLength) {
  4. const clampVec = new Vec3();
  5. Vec3.normalize(clampVec, vec);
  6. clampVec.multiplyScalar(maxLength);
  7. return clampVec;
  8. }
  9. return vec;
  10. }
  11. export function vec3FromAngle(degree: number, length: number) {
  12. const radian = math.toRadian(degree);
  13. return new Vec3(length * Math.cos(radian), length * Math.sin(radian), 0);
  14. }
  15. export function calcPunchData(start: Vec3, direction: Vec3, duration: number, vibrato: number, elasticity: number) {
  16. math.clamp01(elasticity);
  17. let strength = direction.length();
  18. let toIterations = Math.round(vibrato * duration);
  19. if (toIterations < 2) {
  20. toIterations = 2;
  21. }
  22. const deltaStrength = strength / toIterations;
  23. let durations = [];
  24. let sum = 0;
  25. for (let i = 0; i < toIterations; i++) {
  26. const iterationPercent = (i + 1) / toIterations;
  27. const deltaDuration = duration * iterationPercent;
  28. sum += deltaDuration;
  29. durations[i] = deltaDuration;
  30. }
  31. const durationMultiplier = duration / sum;
  32. durations = durations.map((d) => d * durationMultiplier );
  33. // create to vec3 array
  34. const tos: Vec3[] = [];
  35. for(let i = 0; i < toIterations; i++) {
  36. if (i < toIterations - 1) {
  37. if (i === 0) {
  38. tos[i] = Vec3.add(new Vec3(), start, direction);
  39. } else if (i % 2 !== 0) {
  40. const deltaVec = clampLength(direction, strength * elasticity);
  41. deltaVec.negative();
  42. tos[i] = deltaVec.add(start);
  43. } else {
  44. const deltaVec = clampLength(direction, strength);
  45. tos[i] = deltaVec.add(start);
  46. }
  47. } else {
  48. tos[i] = start;
  49. }
  50. strength -= deltaStrength;
  51. }
  52. return {
  53. tos,
  54. durations
  55. }
  56. }
  57. export function calcShakeData(start: Vec3, duration: number, strength: Vec3, vibrato: number, randomness: number, ignoreZAxis: boolean, vectorBased: boolean,
  58. fadeOut: boolean) {
  59. KeyCode
  60. let shakeLength = vectorBased ? strength.length() : strength.x;
  61. let toIterations = Math.floor(vibrato * duration);
  62. if (toIterations < 2) {
  63. toIterations = 2;
  64. }
  65. const deltaShakeLen = shakeLength / toIterations;
  66. let durations = [];
  67. let sum = 0;
  68. for (let i = 0; i < toIterations; i++) {
  69. const iterationPercent = (i + 1) / toIterations;
  70. const deltaDuration = fadeOut ? duration * iterationPercent : duration / toIterations;
  71. sum += deltaDuration;
  72. durations[i] = deltaDuration;
  73. }
  74. const durationMultiplier = duration / sum;
  75. durations = durations.map((d) => d * durationMultiplier );
  76. let angle = math.randomRange(0, 360);
  77. const tos: Vec3[] =[];
  78. for (let i = 0; i < toIterations; i++) {
  79. if (i < toIterations - 1) {
  80. let randQuat = new Quat();
  81. if (i > 0) {
  82. angle = angle - 180 + math.randomRange(-randomness, randomness);
  83. }
  84. // switch(randomnessMode) {
  85. // case ShakeRandomnessMode.Harmonic:
  86. // if (i > 0) {
  87. // angle = angle - 180 + math.randomRange(0, randomness);
  88. // }
  89. // if (vectorBased || !ignoreZAxis) {
  90. // Quat.fromAxisAngle(randQuat, Vec3.UP, math.randomRange(0, randomness));
  91. // }
  92. // break;
  93. // default:
  94. // if (i > 0) {
  95. // angle = angle - 180 + math.randomRange(-randomness, randomness);
  96. // }
  97. // if (vectorBased || !ignoreZAxis) {
  98. // Quat.fromAxisAngle(randQuat, Vec3.UP, math.randomRange(-randomness, randomness));
  99. // }
  100. // break;
  101. // }
  102. if (vectorBased) {
  103. let to = vec3FromAngle(angle, shakeLength);
  104. Vec3.transformQuat(to, to, randQuat);
  105. to.x = clampLength(to, strength.x).x;
  106. to.y = clampLength(to, strength.y).y;
  107. to.z = clampLength(to, strength.z).z;
  108. to.normalize().multiplyScalar(shakeLength);
  109. tos[i] = to.add(start);
  110. if (fadeOut) {
  111. shakeLength -= deltaShakeLen;
  112. }
  113. strength = clampLength(strength, shakeLength);
  114. } else {
  115. if (ignoreZAxis) {
  116. tos[i] = vec3FromAngle(angle, shakeLength).add(start);
  117. } else {
  118. Quat.fromAxisAngle(randQuat, Vec3.UP, math.randomRange(-randomness, randomness));
  119. let to = vec3FromAngle(angle, shakeLength);
  120. Vec3.transformQuat(to, to, randQuat);
  121. tos[i] = to.add(start);
  122. }
  123. if (fadeOut) {
  124. shakeLength -= deltaShakeLen;
  125. }
  126. }
  127. } else {
  128. tos[i] = start;
  129. }
  130. }
  131. return {
  132. tos,
  133. durations
  134. }
  135. }