xushiting 3 년 전
부모
커밋
ead27ab9bb

+ 29 - 0
src/main/java/com/fdkk/fdkkmeta/domain/po/ActionPO.java

@@ -0,0 +1,29 @@
+package com.fdkk.fdkkmeta.domain.po;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkk.fdkkmeta.grpc.ClickingAction;
+import com.fdkk.fdkkmeta.grpc.State;
+import lombok.Data;
+
+@Data
+public class ActionPO {
+    private int action_type;   //1,1014,15;
+    //private ClickingAction clicking_action;
+    //private State clicking_state;
+
+    private int playerAngle;
+    private int moveAngle;
+    private String trace_id;
+    private String user_id;
+    private JSONArray path;
+//    private boolean isMoving = false;
+//    private boolean isRotated = false;
+
+    private long frameId = 0;
+    private int frameIndex = 0;
+    //private JSONObject rotation_action = new JSONObject();
+    //private JSONObject dir_action = new JSONObject();
+
+    String packet_id = null;
+}

+ 148 - 27
src/main/java/com/fdkk/fdkkmeta/grpcService/sceneGrpcServer.java

@@ -7,6 +7,8 @@ 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.MoveFrameEntity;
+import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
 import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
 import com.fdkk.fdkkmeta.domain.po.*;
 import com.fdkk.fdkkmeta.grpc.*;
@@ -203,6 +205,9 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
             userService.save(userEntity);
 			//todo 存入redis
 			//redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
+			JSONObject myState = new JSONObject();
+			myState.put("isMoving",0);
+			redisCache.setCacheObject("UserState:"+userEntity.getUserId(),myState);
 
 			NormalReply.Builder builder = NormalReply.newBuilder();
 			builder.setCode(1);
@@ -230,23 +235,40 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
     			"user_id":"0a3987974feb4"
     		}
     		*/
-			RotatePO rotateRequestPO = new RotatePO();
+			ActionPO rotateRequestPO = new ActionPO();
 
     		int action_type = request.getActionType();
     		String trace_id = request.getTraceId();
     		String user_id = request.getUserId();
     		RotationAction rotationAction = request.getRotationAction();
 
+			UserEntity user = userService.findUserId(user_id);
+			RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
+
 			JSONObject rotation_action = new JSONObject();
-			rotation_action.put("vertical_move",rotationAction.getVerticalMove());
-			rotation_action.put("horizontal_move",rotationAction.getHorizontalMove());
+//			rotation_action.put("vertical_move",rotationAction.getVerticalMove());
+//			rotation_action.put("horizontal_move",rotationAction.getHorizontalMove());
 
 			rotateRequestPO.setAction_type(action_type);
-			rotateRequestPO.setRotation_action(rotation_action);
+			//rotateRequestPO.setRotation_action(rotation_action);
 			rotateRequestPO.setTrace_id(trace_id);
 			rotateRequestPO.setUser_id(user_id);
-			//redisCache.setCacheObject("setCacheRequest:"+user_id,rotateRequestPO);
-			redisCache.setCacheList("setCacheRequest:rotate:"+user_id, Arrays.asList(rotateRequestPO));
+
+			double hAngle = rotationAction.getHorizontalMove() * 90;
+			int offFrameIndex = (int)Math.ceil(hAngle);
+			int currentFrame = rotateFrameEntity.getFrameIndex();      //从数据库里读取
+			currentFrame +=offFrameIndex;
+			if(currentFrame<0){
+				currentFrame+=360;
+			}
+			else{
+				currentFrame = currentFrame % 359;
+			}
+
+			rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user_id,user.getBreakPointId(),currentFrame);
+			rotateRequestPO.setFrameId(rotateFrameEntity.getId());
+			//每次存一帧
+			redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(rotateRequestPO));
 			/*
     		//这三个变量从user表和rotateframe表里取
             UserEntity user = userService.findUserId(user_id);
@@ -428,18 +450,18 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 	@Override
 	public void move(MoveRequest request, StreamObserver<NormalReply> responseObserver){
 		try{
-			int action_type= request.getActionType();
+			//int action_type= request.getActionType();
 			ClickingAction clicking_action = request.getClickingAction();
-			State clicking_state = request.getClickingState();
+			//State clicking_state = request.getClickingState();
 			String trace_id = request.getTraceId();
 			String user_id = request.getUserId();
 
 			UserEntity user = userService.findUserId(user_id);
 			String appId = user.getAppId();
-			//Long breakPointId = user.getBreakPointId();
+			Long breakPointId = user.getBreakPointId();
 			//BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,breakPointId);
 			Point end = clicking_action.getClickingPoint();
-			//RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
+			RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
 			//计算路径
 			RouteDto po=new RouteDto();
 			PointPO s= user.getPlayerPosition();
@@ -453,20 +475,50 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			JSONArray path = new JSONArray();
 
 			JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
+
+			ActionPO movePO = new ActionPO();
+
 			if (maps!=null&&maps.size()>=2){
-				Long nextbreakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(1)).toString()).getLong("id");
-				path.add(nextbreakPointId);
-			}
+				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){
+						AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
+//						int angle = cameraAnglePO.getYaw();
+//						int offAngle = 0;
+//						offAngle = angle%45;
+
+//						if(offAngle>45-offAngle) {
+//							offAngle = 45-offAngle;
+//						}
+//						else {
+//							offAngle = -1*offAngle;
+//						}
+						//先简单来,就累加
+						//存储矫正的一组帧
+//						for(int j=0;j<offAngle;++j){
+//							ActionPO rotateRequestPO = new ActionPO();
+//							rotateRequestPO.setAction_type(1014);
+//							rotateRequestPO.setTrace_id(trace_id);
+//							rotateRequestPO.setUser_id(user_id);
+//							RotateFrameEntity _rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),user.getBreakPointId(),angle+j);
+//							rotateRequestPO.setFrameId(_rotateFrameEntity.getId());
+//							redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(rotateRequestPO));
+//						}
+						int angle = setRotateForMove( user, trace_id, cameraAnglePO.getYaw());
+						movePO.setPlayerAngle(angle);
+					}
+				}
+
 
-			MovePO movePO = new MovePO();
-			movePO.setAction_type(action_type);
-			movePO.setClicking_action(clicking_action);
-			movePO.setClicking_state(clicking_state);
-			movePO.setTrace_id(trace_id);
-			movePO.setUser_id(user_id);
-			movePO.setPath(path);
+				movePO.setAction_type(1);
+				movePO.setTrace_id(trace_id);
+				movePO.setUser_id(user_id);
+				movePO.setPath(path);
+				redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
+			}
 
-			redisCache.setCacheList("setCacheRequest:move:"+user_id, Arrays.asList(movePO));
 			NormalReply.Builder builder = NormalReply.newBuilder();
 			builder.setCode(1);
 			responseObserver.onNext(builder.build());
@@ -477,6 +529,31 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			//builder.setCode(0);
 		}
 	}
+
+	private int setRotateForMove(UserEntity user,String trace_id,int angle){
+		int offAngle = 0;
+		offAngle = angle%45;
+
+//						if(offAngle>45-offAngle) {
+//							offAngle = 45-offAngle;
+//						}
+//						else {
+//							offAngle = -1*offAngle;
+//						}
+		//先简单来,就累加
+		//存储矫正的一组帧
+		offAngle = Math.abs(45 - offAngle);
+		for(int j=0;j<offAngle;++j){
+			ActionPO rotateRequestPO = new ActionPO();
+			rotateRequestPO.setAction_type(1014);
+			rotateRequestPO.setTrace_id(trace_id);
+			rotateRequestPO.setUser_id(user.getUserId());
+			RotateFrameEntity _rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),user.getBreakPointId(),angle+j);
+			rotateRequestPO.setFrameId(_rotateFrameEntity.getId());
+			redisCache.setCacheList("setCacheRequest:"+user.getUserId(), Arrays.asList(rotateRequestPO));
+		}
+		return (angle+offAngle)%360;
+	}
 	/*
     //返回的是角度矫正数据
     @Override
@@ -791,17 +868,61 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
      		String user_id = request.getUserId();
      		String packet_id = request.getPacketId();
 
-			JoystickPO joystickPO = new JoystickPO();
+			//JoystickPO joystickPO = new JoystickPO();
+			ActionPO joystickPO = new ActionPO();
 			joystickPO.setAction_type(actionType);
-			JSONObject dir_action = new JSONObject();
-			dir_action.put("move_angle",dirAction.getMoveAngle());
-			dir_action.put("speed_level",dirAction.getSpeedLevel());
-			joystickPO.setDir_action(dir_action);
+			//JSONObject dir_action = new JSONObject();
+			//dir_action.put("move_angle",dirAction.getMoveAngle());
+			//dir_action.put("speed_level",dirAction.getSpeedLevel());
+			//joystickPO.setDir_action(dir_action);
 			joystickPO.setTrace_id(trace_id);
 			joystickPO.setUser_id(user_id);
 			joystickPO.setPacket_id(packet_id);
+			joystickPO.setPlayerAngle(dirAction.getMoveAngle());
+			redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(joystickPO));
+
+			if(dirAction.getSpeedLevel()<7){
+				return;
+			}
+
+			UserEntity user = userService.findUserId(user_id);
+			//邻居点里找角度最合适的点
+			BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), user.getBreakPointId());
+			BreakpointsEntity targetBreakpointsEntity = null;
+			List<Integer> neighBreakPointIds = breakpointsEntity.getContact();
+			PointPO playerPosition = breakpointsEntity.getPosition();
+			PointPO temp = new PointPO();
+			temp.setX(playerPosition.getX()+1);
+			temp.setY(playerPosition.getY());
+			temp.setZ(playerPosition.getZ());
+			double offAngle = 1000;
+			double moveAngle = dirAction.getMoveAngle();
+
+			if(neighBreakPointIds.size()>0){
+				for(int j=0;j<neighBreakPointIds.size();++j){
+					BreakpointsEntity _breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), (long)neighBreakPointIds.get(j));
+					double angle = sceneGrpcService.calAngle(playerPosition, temp, _breakpointsEntity.getPosition());
+					if(Math.abs(angle - moveAngle)<offAngle){
+						offAngle = Math.abs(angle - moveAngle);
+						targetBreakpointsEntity = _breakpointsEntity;
+					}
+				}
+				RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
+				AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
+				int angle = setRotateForMove( user, trace_id,cameraAnglePO.getYaw());
+
+				JSONArray path = new JSONArray();
+				path.add(user.getBreakPointId());
+				path.add(targetBreakpointsEntity.getBreakPointId());
+				ActionPO movePO = new ActionPO();
+				movePO.setAction_type(1);
+				movePO.setTrace_id(trace_id);
+				movePO.setUser_id(user_id);
+				movePO.setPath(path);
+				movePO.setMoveAngle(angle);
+				redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
+			}
 
-			redisCache.setCacheList("setCacheRequest:joystick:"+user_id, Arrays.asList(joystickPO));
 			//redisCache.setCacheObject("setCacheRequest:"+user_id,joystickPO);
      		//UserEntity user = userService.findUserId(user_id);
      		//Long breakPointId = user.getBreakPointId();

+ 2 - 0
src/main/java/com/fdkk/fdkkmeta/service/MoveFrameService.java

@@ -11,4 +11,6 @@ import java.util.List;
 public interface MoveFrameService extends IBaseService<MoveFrameEntity> {
     List<MoveFrameEntity> findByAppId(String AppId);
     List<MoveFrameEntity> findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle(String appId,Long startBreakPointId,Long endBreakPointId,Integer angle);
+
+    MoveFrameEntity findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(String appId,Long startBreakPointId,Long endBreakPointId,Integer angle,int frameIndex);
 }

+ 10 - 1
src/main/java/com/fdkk/fdkkmeta/service/impl/MoveFrameServiceImpl.java

@@ -35,5 +35,14 @@ public class MoveFrameServiceImpl extends BaseServiceImpl<MoveFramesMapper, Move
         return list(wrapper);
     }
 
-
+    @Override
+    public MoveFrameEntity findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(String appId,Long startBreakPointId,Long endBreakPointId,Integer angle,int frameIndex){
+        LambdaQueryWrapper<MoveFrameEntity> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(MoveFrameEntity::getAppId, appId);
+        wrapper.eq(MoveFrameEntity::getStartBreakPointId, startBreakPointId);
+        wrapper.eq(MoveFrameEntity::getEndBreakPointId, endBreakPointId);
+        wrapper.eq(MoveFrameEntity::getAngle, angle);
+        wrapper.eq(MoveFrameEntity::getFrameIndex, frameIndex);
+        return getOne(wrapper);
+    }
 }

+ 281 - 62
src/main/java/com/fdkk/fdkkmeta/task/UpdateFrameMetaTask.java

@@ -22,6 +22,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -55,73 +56,215 @@ public class UpdateFrameMetaTask {
                userEntity -> {
                    //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
 //                   redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
-                   String userId = userEntity.getUserId();
-                   handle( userId);
+                   List<ActionPO> list = redisCache.getCacheList("setCacheRequest"+userEntity.getUserId());
+                   handle( userEntity,list);
                }
        );
 
    }
 
-   
-   private void handle(String userId){
-       List<MovePO> list = redisCache.getCacheList("setCacheRequest:move:"+userId);
-       if(list.size() == 0){
-           createMetaDataForRotate(userId);
-           createMetaDataForJoystick(userId);
-       }
-       else{
-           MovePO movePO = list.get(0);
-           UserEntity user = userService.findUserId(userId);
-           //true表示可以过渡了,false表示需要继续旋转
-           boolean flag = movePO.isRotated();
-           if(!flag){
-               boolean flag_rotated = rotateForMove( user, movePO);
-               if(flag_rotated) {
-                   //矫正完成
-                   movePO.setRotated(true);
-               }
-               //设置
-               /*********************************************************************************************/
-               //redisCache.setCacheList("setCacheRequest:move:"+userId, Arrays.asList(movePO));
-               return;
-           }
-           //可以过渡了
-           else {
-               flag = movePO.isMoving();
-               //打断
-               if(list.size()>1){
-                   //删除第一个元素
-                   /*********************************************************************************************/
-                   return;
-               }
-               //还没开始过渡,只是打算过渡
-               if(!flag) {
-                   flag = createMetaDataForRotate(userId);
-                   if(!flag){
-                       flag = createMetaDataForJoystick(userId);
-                   }
-                   if(!flag){
-                       //开始过渡
-                       movePO.setMoving(true);
-                       //过渡中
-                       /*********************************************************************************************/
-                   }
-                   //有旋转/操作的动作,所以打断了过渡
-                   else{
-                       //删除第一个元素
-                       /*********************************************************************************************/
-                       return;
-                   }
-               }
-               else{
-                   //开始过渡
-                   movePO.setMoving(true);
-                   //过渡中
-                   /*********************************************************************************************/
-               }
-           }
-       }
-   }
+    private void handle(UserEntity user,List<ActionPO> list){
+
+        if(list.size() == 0){
+            //写入一个默认数据到redis里
+            createDefaultFrameMetadata( user);
+            return;
+        }
+
+        List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
+        JSONObject myState = redisCache.getCacheObject("UserState"+user.getUserId());
+
+        ActionPO _actionPO = list.get(0);
+        int firstActionType = _actionPO.getAction_type();
+
+        if(firstActionType == 1014||firstActionType == 15){
+            rotateJoystickList.add(_actionPO);
+        }
+        else if(firstActionType == 1){
+            JSONArray path = _actionPO.getPath();
+            long startBreakPointId = path.getLongValue(0);
+            long endBreakPointId = path.getLongValue(1);
+            //过渡
+            if(myState.getIntValue("isMoving") == 1){
+                MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
+                if(moveFrameEntity==null){
+                    path.remove(0);
+                    //过渡下一段
+                    if(path.size()>1){
+                        startBreakPointId = endBreakPointId;
+                        endBreakPointId = path.getLongValue(1);
+                        _actionPO.setPath(path);
+                        _actionPO.setFrameIndex(0);
+                        moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
+                    }
+                    //过渡全部结束
+                    else{
+                        //删除redis里的数据
+                        //更新user表
+                        myState.put("isMoving",0);
+                        redisCache.setCacheObject("UserState"+user.getUserId(),myState);
+                        //执行下一条记录
+                        list.remove(0);
+                        handle( user,list);
+                        return ;
+                    }
+                }
+                //更新
+                createMoveFrameMetadata( user, moveFrameEntity,_actionPO.getTrace_id());
+                _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
+                //更新redis里的数据
+                //更新user表
+            }
+            else if(myState.getIntValue("isMoving") == 0){
+                if(list.size()>0){
+                    //中断
+                    //执行下一条记录
+                    list.remove(0);
+                    handle( user,list);
+                    return ;
+                }
+                else{
+                    //过渡
+                    myState.put("isMoving",1);
+                    redisCache.setCacheObject("UserState"+user.getUserId(),myState);
+                    MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
+                    //更新
+                    createMoveFrameMetadata( user, moveFrameEntity,_actionPO.getTrace_id());
+                    _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
+                    //更新redis里的数据
+                    //更新user表
+                }
+            }
+            /****************************************************************************************/
+            return;
+        }
+
+        for(int i=1;i<list.size();++i){
+            ActionPO actionPO = list.get(i);
+            if(firstActionType != actionPO.getAction_type()){
+                break;
+            }
+            //旋转
+            if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
+                rotateJoystickList.add(actionPO);
+                continue;
+            }
+        }
+
+        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 == 1014){
+            playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+        }
+        else if(firstActionType == 15){
+            playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(lastActionPO.getPlayerAngle()).setRoll(playerAngle.getRoll()).build();
+        }
+        Space player = sceneGrpcService.createSpace(playerPt,playerAg);
+
+        PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
+        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);
+
+        MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
+        metaDataFramePO.setTraceIds(traceIds);
+        metaDataFramePO.setVehicle(null);
+        State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
+
+        RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
+        UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
+
+        //newUserStates
+        JSONArray newUserStates = new JSONArray();
+        newUserStates.add(userState);
+        metaDataFramePO.setNewUserStates(newUserStates);
+        metaDataFramePO.setActionResponses(actionResponses);
+        metaDataFramePO.setGetStateType(0);
+        metaDataFramePO.setCode(0);
+        metaDataFramePO.setMsg("");
+
+        redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
+
+        //删除redis里的数据
+        //更新user表
+    }
+
+//   
+//   private void handle(String userId){
+//       List<MovePO> list = redisCache.getCacheList("setCacheRequest:move:"+userId);
+//       if(list.size() == 0){
+//           createMetaDataForRotate(userId);
+//           createMetaDataForJoystick(userId);
+//       }
+//       else{
+//           MovePO movePO = list.get(0);
+//           UserEntity user = userService.findUserId(userId);
+//           //true表示可以过渡了,false表示需要继续旋转
+//           boolean flag = movePO.isRotated();
+//           if(!flag){
+//               boolean flag_rotated = rotateForMove( user, movePO);
+//               if(flag_rotated) {
+//                   //矫正完成
+//                   movePO.setRotated(true);
+//               }
+//               //设置
+//               /*********************************************************************************************/
+//               //redisCache.setCacheList("setCacheRequest:move:"+userId, Arrays.asList(movePO));
+//               return;
+//           }
+//           //可以过渡了
+//           else {
+//               flag = movePO.isMoving();
+//               //打断
+//               if(list.size()>1){
+//                   //删除第一个元素
+//                   /*********************************************************************************************/
+//                   return;
+//               }
+//               //还没开始过渡,只是打算过渡
+//               if(!flag) {
+//                   flag = createMetaDataForRotate(userId);
+//                   if(!flag){
+//                       flag = createMetaDataForJoystick(userId);
+//                   }
+//                   if(!flag){
+//                       //开始过渡
+//                       movePO.setMoving(true);
+//                       //过渡中
+//                       /*********************************************************************************************/
+//                   }
+//                   //有旋转/操作的动作,所以打断了过渡
+//                   else{
+//                       //删除第一个元素
+//                       /*********************************************************************************************/
+//                       return;
+//                   }
+//               }
+//               else{
+//                   //开始过渡
+//                   movePO.setMoving(true);
+//                   //过渡中
+//                   /*********************************************************************************************/
+//               }
+//           }
+//       }
+//   }
 
    private boolean createMetaDataForRotate(String userId){
        List<RotatePO> list = redisCache.getCacheList("setCacheRequest:rotate:"+userId);
@@ -432,6 +575,82 @@ public class UpdateFrameMetaTask {
          result.put("cameraCenters",cameraCenters);
          return result;
     }
+
+    private void createDefaultFrameMetadata(UserEntity user){
+        String[] traceIds = new String[1];
+        traceIds[0] = "";
+        JSONArray actionResponses = new JSONArray();
+
+        RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.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 =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+        Space player = sceneGrpcService.createSpace(playerPt,playerAg);
+
+        PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
+        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);
+
+        MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
+        metaDataFramePO.setTraceIds(traceIds);
+        metaDataFramePO.setVehicle(null);
+        State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
+
+        RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
+        UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
+
+        //newUserStates
+        JSONArray newUserStates = new JSONArray();
+        newUserStates.add(userState);
+        metaDataFramePO.setNewUserStates(newUserStates);
+        metaDataFramePO.setActionResponses(actionResponses);
+        metaDataFramePO.setGetStateType(0);
+        metaDataFramePO.setCode(0);
+        metaDataFramePO.setMsg("");
+
+        redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
+    }
+
+    private void createMoveFrameMetadata(UserEntity user,MoveFrameEntity moveFrameEntity,String traceId){
+        String[] traceIds = new String[1];
+        traceIds[0] = traceId;
+        JSONArray actionResponses = new JSONArray();
+
+        //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.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 =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
+        Space player = sceneGrpcService.createSpace(playerPt,playerAg);
+
+        PointPO cameraPoint = moveFrameEntity.getCameraPosition();
+        Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
+        AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
+        AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
+        Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
+
+        MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
+        metaDataFramePO.setTraceIds(traceIds);
+        metaDataFramePO.setVehicle(null);
+        State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
+
+        RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
+        UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
+
+        //newUserStates
+        JSONArray newUserStates = new JSONArray();
+        newUserStates.add(userState);
+        metaDataFramePO.setNewUserStates(newUserStates);
+        metaDataFramePO.setActionResponses(actionResponses);
+        metaDataFramePO.setGetStateType(0);
+        metaDataFramePO.setCode(0);
+        metaDataFramePO.setMsg("");
+
+        redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
+    }
    /*
    * {
         "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],