xushiting 3 年之前
父節點
當前提交
e88f1645bf
共有 2 個文件被更改,包括 479 次插入0 次删除
  1. 162 0
      src/back/move.service.ts
  2. 317 0
      src/back/rotate.service.ts

+ 162 - 0
src/back/move.service.ts

@@ -0,0 +1,162 @@
+import { Injectable } from '@nestjs/common';
+import { CacheService } from 'src/cache/cache.service';
+
+@Injectable()
+export class MoveService {
+  constructor(private cacheService: CacheService) {}
+  private Actions = {
+    Clicking: 1,
+    Rotation: 1014,
+    Joystick: 15,
+  };
+  private users = {};
+  private reply = {
+    traceIds: [],
+    vehicle: null,
+    mediaSrc: null,
+    newUserStates: [
+      {
+        userId: 'dcff36ae4fc1d',
+        playerState: {
+          roomTypeId: '',
+          person: 0,
+          avatarId: '',
+          skinId: '',
+          roomId: '',
+          isHost: false,
+          isFollowHost: false,
+          skinDataVersion: '',
+          avatarComponents: '',
+          nickName: '',
+          movingMode: 0,
+          attitude: '',
+          areaName: '',
+          pathName: '',
+          pathId: '',
+          avatarSize: 1,
+          extra: '',
+          prioritySync: false,
+          player: {
+            position: { x: -700, y: 0, z: 0 },
+            angle: {
+              pitch: 0,
+              yaw: 0,
+              roll: 0,
+            },
+          },
+          camera: {
+            position: { x: -1145, y: 0, z: 160 },
+            angle: {
+              pitch: 0,
+              yaw: 0,
+              roll: 0,
+            },
+          },
+          cameraCenter: { x: -700, y: 0, z: 0 },
+        },
+        renderInfo: {
+          renderType: 0,
+          videoFrame: null,
+          cameraStateType: 3,
+          isMoving: 1,
+          needIfr: 0,
+          isVideo: 0,
+          stillFrame: 0,
+          isRotating: 0,
+          isFollowing: 0,
+          clientPanoTitlesBitmap: [],
+          clientPanoTreceId: '',
+          prefetchVideoId: '',
+          noMedia: false,
+        },
+        event: null,
+        relation: 1,
+      },
+    ],
+    actionResponses: [
+      {
+          "actionType": 1,
+          "pointType": 100,
+          "extra": "",
+          "traceId": "",
+          "packetId": "",
+          "nps": [],
+          "peopleNum": 0,
+          "zoneId": "",
+          "echoMsg": "",
+          "reserveDetail": null,
+          "userWithAvatarList": [],
+          "newUserStates": [],
+          "code": 0,
+          "msg": ""
+      }
+    ],
+    getStateType: 0,
+    code: 0,
+    msg: 'OK',
+  };
+
+  async move(actionRequest) {
+    try {
+      const userId = actionRequest['user_id'];
+      const traceId = actionRequest['trace_id'];
+      const user = this.users[userId];
+     
+      const path = [100,99,97];    //需要计算路径
+      const angle = user.camera.angle.yaw%45;   //纠正需要
+      const index = Math.round(user.camera.angle.yaw/45);  //过渡需要
+
+      let traceIds = [];
+      traceIds.push(traceId);  
+
+      //纠正,旋转传到缓存里
+      //rotateService.rotateForAngle(userId,angle);
+
+      //过渡传到缓存里
+      this.reply.traceIds = traceIds;
+      this.reply['newUserStates'][0].userId = userId;
+      this.reply['actionResponses'][0].traceId = traceId;
+      
+      for(let i=0;i<path.length-1;++i){
+        let start_break_point_id = path[i];
+        let end_break_point_id = path[i+1];
+        //读redis里的数据,按照frame_index的大小排序
+        //key:app_id+start_break_point_id+end_break_point_id+index
+        //value:frame_index,file_name,camera_position,camera_angle
+      }
+
+
+      
+    } catch (error) {
+      console.log('MoveService', error);
+    }
+  }
+
+  createCacheReplys(moveFrames,traceId,userId,startPosition,endPosition){
+
+    let replys = [];
+    for(let i = 1;i<moveFrames.length;++i){
+        let moveFrame = moveFrames[i];
+
+        let reply = JSON.parse(JSON.stringify(this.reply));
+        reply.traceIds.push(traceId);
+        reply['newUserStates'][0].userId = userId;
+    
+        reply['newUserStates'][0].playerState.player.position = {
+            x:(endPosition.x - startPosition.x)/moveFrames.length*i,
+            y:(endPosition.y - startPosition.y)/moveFrames.length*i,
+            z:(endPosition.z - startPosition.z)/moveFrames.length*i
+        }
+        reply['newUserStates'][0].playerState.player.angle = this.users[userId].player.angle;
+
+        reply['newUserStates'][0].playerState.camera.position = moveFrame.camera_position;
+        reply['newUserStates'][0].playerState.camera.angle = moveFrame.camera_angle;
+        reply['newUserStates'][0].playerState.cameraCenter = reply['newUserStates'][0].playerState.player.position;
+    
+        reply['actionResponses'][0].traceId = traceId;
+        replys.push(reply);
+    }
+
+
+  }
+}

+ 317 - 0
src/back/rotate.service.ts

@@ -0,0 +1,317 @@
+import { Injectable } from '@nestjs/common';
+import { CacheService } from 'src/cache/cache.service';
+
+@Injectable()
+export class RotateService {
+  constructor(private cacheService: CacheService) {}
+  private actionRequestPool = {};
+  private Actions = {
+    Clicking: 1,
+    Rotation: 1014,
+    Joystick: 15,
+  };
+  private users = {};
+  private replys = {};
+
+  init(app_id, userId) {
+    const user = {
+      appId: null,
+      userId: null,
+      breakPointId: null,
+      player: {
+        position: { x: -700, y: 0, z: 0 },
+        angle: {
+          pitch: 0,
+          yaw: 0,
+          roll: 0,
+        },
+      },
+      camera: {
+        position: { x: -1145, y: 0, z: 160 },
+        angle: {
+          pitch: 0,
+          yaw: 0,
+          roll: 0,
+        },
+      },
+      rotateInfo: {
+        frameIndex: 0,
+        horizontal_move: 0,
+        mediaSrc: null,
+      },
+      moveInfo: {},
+      // traceIds: [],
+      // actionResponses:[]
+    };
+
+    user.appId = app_id;
+    user.userId = userId;
+    user.breakPointId = 100;
+    this.users[userId] = user;
+
+    const reply = {
+      traceIds: [],
+      vehicle: null,
+      mediaSrc: null,
+      newUserStates: [
+        {
+          userId: 'dcff36ae4fc1d',
+          playerState: {
+            roomTypeId: '',
+            person: 0,
+            avatarId: '',
+            skinId: '',
+            roomId: '',
+            isHost: false,
+            isFollowHost: false,
+            skinDataVersion: '',
+            avatarComponents: '',
+            nickName: '',
+            movingMode: 0,
+            attitude: '',
+            areaName: '',
+            pathName: '',
+            pathId: '',
+            avatarSize: 1,
+            extra: '',
+            prioritySync: false,
+            player: {
+              position: { x: -700, y: 0, z: 0 },
+              angle: {
+                pitch: 0,
+                yaw: 0,
+                roll: 0,
+              },
+            },
+            camera: {
+              position: { x: -1145, y: 0, z: 160 },
+              angle: {
+                pitch: 0,
+                yaw: 0,
+                roll: 0,
+              },
+            },
+            cameraCenter: { x: -700, y: 0, z: 0 },
+          },
+          renderInfo: {
+            renderType: 0,
+            videoFrame: null,
+            cameraStateType: 3,
+            isMoving: 0,
+            needIfr: 0,
+            isVideo: 0,
+            stillFrame: 0,
+            isRotating: 0,
+            isFollowing: 0,
+            clientPanoTitlesBitmap: [],
+            clientPanoTreceId: '',
+            prefetchVideoId: '',
+            noMedia: false,
+          },
+          event: null,
+          relation: 1,
+        },
+      ],
+      actionResponses: [
+        // {
+        //     "actionType": 15,
+        //     "pointType": 100,
+        //     "extra": "",
+        //     "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
+        //     "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
+        //     "nps": [],
+        //     "peopleNum": 0,
+        //     "zoneId": "",
+        //     "echoMsg": "",
+        //     "reserveDetail": null,
+        //     "userWithAvatarList": [],
+        //     "newUserStates": [],
+        //     "code": 0,
+        //     "msg": ""
+        // }
+      ],
+      getStateType: 0,
+      code: 0,
+      msg: 'OK',
+    };
+
+    reply['newUserStates'][0]['userId'] = userId;
+    this.replys[userId] = reply;
+    return reply;
+  }
+
+  async rotate(actionRequest) {
+    try {
+      const userId = actionRequest['user_id'];
+      if (this.actionRequestPool[userId]) {
+        this.actionRequestPool[userId].push(actionRequest);
+      } else {
+        this.actionRequestPool[userId] = [];
+        this.actionRequestPool[userId].push(actionRequest);
+      }
+
+      let reply = this.replys[userId];
+
+      const actionRequests = this.actionRequestPool[userId];
+      const user = this.users[userId];
+      // debugger;
+      let horizontal_move = user.rotateInfo.horizontal_move;
+      //const traceIds = user.traceIds;
+      let sub = 0;
+      for (let i = 0; i < actionRequests.length; ++i) {
+        if (actionRequests[i].action_type == this.Actions.Rotation) {
+          horizontal_move += actionRequests[i].rotation_action.horizontal_move;
+          reply.traceIds.push(actionRequests[i].trace_id);
+          let actionResponse = this.createActionResponse(actionRequests[i].action_type,actionRequests[i].trace_id);
+          reply.actionResponses.push(actionResponse);
+          ++sub;
+        } else {
+          break;
+        }
+      }
+
+      actionRequests.splice(0, sub);
+      const hAngle = horizontal_move * 90;
+      if (Math.abs(hAngle) < 1) {
+        user.rotateInfo.horizontal_move = horizontal_move;
+        //user.traceIds = traceIds;
+        this.replys[userId] = reply;
+        return null;     
+      }
+      return this.rotateForAngle(userId,hAngle);
+      /*
+      user.rotateInfo.frameIndex += Math.floor(hAngle);
+      if (user.rotateInfo.frameIndex < 0) {
+        user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
+      } else if (user.rotateInfo.frameIndex > 359) {
+        user.rotateInfo.frameIndex -= 360;
+      }
+      reply['traceIds'] = traceIds;
+      reply['newUserStates'][0]['userId'] = userId;
+      //从redis里取
+      //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
+      const key =
+        'rotateframe:app_id:' +
+        user.appId +
+        ':frame_index:' +
+        user.rotateInfo.frameIndex +
+        ':break_point_id:' +
+        user.breakPointId;
+      // const value = null;
+
+      const redisData = await this.cacheService.get(key);
+      const value = JSON.parse(redisData);
+      console.log('redis', value);
+      user.camera['position'] = value ? value.cameraPosition : '';
+      user.camera['angle'] = value ? value.cameraAngle : '';
+
+      //this.reply['newUserStates'][0]['playerState'] .player
+      reply['newUserStates'][0]['playerState'].camera.position =
+        user.camera['position'];
+      reply['newUserStates'][0]['playerState'].camera.angle =
+        user.camera['angle'];
+      reply['newUserStates'][0]['playerState'].cameraCenter =
+        user.player.position;
+      // debugger
+      reply.mediaSrc =
+        '/' +
+        '0000000001' +
+        '/' +
+        user.breakPointId +
+        '/' +
+        value.directory +
+        '/' +
+        value.fileName +
+        '?m=' +
+        new Date().getTime();
+
+      this.replys[userId].traceIds = [];
+      this.replys[userId].actionResponses = [];
+
+      return reply;
+      */
+    } catch (error) {
+      console.log('RotateService', error);
+    }
+  }
+
+  async rotateForAngle(userId,hAngle){
+    try{
+      const user = this.users[userId];
+      user.rotateInfo.frameIndex += Math.floor(hAngle);
+      if (user.rotateInfo.frameIndex < 0) {
+        user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
+      } else if (user.rotateInfo.frameIndex > 359) {
+        user.rotateInfo.frameIndex -= 360;
+      }
+
+      let reply = JSON.parse(JSON.stringify(this.replys[userId]));
+      reply['newUserStates'][0]['userId'] = userId;
+      //从redis里取
+      //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
+      const key =
+        'rotateframe:app_id:' +
+        user.appId +
+        ':frame_index:' +
+        user.rotateInfo.frameIndex +
+        ':break_point_id:' +
+        user.breakPointId;
+      // const value = null;
+
+      const redisData = await this.cacheService.get(key);
+      const value = JSON.parse(redisData);
+      console.log('redis', value);
+      user.camera['position'] = value ? value.cameraPosition : '';
+      user.camera['angle'] = value ? value.cameraAngle : '';
+
+      //this.reply['newUserStates'][0]['playerState'] .player
+      reply['newUserStates'][0]['playerState'].camera.position =
+        user.camera['position'];
+      reply['newUserStates'][0]['playerState'].camera.angle =
+        user.camera['angle'];
+      reply['newUserStates'][0]['playerState'].cameraCenter =
+        user.player.position;
+      // debugger
+      reply.mediaSrc =
+        '/' +
+        '0000000001' +
+        '/' +
+        user.breakPointId +
+        '/' +
+        value.directory +
+        '/' +
+        value.fileName +
+        '?m=' +
+        new Date().getTime();
+
+      this.replys[userId].traceIds = [];
+      this.replys[userId].actionResponses = [];
+
+      user.rotateInfo.horizontal_move = 0;
+
+      return reply;
+    } catch (error) {
+      console.log('RotateService', error);
+    }
+  }
+
+  createActionResponse(actionType,traceId){
+      let actionResponse = {
+        "actionType": actionType,
+        "pointType": 100,
+        "extra": "",
+        "traceId": traceId,
+        "packetId": "",
+        "nps": [],
+        "peopleNum": 0,
+        "zoneId": "",
+        "echoMsg": "",
+        "reserveDetail": null,
+        "userWithAvatarList": [],
+        "newUserStates": [],
+        "code": 0,
+        "msg": ""
+      }
+      return actionResponse;
+  }
+}