xushiting 3 سال پیش
والد
کامیت
a5d4dce577
4فایلهای تغییر یافته به همراه139 افزوده شده و 92 حذف شده
  1. 4 4
      dist/libs/decoder.js
  2. 121 77
      src/back/move.service.ts
  3. 13 10
      src/back/rotate.service.ts
  4. 1 1
      src/main.js

+ 4 - 4
dist/libs/decoder.js

@@ -471,7 +471,7 @@ if ('function' === typeof importScripts) {
     while (this.getNumOfPktToBeDec() > 0) {
       index = this.readPtr
       if (this.slotHasMedia(index)) {
-        // dropMedia until IDR // \u6765\u4E0D\u53CA\u89E3\u7801\u4E22\u5E27
+        // dropMedia until IDR // 来不及解码丢帧
         this.packetsDrop += 1
         if (untilIDR) {
           if (mediaArray[index].isIDR == true) {
@@ -622,14 +622,14 @@ if ('function' === typeof importScripts) {
         t: MessageEvent.UpdateStats,
         mediaBytesReceived: self.decoder.mediaBytesReceived,
         metaBytesReceived: self.decoder.metaBytesReceived,
-        packetsLost: self.decoder.packetsLost, // \u7F51\u7EDC\u4E22\u5E27
-        packetsDrop: self.decoder.packetsDrop, // \u6765\u4E0D\u53CA\u89E3\u7801\u4E22\u5E27
+        packetsLost: self.decoder.packetsLost, // 网络丢帧
+        packetsDrop: self.decoder.packetsDrop, // 来不及解码丢帧
         framesReceived: self.decoder.receivedMedia,
         framesDecoded: self.decoder.receivedYUV,
         framesRendered: self.decoder.receivedEmit,
         framesReturned: framesReturned,
         // framesAwait: leastReceivePts - lastProcessPts,
-        framesAwait: self.decoder.getNumOfPktToBeDec(), // \u7B49\u5F85\u89E3\u7801\u7684\u5E27
+        framesAwait: self.decoder.getNumOfPktToBeDec(), // 等待解码的帧
         decodeTimePerFrame: dtpf,
         decodeTimeMaxFrame: dtmf,
         sendOutBuffer: send_out_buffer,

+ 121 - 77
src/back/move.service.ts

@@ -1,15 +1,20 @@
 import { Injectable } from '@nestjs/common';
 import { CacheService } from 'src/cache/cache.service';
+import { RotateService } from 'src/rotate/rotate.service';
+// import { SceneService } from 'src/scene/scene.service';
 
 @Injectable()
 export class MoveService {
-  constructor(private cacheService: CacheService) {}
+  constructor(
+    private cacheService: CacheService,
+    private rotateService: RotateService,
+  ) {}
   private Actions = {
     Clicking: 1,
     Rotation: 1014,
     Joystick: 15,
   };
-  public users = {};
+  public users = this.rotateService.users;
 
   private reply = {
     traceIds: [],
@@ -153,14 +158,22 @@ export class MoveService {
 
       //纠正,旋转传到缓存里
       const checkReplys = [];
+      console.log('矫正: ' + angle + ' 度');
       for (let i = 0; i < angle; ++i) {
-        //let reply = rotateService.rotateForAngle(userId,(angle+i)%359);
-        //reply.traceIds = [];
-        //reply.traceIds.push(traceId);
-        //let actionResponse = rotateService.createActionResponse(actionType,trace_id);
-        //reply.actionResponses = [];
-        //reply.actionResponses.push(actionResponse);
-        //checkReplys.push(reply);
+        console.warn('矫正一次:' + i);
+        const reply = await this.rotateService.rotateForAngle(userId, 1);
+        console.warn(
+          '矫正:' + reply.newUserStates[0].playerState.camera.angle.yaw,
+        );
+        reply.traceIds = [];
+        reply.traceIds.push(traceId);
+        const actionResponse = this.rotateService.createActionResponse(
+          actionType,
+          traceId,
+        );
+        reply.actionResponses = [];
+        reply.actionResponses.push(actionResponse);
+        checkReplys.push(reply);
       }
       replys['P' + user.breakPointId + 'T' + user.breakPointId] = checkReplys;
       //replys.push(checkReplys);
@@ -428,29 +441,36 @@ export class MoveService {
       const traceId = actionRequest['trace_id'];
       const dir_action = actionRequest['dir_action'];
       const user = this.users[userId];
-     
+
       const appId = user.appId;
       //只是移动人物
-      if(dir_action.speed_level<7){
+      if (dir_action.speed_level < 7) {
         user.player.angle.yaw = dir_action.move_angle;
         this.reply['newUserStates'][0]['userId'] = userId;
-        this.reply['newUserStates'][0].playerState.player.position = user.player.position;
-        this.reply['newUserStates'][0].playerState.player.angle.yaw = dir_action.move_angle;
+        this.reply['newUserStates'][0].playerState.player.position =
+          user.player.position;
+        this.reply['newUserStates'][0].playerState.player.angle.yaw =
+          dir_action.move_angle;
+
+        this.reply['newUserStates'][0].playerState.camera.position =
+          user.camera.position;
+        this.reply['newUserStates'][0].playerState.camera.angle =
+          user.camera.angle;
 
-        this.reply['newUserStates'][0].playerState.camera.position = user.camera.position;
-        this.reply['newUserStates'][0].playerState.camera.angle = user.camera.angle;
+        this.reply['newUserStates'][0].playerState.cameraCenter =
+          user.camera.position;
 
-        this.reply['newUserStates'][0].playerState.cameraCenter = user.camera.position;
- 
         this.reply['actionResponses'][0].traceId = traceId;
 
         return this.reply;
       }
       //选择过渡
-      else{
+      else {
         const breakPointId = user.breakPointId;
         //先矫正
-        const breakPointRes = await this.cacheService.get('breakpoints:app_id:'+appId+':break_point_id:'+breakPointId);
+        const breakPointRes = await this.cacheService.get(
+          'breakpoints:app_id:' + appId + ':break_point_id:' + breakPointId,
+        );
         if (breakPointRes == null) {
           return null;
         }
@@ -459,68 +479,92 @@ export class MoveService {
         const contact = breakPoint.contact;
         let chooseBreakPointId = null;
         let minOffsetAngle = null;
-        let neighPoint = null
+        let neighPoint = null;
         let angle = 0;
-        for(let i=0;i<contact.length;++i){
-            neighPoint = await this.cacheService.get('breakpoints:app_id:'+appId+':break_point_id:'+contact[i]);  //通过contact[i],去redis里找
-            //通过user.player.position;neighPoint.position获得角度
-            angle = this.getAngle(user.player.position,{x:user.player.position.x+1,y:user.player.position.y},neighPoint.position) ;
-            if(Math.abs(angle - dir_action.move_angle)<45&&(minOffsetAngle == null||Math.abs(angle - dir_action.move_angle)<minOffsetAngle)){
-                chooseBreakPointId = contact[i];
-                minOffsetAngle = Math.abs(angle - dir_action.move_angle);
-            }
+        for (let i = 0; i < contact.length; ++i) {
+          neighPoint = await this.cacheService.get(
+            'breakpoints:app_id:' + appId + ':break_point_id:' + contact[i],
+          ); //通过contact[i],去redis里找
+          //通过user.player.position;neighPoint.position获得角度
+          angle = this.getAngle(
+            user.player.position,
+            { x: user.player.position.x + 1, y: user.player.position.y },
+            neighPoint.position,
+          );
+          if (
+            Math.abs(angle - dir_action.move_angle) < 45 &&
+            (minOffsetAngle == null ||
+              Math.abs(angle - dir_action.move_angle) < minOffsetAngle)
+          ) {
+            chooseBreakPointId = contact[i];
+            minOffsetAngle = Math.abs(angle - dir_action.move_angle);
+          }
         }
 
-        if(chooseBreakPointId == null){
-            return null;
-        }
-        else{
-            //人物矫正
-            user.player.angle.yaw = angle;
-            
-            //相机纠正
-            let replys = [];
-            let traceIds = [];
-            traceIds.push(traceId);  
-      
-            let checkReplys = [];
-            angle = user.camera.angle.yaw%45;   //纠正需要
-            for(let i=0;i<angle;++i){
-               //let reply = rotateService.rotateForAngle(userId,(angle+i)%359);
-               //reply.traceIds = [];
-               //reply.traceIds.push(traceId);
-               //let actionResponse = rotateService.createActionResponse(actionType,trace_id);
-               //reply.actionResponses = [];
-               //reply.actionResponses.push(actionResponse);
-               //checkReplys.push(reply);
-            }
-            replys.push(checkReplys);
-
-            //过渡
-            //读redis里的数据,按照frame_index的大小排序
-            const key ='moveframe:app_id:' +appId +':start_break_point_id:' +breakPointId +':end_break_point_id:' +chooseBreakPointId +':angle:' +user.camera.angle%45;
-            const moveFramesRes = await this.cacheService.get(key);
-            if (moveFramesRes == null) {
-                return replys;
-            }
-            const moveFrames = JSON.parse(moveFramesRes);
-            //读redis里的数据
-            const startBreakPointRes = await this.cacheService.get('breakpoints:app_id:' +appId +':break_point_id:' +breakPointId);
-            const startBreakPoint = JSON.parse(startBreakPointRes);
-
-            const endBreakPointRes = await this.cacheService.get('breakpoints:app_id:' +appId +':break_point_id:' +chooseBreakPointId);
-            const endBreakPoint = JSON.parse(endBreakPointRes);
-
-            let pathReplys = this.createCacheReplys(
-                moveFrames,
-                traceId,
-                userId,
-                breakPointId,
-                startBreakPoint.position,
-                endBreakPoint.position,
-              );
-            replys.push(pathReplys);
+        if (chooseBreakPointId == null) {
+          return null;
+        } else {
+          //人物矫正
+          user.player.angle.yaw = angle;
+
+          //相机纠正
+          const replys = [];
+          const traceIds = [];
+          traceIds.push(traceId);
+
+          const checkReplys = [];
+          angle = user.camera.angle.yaw % 45; //纠正需要
+          for (let i = 0; i < angle; ++i) {
+            //let reply = rotateService.rotateForAngle(userId,(angle+i)%359);
+            //reply.traceIds = [];
+            //reply.traceIds.push(traceId);
+            //let actionResponse = rotateService.createActionResponse(actionType,trace_id);
+            //reply.actionResponses = [];
+            //reply.actionResponses.push(actionResponse);
+            //checkReplys.push(reply);
+          }
+          replys.push(checkReplys);
+
+          //过渡
+          //读redis里的数据,按照frame_index的大小排序
+          const key =
+            'moveframe:app_id:' +
+            appId +
+            ':start_break_point_id:' +
+            breakPointId +
+            ':end_break_point_id:' +
+            chooseBreakPointId +
+            ':angle:' +
+            (user.camera.angle % 45);
+          const moveFramesRes = await this.cacheService.get(key);
+          if (moveFramesRes == null) {
             return replys;
+          }
+          const moveFrames = JSON.parse(moveFramesRes);
+          //读redis里的数据
+          const startBreakPointRes = await this.cacheService.get(
+            'breakpoints:app_id:' + appId + ':break_point_id:' + breakPointId,
+          );
+          const startBreakPoint = JSON.parse(startBreakPointRes);
+
+          const endBreakPointRes = await this.cacheService.get(
+            'breakpoints:app_id:' +
+              appId +
+              ':break_point_id:' +
+              chooseBreakPointId,
+          );
+          const endBreakPoint = JSON.parse(endBreakPointRes);
+
+          const pathReplys = this.createCacheReplys(
+            moveFrames,
+            traceId,
+            userId,
+            breakPointId,
+            startBreakPoint.position,
+            endBreakPoint.position,
+          );
+          replys.push(pathReplys);
+          return replys;
         }
       }
     } catch (error) {

+ 13 - 10
src/back/rotate.service.ts

@@ -1,9 +1,12 @@
 import { Injectable, Logger } from '@nestjs/common';
 import { CacheService } from 'src/cache/cache.service';
+// import { SceneService } from 'src/scene/scene.service';
 
 @Injectable()
 export class RotateService {
-  constructor(private cacheService: CacheService) {}
+  constructor(
+    private cacheService: CacheService, // private sceneService: SceneService,
+  ) {}
   private actionRequestPool = {};
   private logger: Logger = new Logger('rotateService');
   private Actions = {
@@ -11,7 +14,7 @@ export class RotateService {
     Rotation: 1014,
     Joystick: 15,
   };
-  private users = {};
+  public users = {};
   private replies = {};
 
   init(app_id, userId) {
@@ -176,7 +179,7 @@ export class RotateService {
       }
 
       actionRequests.splice(0, sub);
-      const hAngle = horizontal_move * 90;
+      const hAngle = horizontal_move * 60;
       if (Math.abs(hAngle) < 1) {
         user.rotateInfo.horizontal_move = horizontal_move;
         //user.traceIds = traceIds;
@@ -243,11 +246,11 @@ export class RotateService {
   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;
+      user.camera.angle.yaw += Math.floor(hAngle);
+      if (user.camera.angle.yaw < 0) {
+        user.camera.angle.yaw = 360 + user.camera.angle.yaw;
+      } else if (user.camera.angle.yaw > 359) {
+        user.camera.angle.yaw -= 360;
       }
 
       const reply = JSON.parse(JSON.stringify(this.replies[userId]));
@@ -258,7 +261,7 @@ export class RotateService {
         'rotateframe:app_id:' +
         user.appId +
         ':frame_index:' +
-        user.rotateInfo.frameIndex +
+        user.camera.angle.yaw +
         ':break_point_id:' +
         user.breakPointId;
       // const value = null;
@@ -268,7 +271,7 @@ export class RotateService {
         const value = redisData ? JSON.parse(redisData) : null;
         // console.log('rotate-service', value);
         user.camera['position'] = value ? value.cameraPosition : '';
-        user.camera['angle'] = value ? value.cameraAngle : '';
+        //user.camera['angle'] = value ? value.cameraAngle : '';
 
         reply['newUserStates'][0]['playerState'].player.position =
           user.player.position;

+ 1 - 1
src/main.js

@@ -34,7 +34,7 @@ const l = async()=>{
             avatarId: 'KGe_Boy',
             roomId: 'e629ef3e-022d-4e64-8654-703bb96410eb',
             userId: nickname,
-            wsServerUrl: 'wss://uat-eks.xverse.cn/ws', //'wss://meta-socket.4dage.com/ws',
+            wsServerUrl: 'wss://meta-socket.4dage.com/ws',//'wss://uat-eks.xverse.cn/ws', //'wss://meta-socket.4dage.com/ws',
             appId: "10016",
             token: " ",
             nickname: nickname,