Advertisement
YTMango

Vec.js from 偶弦

Feb 17th, 2024
634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 3.44 KB | Source Code | 0 0
  1. /**
  2.  * @typedef {Object} UnitVec
  3.  * @property {number} dx
  4.  * @property {number} dy
  5.  * @property {number} dz
  6.  */
  7.  
  8. /**
  9.  * 获取单位向量物件
  10.  * @param {number} dx
  11.  * @param {number} dy
  12.  * @param {number} dz
  13.  * @returns {UnitVec}
  14.  */
  15. function UnitVec(dx, dy, dz) {
  16.   return {
  17.     dx: dx,
  18.     dy: dy,
  19.     dz: dz,
  20.   };
  21. }
  22.  
  23. /**
  24.  * @typedef {Object} YawPitch
  25.  * @property {number} yaw
  26.  * @property {number} pitch
  27.  */
  28.  
  29. /**
  30.  * 获取偏航角和俯仰角物件
  31.  * @param {number} yaw
  32.  * @param {number} pitch
  33.  * @returns {YawPitch}
  34.  */
  35. function YawPitch(yaw, pitch) {
  36.   return {
  37.     yaw: yaw,
  38.     pitch: pitch,
  39.   };
  40. }
  41.  
  42. function Distance(x, y, z) {
  43.   return Math.sqrt(x * x + y * y + z * z);
  44. }
  45.  
  46. /**
  47.  * 获取玩家视线向量的单位向量
  48.  * @param {Internal.Entity_} entity
  49.  * @returns {UnitVec}
  50.  */
  51. function getUnitLookingVec(entity) {
  52.   let tx = -Math.sin((entity.yaw / 180) * Math.PI);
  53.   let ty = -Math.sin((entity.pitch / 180) * Math.PI);
  54.   let tz = Math.cos((entity.yaw / 180) * Math.PI);
  55.  
  56.   let distance = Distance(tx, ty, tz);
  57.  
  58.   return UnitVec(tx / distance, ty / distance, tz / distance);
  59. }
  60.  
  61. /**
  62.  * 通过向量获取偏航角和俯仰角
  63.  * @param {UnitVec} Vec
  64.  * @returns {YawPitch}
  65.  */
  66. function getVecYaw(Vec) {
  67.   let tyaw = (-Math.atan2(Vec.dx, Vec.dz) * 180) / Math.PI;
  68.   let tpitch = (Math.asin(-Vec.dy) * 180) / Math.PI;
  69.  
  70.   return YawPitch(tyaw, tpitch);
  71. }
  72.  
  73. /**
  74.  * 获取规定向量向左旋转一定角度的向量的单位向量
  75.  * @param {UnitVec} Vec
  76.  * @param {number} angle
  77.  * @returns {UnitVec}
  78.  */
  79. function getUnitLeftVec(Vec, angle) {
  80.   let angles = getVecYaw(Vec);
  81.   let leftVec = getLookUnitLeftVec(angles, angle);
  82.  
  83.   return UnitVec(leftVec.dx, leftVec.dy, leftVec.dz);
  84. }
  85.  
  86. /**
  87.  * 获取规定向量向右旋转一定角度的向量的单位向量
  88.  * @param {UnitVec} Vec
  89.  * @param {number} angle
  90.  * @returns {UnitVec}
  91.  */
  92. function getUnitRightVec(Vec, angle) {
  93.   let angles = getVecYaw(Vec);
  94.   let rightVec = getLookUnitRightVec(angles, angle);
  95.  
  96.   return UnitVec(rightVec.dx, rightVec.dy, rightVec.dz);
  97. }
  98.  
  99. /**
  100.  * 获取视线向量向左旋转一定角度的向量的单位向量
  101.  * @param {Internal.Entity_} entity
  102.  * @param {number} angle
  103.  * @returns {UnitVec}
  104.  */
  105. function getLookUnitLeftVec(entity, angle) {
  106.   let x = -Math.sin(((entity.yaw - angle) / 180) * Math.PI);
  107.   let y = -Math.sin((entity.pitch / 180) * Math.PI);
  108.   let z = Math.cos(((entity.yaw - angle) / 180) * Math.PI);
  109.  
  110.   let distance = Distance(x, y, z);
  111.  
  112.   return UnitVec(x / distance, y / distance, z / distance);
  113. }
  114.  
  115. /**
  116.  * 获取视线向量向右旋转一定角度的向量的单位向量
  117.  * @param {Internal.Entity_} entity
  118.  * @param {number} angle
  119.  * @returns {UnitVec}
  120.  */
  121. function getLookUnitRightVec(entity, angle) {
  122.   let x = -Math.sin(((entity.yaw + angle) / 180) * Math.PI);
  123.   let y = -Math.sin((entity.pitch / 180) * Math.PI);
  124.   let z = Math.cos(((entity.yaw + angle) / 180) * Math.PI);
  125.  
  126.   let distance = Distance(x, y, z);
  127.  
  128.   return UnitVec(x / distance, y / distance, z / distance);
  129. }
  130.  
  131. /**
  132.  * 获取两个实体之间的单位向量
  133.  * @param {Internal.Entity_} entity1
  134.  * @param {Internal.Entity_} entity2
  135.  * @returns {UnitVec}
  136.  */
  137. function getUnitVec(entity1, entity2) {
  138.   let x = entity1.x - entity2.x;
  139.   let y = entity1.y - entity2.y;
  140.   let z = entity1.z - entity2.z;
  141.  
  142.   let distance = Distance(x, y, z);
  143.  
  144.   return UnitVec(x / distance, y / distance, z / distance);
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement