xushiting před 3 roky
rodič
revize
6c0f8f2ea6

+ 10 - 10
src/main/java/com/fdkk/fdkkmeta/ctroller/DevController.java

@@ -164,15 +164,15 @@ public class DevController   {
         return "";
     }
 
-    @PostMapping("redis")
-    public void testredis(String userId,Object value) throws IOException, InterruptedException {
-
-        for (int i = 0; i < 10000; i++) {
-            RotateRequest.Builder builder = RotateRequest.newBuilder();
-            builder.setUserId("u_"+i);
-            redisPublishService.sendProtocolMessage(RedisQueueConstant.JOYSTICK_QUEUE,builder);
-
-        }
-    }
+//    @PostMapping("redis")
+//    public void testredis(String userId,Object value) throws IOException, InterruptedException {
+//
+//        for (int i = 0; i < 10000; i++) {
+//            RotateRequest.Builder builder = RotateRequest.newBuilder();
+//            builder.setUserId("u_"+i);
+//            redisPublishService.sendProtocolMessage(RedisQueueConstant.JOYSTICK_QUEUE,builder);
+//
+//        }
+//    }
 
 }

+ 8 - 4
src/main/java/com/fdkk/fdkkmeta/domain/po/ActionPO.java

@@ -19,11 +19,15 @@ public class ActionPO {
     private String trace_id;
     private String user_id;
     //private JSONArray path;
-    private RotationAction rotationAction;
+    //private RotationAction rotationAction;
+    private JSONObject rotationAction;
 
-    private State clicking_state;
-    private ClickingAction clicking_action;
-    private DirAction dirAction;
+    //private State clicking_state;
+    private JSONObject clicking_state;
+    //private ClickingAction clicking_action;
+    private JSONObject clicking_action;
+    //private DirAction dirAction;
+    private JSONObject dirAction;
     //private boolean isMoving = false;
     //private boolean isRotated = false;
     //private long frameId = 0;

+ 5 - 1
src/main/java/com/fdkk/fdkkmeta/grpcService/SceneGrpcService.java

@@ -3,6 +3,7 @@ package com.fdkk.fdkkmeta.grpcService;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
+import com.fdkk.fdkkmeta.domain.po.ActionPO;
 import com.fdkk.fdkkmeta.domain.po.AnglePO;
 import com.fdkk.fdkkmeta.domain.po.PointPO;
 import com.fdkk.fdkkmeta.grpc.*;
@@ -25,5 +26,8 @@ public interface SceneGrpcService {
     double calAngle(PointPO o, PointPO s, PointPO e);
 
     int calAngleForBreakPointId(BreakpointsEntity breakpointsEntity1,BreakpointsEntity breakpointsEntity2);
-    AnglePO setRotateForMove(JSONObject user, String trace_id, AnglePO cameraAngle);
+    //AnglePO setRotateForMove(JSONObject user, String trace_id, AnglePO cameraAngle);
+    void setRotateForMove(JSONObject userInfo, ActionPO actionPO);
+
+    void setRotate(JSONObject userInfo, ActionPO actionPO);
 }

+ 205 - 31
src/main/java/com/fdkk/fdkkmeta/grpcService/SceneGrpcServiceImpl.java

@@ -3,6 +3,7 @@ package com.fdkk.fdkkmeta.grpcService;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkk.fdkkmeta.config.MetaConfig;
 import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
@@ -12,25 +13,29 @@ import com.fdkk.fdkkmeta.domain.po.PointPO;
 import com.fdkk.fdkkmeta.grpc.*;
 import com.fdkk.fdkkmeta.redis.RedisCache;
 import com.fdkk.fdkkmeta.service.RotateFrameService;
+import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Date;
 
 @Slf4j
 @Service
 public class SceneGrpcServiceImpl implements SceneGrpcService {
 
     @Autowired
+    MetaConfig metaConfig;
+    @Autowired
     RedisCache redisCache;
 
     @Autowired
     RotateFrameService rotateFrameService;
 
     @Override
-    public int test(int a){
+    public int test(int a) {
         return 0;
     }
 
@@ -42,7 +47,7 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
         builder.setPlayerState(state);
         builder.setRenderInfo(renderInfo);
         builder.setRelation(1);
-        if (ObjectUtil.isNotNull(event)){
+        if (ObjectUtil.isNotNull(event)) {
             builder.setEvent(event);
         }
         UserState userState = builder.build();
@@ -68,22 +73,22 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
         builder.setPathName("thirdwalk");
         builder.setPathId("thirdwalk");
         builder.setAvatarSize(1);
-        if(userInfo.get("extra") != null){
+        if (userInfo.get("extra") != null) {
             builder.setExtra(userInfo.getString("extra"));
         }
         builder.setPrioritySync(false);
-        builder.setPlayer((Space)userInfo.get("player"));
-        if(userInfo.get("camera") != null){
-            builder.setCamera((Space)userInfo.get("camera"));
+        builder.setPlayer((Space) userInfo.get("player"));
+        if (userInfo.get("camera") != null) {
+            builder.setCamera((Space) userInfo.get("camera"));
         }
-        if(userInfo.get("cameraCenter") != null){
-            builder.setCamera((Space)userInfo.get("cameraCenter"));
+        if (userInfo.get("cameraCenter") != null) {
+            builder.setCamera((Space) userInfo.get("cameraCenter"));
         }
         return builder.build();
     }
 
     @Override
-    public State createPlayerState2(Space player,Space camera,Point cameraCenter){
+    public State createPlayerState2(Space player, Space camera, Point cameraCenter) {
         State.Builder builder = State.newBuilder();
         builder.setRoomTypeId("");
         builder.setPerson(0);
@@ -109,23 +114,23 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
     }
 
     @Override
-    public JSONObject createActionResponse(int actionType,String traceId){
+    public JSONObject createActionResponse(int actionType, String traceId) {
         JSONObject actionResponse = new JSONObject();
-        actionResponse.put("actionType",actionType);
-        actionResponse.put("pointType",100);
-        actionResponse.put("extra","");
-        actionResponse.put("traceId",traceId);
-        actionResponse.put("packetId","");
-        actionResponse.put("nps",new JSONArray());
-        actionResponse.put("peopleNum",0);
-
-        actionResponse.put("zoneId","");
-        actionResponse.put("echoMsg","");
-        actionResponse.put("reserveDetail",null);
-        actionResponse.put("userWithAvatarList",new JSONArray());
-        actionResponse.put("newUserStates",new JSONArray());
-        actionResponse.put("code",0);
-        actionResponse.put("msg","");
+        actionResponse.put("actionType", actionType);
+        actionResponse.put("pointType", 100);
+        actionResponse.put("extra", "");
+        actionResponse.put("traceId", traceId);
+        actionResponse.put("packetId", "");
+        actionResponse.put("nps", new JSONArray());
+        actionResponse.put("peopleNum", 0);
+
+        actionResponse.put("zoneId", "");
+        actionResponse.put("echoMsg", "");
+        actionResponse.put("reserveDetail", null);
+        actionResponse.put("userWithAvatarList", new JSONArray());
+        actionResponse.put("newUserStates", new JSONArray());
+        actionResponse.put("code", 0);
+        actionResponse.put("msg", "");
         return actionResponse;
     }
 
@@ -155,25 +160,26 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
     }
 
     @Override
-    public Space createSpace(Point position,AngleUe4 angle) {
+    public Space createSpace(Point position, AngleUe4 angle) {
         Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
         return space;
     }
 
     @Override
-    public Point createPoint(String x,String y,String z) {
+    public Point createPoint(String x, String y, String z) {
         Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
         return point;
     }
 
     @Override
-    public AngleUe4 createAngle(int pitch,int yaw,int roll) {
+    public AngleUe4 createAngle(int pitch, int yaw, int roll) {
         AngleUe4 angle = AngleUe4.newBuilder().setPitch(pitch).setYaw(yaw).setRoll(roll).build();
         return angle;
     }
 
     /**
      * 根据余弦定理计算线段1到线段2的夹角,线段1:起始点到原点,线段2:原点到结束点)
+     *
      * @param o 原点
      * @param s 起始点
      * @param e 结束点
@@ -202,17 +208,19 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
     }
 
     @Override
-    public int calAngleForBreakPointId(BreakpointsEntity breakpointsEntity1, BreakpointsEntity breakpointsEntity2){
+    public int calAngleForBreakPointId(BreakpointsEntity breakpointsEntity1, BreakpointsEntity breakpointsEntity2) {
         PointPO startPosition = breakpointsEntity1.getPosition();
         PointPO endPosition = breakpointsEntity2.getPosition();
 
         PointPO temp = new PointPO();
-        temp.setX(startPosition.getX()+1);
+        temp.setX(startPosition.getX() + 1);
         temp.setY(startPosition.getY());
         temp.setZ(startPosition.getZ());
-        int angle = (int)calAngle(startPosition, temp, endPosition);
+        int angle = (int) calAngle(startPosition, temp, endPosition);
         return angle;
     }
+
+    /*
     @Override
     public AnglePO setRotateForMove(JSONObject user, String trace_id, AnglePO cameraAngle){
         int angle = cameraAngle.getYaw();
@@ -243,4 +251,170 @@ public class SceneGrpcServiceImpl implements SceneGrpcService {
             return _rotateFrameEntity.getCameraAngle();
         }
     }
+    */
+
+    @Override
+    public void setRotate(JSONObject userInfo, ActionPO actionPO){
+        String user_id = userInfo.getString("userId");
+        long frameId = userInfo.getLong("frameId");
+        JSONArray actionResponses = new JSONArray();
+        String[] traceIds = userInfo.getString("traceIds").split(";");
+        if(traceIds.length>0){
+            for(int j=0;j<traceIds.length;++j){
+                JSONObject actionResponse = createActionResponse(actionPO.getAction_type(),traceIds[j]);
+                actionResponses.add(actionResponse);
+            }
+        }
+
+        RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(frameId);
+        PointPO playerPosition = userInfo.getObject("playerPosition",PointPO.class);
+        Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
+        AnglePO playerAngle = userInfo.getObject("playerAngle",AnglePO.class);
+        AngleUe4 playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+        Space player = createSpace(playerPt,playerAg);
+
+        PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
+        log.info("旋转时:计算的frameId:"+frameId+",相机的坐标:"+cameraPoint.toString());
+        Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
+        AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
+        AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
+        Space camera = createSpace(cameraPosition,cameraAngle);
+
+
+        MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
+        for(int i=0;i<traceIds.length;++i){
+            builder.addTraceIds(traceIds[i]);
+        }
+        State playerState = createPlayerState2(player,camera,playerPt);
+        RenderInfo renderInfo = createRenderInfo();
+        UserState userState = createUserState( user_id, playerState, renderInfo, null);
+        builder.addNewUserStates(userState);
+        builder.setGetStateType(0);
+        builder.setCode(200);
+        builder.setMsg("ok");
+        String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+rotateFrameEntity.getBreakPointId()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName()+"?m="+new Date().getTime();
+        builder.setMediaSrc(mediaSrc);
+        redisCache.lLeftPush("updateFrameMetadata:"+user_id,ProtoJsonUtils.toJson(builder));
+    }
+
+    @Override
+    public void setRotateForMove(JSONObject userInfo, ActionPO actionPO) {
+        String user_id = userInfo.getString("userId");
+        long frameId = userInfo.getLong("frameId");
+        RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(frameId);
+
+        String[] traceIds = new String[1];
+        traceIds[0] = actionPO.getTrace_id();
+
+        JSONArray actionResponses = new JSONArray();
+        JSONObject actionResponse = createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
+        actionResponses.add(actionResponse);
+
+        //PointPO playerPosition = user.getPlayerPosition();
+        PointPO playerPosition = userInfo.getObject("playerPosition",PointPO.class);
+        AnglePO playerAngle = userInfo.getObject("playerAngle",AnglePO.class);
+
+        Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
+//        AngleUe4 playerAg = null;
+//        if(actionPO.getAction_type() == 15){
+//            playerAngle.setYaw(playerAngle.getYaw());
+//        }
+        AngleUe4 playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+        Space player = createSpace(playerPt,playerAg);
+
+        //PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
+        //log.info("旋转时:计算的frameId:"+frameId+",相机的坐标:"+cameraPoint.toString());
+        //Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
+        AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
+        AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
+
+        int angle = cameraAngle.getYaw();
+        int offAngle = 0;
+        offAngle = angle%45;
+        //先简单来,就累加。后续要再调试
+        //存储矫正的一组帧
+        offAngle = Math.abs(45 - offAngle);
+        for(int j=0;j<offAngle;++j){
+            ActionPO rotateRequestPO = new ActionPO();
+            rotateRequestPO.setAction_type(1014);
+            rotateRequestPO.setTrace_id(actionPO.getTrace_id());
+            rotateRequestPO.setUser_id(user_id);
+            RotateFrameEntity _rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(userInfo.getString("appId"),userInfo.getLong("breakPointId"),angle+j);
+            PointPO cameraPoint = _rotateFrameEntity.getCameraPosition();
+            Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
+            Space camera = createSpace(cameraPosition,cameraAngle);
+            MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
+            for(int i=0;i<traceIds.length;++i){
+                builder.addTraceIds(traceIds[i]);
+            }
+            State playerState = createPlayerState2(player,camera,playerPt);
+            RenderInfo renderInfo = createRenderInfo();
+            UserState userState = createUserState( user_id, playerState, renderInfo, null);
+            builder.addNewUserStates(userState);
+            builder.setGetStateType(0);
+            builder.setCode(200);
+            builder.setMsg("ok");
+            String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+rotateFrameEntity.getBreakPointId()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName()+"?m="+new Date().getTime();
+            builder.setMediaSrc(mediaSrc);
+            redisCache.lLeftPush("updateFrameMetadata:"+user_id, ProtoJsonUtils.toJson(builder));
+        }
+    }
+
+//    private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType) throws IOException {
+//        JSONArray actionResponses = new JSONArray();
+//        String[] traceIds = new String[rotateJoystickList.size()];
+//        if(rotateJoystickList.size()>0){
+//            for(int j=0;j<rotateJoystickList.size();++j){
+//                ActionPO actionPO = rotateJoystickList.get(j);
+//                JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
+//                actionResponses.add(actionResponse);
+//                traceIds[j] = actionPO.getTrace_id();
+//            }
+//        }
+//
+//        ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
+//        RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
+//        PointPO playerPosition = user.getPlayerPosition();
+//        Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
+//        AnglePO playerAngle = user.getPlayerAngle();
+//        AngleUe4 playerAg = null;
+//        if(firstActionType == 15){
+//            playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
+//        }
+//        playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+//        Space player = sceneGrpcService.createSpace(playerPt,playerAg);
+//
+//        PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
+//        log.info("旋转时:计算的frameId:"+lastActionPO.getFrameId()+",相机的坐标:"+cameraPoint.toString());
+//        Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
+//        AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
+//        AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
+//        Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
+//
+//
+//        MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
+//        for(int i=0;i<traceIds.length;++i){
+//            builder.addTraceIds(traceIds[i]);
+//        }
+//        State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
+//
+//        RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
+//        UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
+//
+//
+//        builder.addNewUserStates(userState);
+//
+//        builder.setGetStateType(0);
+//        builder.setCode(200);
+//        builder.setMsg("ok");
+//
+//        String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+rotateFrameEntity.getBreakPointId()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName()+"?m="+new Date().getTime();
+//        builder.setMediaSrc(mediaSrc);
+//        redisCache.lLeftPush("updateFrameMetadata:"+user.getUserId(),ProtoJsonUtils.toJson(builder));
+//
+//        //更新user表
+//        user.setFrameId(lastActionPO.getFrameId());
+//        user.setPlayerAngle(playerAngle);
+//    }
+
 }

+ 57 - 8
src/main/java/com/fdkk/fdkkmeta/grpcService/sceneGrpcServer.java

@@ -159,6 +159,9 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			myState.put("breakPointId",firstBreakPointId);
 			myState.put("appId",app_id);
 			myState.put("userId",user_id);
+			myState.put("traceIds","");
+			myState.put("playerPosition",player_position);
+			myState.put("playerAngle",player_angle);
 			//redis中写入用户状态信息
 			redisCache.setCacheObject("UserState:"+userEntity.getUserId(),myState);
 
@@ -206,10 +209,11 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			rotateRequestPO.setAction_type(actionType);
 			rotateRequestPO.setTrace_id(trace_id);
 			rotateRequestPO.setUser_id(user_id);
-			rotateRequestPO.setRotationAction(rotationAction);
+			JSONObject jsonObject = new JSONObject();
+			jsonObject.put("vertical_move",rotationAction.getVerticalMove());
+			jsonObject.put("horizontal_move",rotationAction.getHorizontalMove());
+			rotateRequestPO.setRotationAction(jsonObject);
 			redisPublishService.sendJsonMessage(RedisQueueConstant.SET_CACHE_REQUEST_QUEUE,rotateRequestPO);
-
-
 			redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(rotateRequestPO));
 			NormalReply.Builder builder = NormalReply.newBuilder();
 			builder.setCode(200);
@@ -268,11 +272,56 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			moveRequestPO.setAction_type(action_type);
 			moveRequestPO.setTrace_id(trace_id);
 			moveRequestPO.setUser_id(user_id);
-			moveRequestPO.setClicking_action(clicking_action);
-			moveRequestPO.setClicking_state(clicking_state);
-			redisPublishService.sendJsonMessage(RedisQueueConstant.SET_CACHE_REQUEST_QUEUE,moveRequestPO);
-
 
+			JSONObject json_clicking_action = new JSONObject();
+
+			JSONObject json_clicking_point = new JSONObject();
+			json_clicking_point.put("x",clicking_action.getClickingPoint().getX());
+			json_clicking_point.put("y",clicking_action.getClickingPoint().getY());
+			json_clicking_point.put("z",clicking_action.getClickingPoint().getZ());
+
+			json_clicking_action.put("clicking_point", json_clicking_point);
+			json_clicking_action.put("clicking_type",clicking_action.getClickingType());
+			json_clicking_action.put("extra",clicking_action.getExtra());
+			json_clicking_action.put("attitude",clicking_action.getAttitude());
+			moveRequestPO.setClicking_action(json_clicking_action);
+
+			JSONObject json_clicking_state = new JSONObject();
+
+			JSONObject json_player = new JSONObject();
+			JSONObject json_player_position = new JSONObject();
+			json_player_position.put("x",clicking_state.getPlayer().getPosition().getX());
+			json_player_position.put("y",clicking_state.getPlayer().getPosition().getY());
+			json_player_position.put("z",clicking_state.getPlayer().getPosition().getZ());
+			JSONObject json_player_angle = new JSONObject();
+			json_player_angle.put("yaw",clicking_state.getPlayer().getAngle().getYaw());
+			json_player_angle.put("pitch",clicking_state.getPlayer().getAngle().getPitch());
+			json_player_angle.put("roll",clicking_state.getPlayer().getAngle().getRoll());
+			json_player.put("position",json_player_position);
+			json_player.put("angle",json_player_angle);
+			json_clicking_state.put("player",json_player);
+
+			JSONObject json_camera = new JSONObject();
+			JSONObject json_camera_position = new JSONObject();
+			json_camera_position.put("x",clicking_state.getPlayer().getPosition().getX());
+			json_camera_position.put("y",clicking_state.getPlayer().getPosition().getY());
+			json_camera_position.put("z",clicking_state.getPlayer().getPosition().getZ());
+			JSONObject json_camera_angle = new JSONObject();
+			json_camera_angle.put("yaw",clicking_state.getPlayer().getAngle().getYaw());
+			json_camera_angle.put("pitch",clicking_state.getPlayer().getAngle().getPitch());
+			json_camera_angle.put("roll",clicking_state.getPlayer().getAngle().getRoll());
+			json_camera.put("position",json_camera_position);
+			json_camera.put("angle",json_camera_angle);
+			json_clicking_state.put("camera",json_camera);
+
+			JSONObject json_cameraCenter = new JSONObject();
+			json_cameraCenter.put("x",clicking_state.getCameraCenter().getX());
+			json_cameraCenter.put("y",clicking_state.getCameraCenter().getY());
+			json_cameraCenter.put("z",clicking_state.getCameraCenter().getZ());
+			json_clicking_state.put("cameraCenter",json_cameraCenter);
+
+			moveRequestPO.setClicking_state(json_clicking_state);
+			redisPublishService.sendJsonMessage(RedisQueueConstant.SET_CACHE_REQUEST_QUEUE,moveRequestPO);
 			redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(moveRequestPO));
 
 			/*
@@ -408,7 +457,7 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			joystickPO.setTrace_id(trace_id);
 			joystickPO.setUser_id(user_id);
 			joystickPO.setPacket_id(packet_id);
-			joystickPO.setDirAction(dirAction);
+			//joystickPO.setDirAction(dirAction);
 			redisPublishService.sendJsonMessage(RedisQueueConstant.SET_CACHE_REQUEST_QUEUE,joystickPO);
 
 

+ 104 - 4
src/main/java/com/fdkk/fdkkmeta/redis/impl/RedisSubscribeServiceImpl.java

@@ -4,15 +4,14 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkk.fdkkmeta.config.MetaConfig;
+import com.fdkk.fdkkmeta.domain.dto.RouteDto;
 import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
 import com.fdkk.fdkkmeta.domain.po.ActionPO;
 import com.fdkk.fdkkmeta.domain.po.AnglePO;
-import com.fdkk.fdkkmeta.grpc.DirAction;
-import com.fdkk.fdkkmeta.grpc.JoystickRequest;
-import com.fdkk.fdkkmeta.grpc.RotateRequest;
-import com.fdkk.fdkkmeta.grpc.RotationAction;
+import com.fdkk.fdkkmeta.domain.po.PointPO;
+import com.fdkk.fdkkmeta.grpc.*;
 import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
 import com.fdkk.fdkkmeta.redis.RedisCache;
 import com.fdkk.fdkkmeta.redis.RedisSubscribeService;
@@ -21,6 +20,7 @@ import com.fdkk.fdkkmeta.service.MoveFrameService;
 import com.fdkk.fdkkmeta.service.RotateFrameService;
 import com.fdkk.fdkkmeta.service.UserService;
 import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
+import com.fdkk.fdkkmeta.util.kesar.GetRoute;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.connection.Message;
@@ -28,6 +28,7 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Nullable;
+import java.io.File;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -67,7 +68,106 @@ public class RedisSubscribeServiceImpl  implements RedisSubscribeService {
         }
         log.info("订阅频道:rotateMessage消息:{}", message);
         ActionPO actionPO = JSON.toJavaObject(JSON.parseObject(message), ActionPO.class);
+        int actionType = actionPO.getAction_type();
+        JSONObject userInfo = redisCache.getCacheObject("UserState:"+actionPO.getUser_id());
+        //漫游
+        if(actionType == 1){
 
+        }
+        //旋转镜头
+        else if(actionType == 1014){
+            addToFrameForRotate( actionPO, userInfo);
+        }
+        //操作杆
+        else if(actionType == 15){
+
+        }
+    }
+
+    private void addToFrameForRotate(ActionPO actionPO,JSONObject userInfo){
+        int action_type = actionPO.getAction_type();
+        String user_id = actionPO.getUser_id();
+        String trace_id = actionPO.getTrace_id();
+        JSONObject rotationAction = actionPO.getRotationAction();
+        long frameId = userInfo.getLong("frameId");
+        long breakPointId = userInfo.getLong("breakPointId");
+        RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(frameId);
+
+        double horizontalMove = userInfo.getDouble("horizontalMove");
+        if(rotationAction.getDouble("horizontal_move") !=0){
+            log.info("test");
+        }
+        horizontalMove += rotationAction.getDouble("horizontal_move");
+        double hAngle = horizontalMove * 90;
+        String traceIds = userInfo.getString("traceIds");
+        traceIds +=";"+trace_id;
+        log.info("旋转的角度:"+hAngle+",旋转距离:"+rotationAction.getDouble("horizontal_move")+",积累的距离:"+horizontalMove);
+        int offFrameIndex = (int)Math.ceil(hAngle);
+        if(Math.abs(offFrameIndex)<1){
+            userInfo.put("horizontalMove",horizontalMove);
+            userInfo.put("traceIds",traceIds);
+            //redis中写入用户状态信息
+            redisCache.setCacheObject("UserState:"+user_id,userInfo);
+            log.info("没有旋转,更新了redis的UserState表");
+            return;
+        }
+        else{
+            userInfo.put("traceIds","");
+            userInfo.put("horizontalMove",0);
+        }
+        int currentFrame = rotateFrameEntity.getFrameIndex();      //从数据库里读取
+        currentFrame +=offFrameIndex;
+        if(currentFrame<0){
+            currentFrame+=360;
+        }
+        else{
+            currentFrame = currentFrame % 359;
+        }
+
+        rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(userInfo.getString("appId"),userInfo.getLong("breakPointId"),currentFrame);
+        //redis中写入用户状态信息
+        userInfo.put("frameId",rotateFrameEntity.getId());
+        redisCache.setCacheObject("UserState:"+user_id,userInfo);
+        sceneGrpcService.setRotate( userInfo,  actionPO);
+    }
+
+    private void addToFrameForMove(ActionPO actionPO,JSONObject userInfo){
+        String user_id = actionPO.getUser_id();
+        String trace_id = actionPO.getTrace_id();
+        JSONObject clicking_action = actionPO.getClicking_action();
+
+        long frameId = userInfo.getLong("frameId");
+        long breakPointId = userInfo.getLong("breakPointId");
+
+        BreakpointsEntity currentBreakpointsEntity = breakpointsService.getById(breakPointId);
+        JSONObject end = clicking_action.getJSONObject("clicking_point");
+        //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(frameId);
+        //计算路径
+        RouteDto po=new RouteDto();
+                                                                                //PointPO s= user.getPlayerPosition();
+        PointPO s= userInfo.getObject("playerPosition",PointPO.class);
+        PointPO e=new PointPO();
+        e.setX(Double.parseDouble(end.getString("x")));
+        e.setY(Double.parseDouble(end.getString("y")));
+        e.setZ(Double.parseDouble(end.getString("z")));
+        po.setE_location(e);
+        po.setS_location(s);
+        po.setSceneCode(userInfo.getString("appId"));
+        JSONArray path = new JSONArray();
+        JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +userInfo.getString("appId")+"_target_freespace.json", po);
+
+        ActionPO movePO = new ActionPO();
+        if (maps!=null&&maps.size()>=2){
+            for(int i=0;i< maps.size();++i){
+                Long _breakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(i)).toString()).getLong("id");
+                path.add(_breakPointId);
+                //旋转矫正
+                if(i == 1){
+                    //旋转矫正:不仅存入redis,而且返回矫正后的角度
+                    sceneGrpcService.setRotateForMove(userInfo,actionPO);
+                }
+            }
+        }
     }
 //    public void rotateMessage(String message) {
 //        if (Objects.isNull(message)) {