xushiting 3 years ago
parent
commit
d993e0be0e

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

@@ -156,14 +156,21 @@ public class DevController   {
     }
 
     @PostMapping("redis")
-    public void testredis(){
+    public void testredis(String userId,Object value){
         redisCache.pfremove("setCacheRequest:rotate:"+1);
         redisCache.setCacheList("setCacheRequest:rotate:"+1, Arrays.asList(1));
         redisCache.setCacheList("setCacheRequest:rotate:"+1, Arrays.asList(2));
         redisCache.setCacheList("setCacheRequest:rotate:"+1, Arrays.asList(3));
 
         List<Object> cacheList = redisCache.getCacheList("setCacheRequest:rotate:" + 1);
+        if(cacheList == null || cacheList.size()==0){
+            redisCache.setCacheList("setCacheRequest:rotate:"+userId, Arrays.asList(value));
+        }
+        else{
+            redisCache.setCacheList("setCacheRequest:rotate:"+userId, Arrays.asList(value));
+        }
         redisCache.lRemove("setCacheRequest:rotate:"+1,0,2);
+        redisCache.delete("setCacheRequest:rotate:"+userId);
         List<Object> cacheList1 = redisCache.getCacheList("setCacheRequest:rotate:" + 1);
 
         System.out.println(cacheList);

+ 12 - 0
src/main/java/com/fdkk/fdkkmeta/domain/po/MetaDataFramePO.java

@@ -1,4 +1,16 @@
 package com.fdkk.fdkkmeta.domain.po;
 
+import com.alibaba.fastjson.JSONArray;
+import com.fdkk.fdkkmeta.grpc.UserState;
+import lombok.Data;
+
+@Data
 public class MetaDataFramePO {
+    private String[] traceIds;
+    private String vehicle = null;
+    private JSONArray newUserStates;
+    private JSONArray actionResponses;
+    private int getStateType = 0;
+    private int code = 0;
+    private String msg = "OK";
 }

+ 1 - 1
src/main/java/com/fdkk/fdkkmeta/domain/po/RotateRequestPO.java

@@ -4,7 +4,7 @@ import lombok.Data;
 import com.alibaba.fastjson.JSONObject;
 
 @Data
-public class RotateRequestPO {
+public class RotatePO {
       		/*
     		{
     			"action_type":1014,

+ 23 - 0
src/main/java/com/fdkk/fdkkmeta/grpcService/SceneGrpcService.java

@@ -0,0 +1,23 @@
+package com.fdkk.fdkkmeta.grpcService;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkk.fdkkmeta.domain.po.PointPO;
+import com.fdkk.fdkkmeta.grpc.*;
+
+public interface SceneGrpcService {
+    int test(int a);
+
+    UserState createUserState(String user_id, State state, RenderInfo renderInfo, Event event);
+
+    State createPlayerState(JSONObject userInfo);
+    State createPlayerState2(Space player,Space camera,Point cameraCenter);
+
+    JSONObject createActionResponse(int actionType,String traceId);
+
+    RenderInfo createRenderInfo();
+    Event createEvent();
+    Space createSpace(Point position, AngleUe4 angle);
+    Point createPoint(String x,String y,String z);
+    AngleUe4 createAngle(int pitch,int yaw,int roll);
+    double calAngle(PointPO o, PointPO s, PointPO e);
+}

+ 182 - 0
src/main/java/com/fdkk/fdkkmeta/grpcService/SceneGrpcServiceImpl.java

@@ -0,0 +1,182 @@
+package com.fdkk.fdkkmeta.grpcService;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkk.fdkkmeta.domain.po.PointPO;
+import com.fdkk.fdkkmeta.grpc.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class SceneGrpcServiceImpl implements SceneGrpcService {
+    @Override
+    public int test(int a){
+        return 0;
+    }
+
+    @Override
+    public UserState createUserState(String user_id, State state, RenderInfo renderInfo, Event event) {
+        UserState userState = UserState.newBuilder()
+                .setUserId(user_id)
+                .setPlayerState(state)
+                .setRenderInfo(renderInfo)
+                .setEvent(event)
+                .setRelation(1)
+                .build();
+        return userState;
+    }
+
+    @Override
+    public State createPlayerState(JSONObject userInfo) {
+        State.Builder builder = State.newBuilder();
+        builder.setRoomTypeId(userInfo.getString("roomTypeId"));
+        builder.setPerson(0);
+        builder.setAvatarId(userInfo.getString("avatarId"));
+        builder.setSkinId(userInfo.getString("skinId"));
+        builder.setRoomId(userInfo.getString("roomId"));
+        builder.setIsHost(false);
+        builder.setIsFollowHost(false);
+        builder.setSkinDataVersion(userInfo.getString("skinDataVersion"));
+        builder.setAvatarComponents("");
+        builder.setNickName(userInfo.getString("nickName"));
+        builder.setMovingMode(0);
+        builder.setAttitude("walk");
+        builder.setAreaName("");
+        builder.setPathName("thirdwalk");
+        builder.setPathId("thirdwalk");
+        builder.setAvatarSize(1);
+        if(userInfo.get("extra") != null){
+            builder.setExtra((Extra)userInfo.get("extra"));
+        }
+        builder.setPrioritySync(false);
+        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"));
+        }
+        return builder.build();
+    }
+
+    @Override
+    public State createPlayerState2(Space player,Space camera,Point cameraCenter){
+        State.Builder builder = State.newBuilder();
+        builder.setRoomTypeId("");
+        builder.setPerson(0);
+        builder.setAvatarId("");
+        builder.setSkinId("");
+        builder.setRoomId("");
+        builder.setIsHost(false);
+        builder.setIsFollowHost(false);
+        builder.setSkinDataVersion("");
+        builder.setAvatarComponents("");
+        builder.setNickName("");
+        builder.setMovingMode(0);
+        builder.setAttitude("");
+        builder.setAreaName("");
+        builder.setPathName("");
+        builder.setPathId("");
+        builder.setAvatarSize(1);
+        builder.setPrioritySync(false);
+        builder.setPlayer(player);
+        builder.setCamera(camera);
+        builder.setCameraCenter(cameraCenter);
+        return builder.build();
+    }
+
+    @Override
+    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","");
+        return actionResponse;
+    }
+
+    @Override
+    public RenderInfo createRenderInfo() {
+        RenderInfo renderInfo = RenderInfo.newBuilder()
+                .setRenderType(0)
+                //.setVideoFrame(null)
+                .setVideoFrame("")
+                .setCameraStateType(0)
+                .setIsMoving(0)
+                .setNeedIfr(0)
+                .setIsVideo(0)
+                .setStillFrame(0)
+                .setIsRotating(0)
+                .setIsFollowing(0)
+                .setClientPanoTreceId("")
+                .setPrefetchVideoId("")
+                .setNoMedia(false).build();
+        return renderInfo;
+    }
+
+    @Override
+    public Event createEvent() {
+        Event event = Event.newBuilder().setId("").setType(0).build();
+        return event;
+    }
+
+    @Override
+    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) {
+        Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
+        return point;
+    }
+
+    @Override
+    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 结束点
+     * @return
+     */
+    @Override
+    public double calAngle(PointPO o, PointPO s, PointPO e) {
+        double cosfi = 0;
+        double fi = 0;
+        double norm = 0;
+        double dsx = s.getX() - o.getX();
+        double dsy = s.getY() - o.getY();
+        double dex = e.getX() - o.getX();
+        double dey = e.getY() - o.getY();
+        cosfi = dsx * dex + dsy * dey;
+        norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
+        cosfi /= Math.sqrt(norm);
+        if (cosfi >= 1.0) return 0;
+        if (cosfi <= -1.0) return Math.PI;
+        fi = Math.acos(cosfi);
+        if (180 * fi / Math.PI < 180) {
+            return 180 * fi / Math.PI;
+        } else {
+            return 360 - 180 * fi / Math.PI;
+        }
+    }
+}

+ 120 - 117
src/main/java/com/fdkk/fdkkmeta/grpcService/sceneGrpcServer.java

@@ -10,7 +10,7 @@ import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
 import com.fdkk.fdkkmeta.domain.po.AnglePO;
 import com.fdkk.fdkkmeta.domain.po.JoystickPO;
 import com.fdkk.fdkkmeta.domain.po.PointPO;
-import com.fdkk.fdkkmeta.domain.po.RotateRequestPO;
+import com.fdkk.fdkkmeta.domain.po.RotatePO;
 import com.fdkk.fdkkmeta.grpc.*;
 import com.fdkk.fdkkmeta.redis.RedisCache;
 import com.fdkk.fdkkmeta.service.BreakpointsService;
@@ -25,6 +25,7 @@ import net.devh.boot.grpc.server.service.GrpcService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -51,7 +52,8 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
     @Autowired
     RedisCache redisCache;
 
-
+	@Autowired
+	SceneGrpcService sceneGrpcService;
     /***
      *     回复 案例
      *    SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
@@ -230,7 +232,7 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
     			"user_id":"0a3987974feb4"
     		}
     		*/
-			RotateRequestPO rotateRequestPO = new RotateRequestPO();
+			RotatePO rotateRequestPO = new RotatePO();
 
     		int action_type = request.getActionType();
     		String trace_id = request.getTraceId();
@@ -246,7 +248,7 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			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));
 			/*
     		//这三个变量从user表和rotateframe表里取
             UserEntity user = userService.findUserId(user_id);
@@ -395,15 +397,14 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 				AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
 				player.setAngle(playerAg);
 				userInfo.put("player",player);
-
 				userInfo.put("camera",null);
 				userInfo.put("cameraCenter",null);
 
-				State playerState = createPlayerState(userInfo);
-				RenderInfo renderInfo = createRenderInfo();
-				Event event = createEvent();
+				State playerState = sceneGrpcService.createPlayerState(userInfo);
+				RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
+				Event event = sceneGrpcService.createEvent();
 
-				UserState userState = createUserState( user.getUserId(), playerState, renderInfo, event);
+				UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, event);
 				builder.addNewUserStates(userState);
 			}
 		}
@@ -737,6 +738,8 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
 			joystickPO.setTrace_id(trace_id);
 			joystickPO.setUser_id(user_id);
 			joystickPO.setPacket_id(packet_id);
+
+			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();
@@ -756,112 +759,112 @@ public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBa
     	}
     }
 
-    private UserState createUserState(String user_id,State state,RenderInfo renderInfo,Event event) {
-    	UserState userState = UserState.newBuilder()
-				.setUserId(user_id)
-				.setPlayerState(state)
-				.setRenderInfo(renderInfo)
-				.setEvent(event)
-				.setRelation(1)
-				.build();
-    	return userState;
-    }
-
-    private State createPlayerState(JSONObject userInfo) {
-		State.Builder builder = State.newBuilder();
-		builder.setRoomTypeId(userInfo.getString("roomTypeId"));
-		builder.setPerson(0);
-		builder.setAvatarId(userInfo.getString("avatarId"));
-		builder.setSkinId(userInfo.getString("skinId"));
-		builder.setRoomId(userInfo.getString("roomId"));
-		builder.setIsHost(false);
-		builder.setIsFollowHost(false);
-		builder.setSkinDataVersion(userInfo.getString("skinDataVersion"));
-		builder.setAvatarComponents("");
-		builder.setNickName(userInfo.getString("nickName"));
-		builder.setMovingMode(0);
-		builder.setAttitude("walk");
-		builder.setAreaName("");
-		builder.setPathName("thirdwalk");
-		builder.setPathId("thirdwalk");
-		builder.setAvatarSize(1);
-		if(userInfo.get("extra") != null){
-			builder.setExtra((Extra)userInfo.get("extra"));
-		}
-		builder.setPrioritySync(false);
-		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"));
-		}
-    	return builder.build();
-    }
-
-    private RenderInfo createRenderInfo() {
-    	RenderInfo renderInfo = RenderInfo.newBuilder()
-    			.setRenderType(0)
-    			//.setVideoFrame(null)
-				.setVideoFrame("")
-				.setCameraStateType(0)
-    			.setIsMoving(0)
-    			.setNeedIfr(0)
-    			.setIsVideo(0)
-    			.setStillFrame(0)
-    			.setIsRotating(0)
-    			.setIsFollowing(0)
-    			.setClientPanoTreceId("")
-    			.setPrefetchVideoId("")
-    			.setNoMedia(false).build();
-    	return renderInfo;
-    }
-
-    private Event createEvent() {
-    	Event event = Event.newBuilder().setId("").setType(0).build();
-    	return event;
-    }
-
-    private Space createSpace(Point position,AngleUe4 angle) {
-    	Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
-    	return space;
-    }
-
-    private Point createPoint(String x,String y,String z) {
-    	Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
-    	return point;
-    }
-
-    private 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 结束点
-     * @return
-     */
-    private double calAngle(JSONObject o, JSONObject s, JSONObject e) {
-        double cosfi = 0;
-        double fi = 0;
-        double norm = 0;
-        double dsx = s.getDoubleValue("x") - o.getDoubleValue("x");
-        double dsy = s.getDoubleValue("y") - o.getDoubleValue("y");
-        double dex = e.getDoubleValue("x") - o.getDoubleValue("x");
-        double dey = e.getDoubleValue("y") - o.getDoubleValue("y");
-        cosfi = dsx * dex + dsy * dey;
-        norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
-        cosfi /= Math.sqrt(norm);
-        if (cosfi >= 1.0) return 0;
-        if (cosfi <= -1.0) return Math.PI;
-        fi = Math.acos(cosfi);
-        if (180 * fi / Math.PI < 180) {
-            return 180 * fi / Math.PI;
-        } else {
-            return 360 - 180 * fi / Math.PI;
-        }
-    }
+//    private UserState createUserState(String user_id,State state,RenderInfo renderInfo,Event event) {
+//    	UserState userState = UserState.newBuilder()
+//				.setUserId(user_id)
+//				.setPlayerState(state)
+//				.setRenderInfo(renderInfo)
+//				.setEvent(event)
+//				.setRelation(1)
+//				.build();
+//    	return userState;
+//    }
+
+//    private State createPlayerState(JSONObject userInfo) {
+//		State.Builder builder = State.newBuilder();
+//		builder.setRoomTypeId(userInfo.getString("roomTypeId"));
+//		builder.setPerson(0);
+//		builder.setAvatarId(userInfo.getString("avatarId"));
+//		builder.setSkinId(userInfo.getString("skinId"));
+//		builder.setRoomId(userInfo.getString("roomId"));
+//		builder.setIsHost(false);
+//		builder.setIsFollowHost(false);
+//		builder.setSkinDataVersion(userInfo.getString("skinDataVersion"));
+//		builder.setAvatarComponents("");
+//		builder.setNickName(userInfo.getString("nickName"));
+//		builder.setMovingMode(0);
+//		builder.setAttitude("walk");
+//		builder.setAreaName("");
+//		builder.setPathName("thirdwalk");
+//		builder.setPathId("thirdwalk");
+//		builder.setAvatarSize(1);
+//		if(userInfo.get("extra") != null){
+//			builder.setExtra((Extra)userInfo.get("extra"));
+//		}
+//		builder.setPrioritySync(false);
+//		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"));
+//		}
+//    	return builder.build();
+//    }
+//
+//    private RenderInfo createRenderInfo() {
+//    	RenderInfo renderInfo = RenderInfo.newBuilder()
+//    			.setRenderType(0)
+//    			//.setVideoFrame(null)
+//				.setVideoFrame("")
+//				.setCameraStateType(0)
+//    			.setIsMoving(0)
+//    			.setNeedIfr(0)
+//    			.setIsVideo(0)
+//    			.setStillFrame(0)
+//    			.setIsRotating(0)
+//    			.setIsFollowing(0)
+//    			.setClientPanoTreceId("")
+//    			.setPrefetchVideoId("")
+//    			.setNoMedia(false).build();
+//    	return renderInfo;
+//    }
+//
+//    private Event createEvent() {
+//    	Event event = Event.newBuilder().setId("").setType(0).build();
+//    	return event;
+//    }
+//
+//    private Space createSpace(Point position,AngleUe4 angle) {
+//    	Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
+//    	return space;
+//    }
+//
+//    private Point createPoint(String x,String y,String z) {
+//    	Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
+//    	return point;
+//    }
+//
+//    private 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 结束点
+//     * @return
+//     */
+//    private double calAngle(JSONObject o, JSONObject s, JSONObject e) {
+//        double cosfi = 0;
+//        double fi = 0;
+//        double norm = 0;
+//        double dsx = s.getDoubleValue("x") - o.getDoubleValue("x");
+//        double dsy = s.getDoubleValue("y") - o.getDoubleValue("y");
+//        double dex = e.getDoubleValue("x") - o.getDoubleValue("x");
+//        double dey = e.getDoubleValue("y") - o.getDoubleValue("y");
+//        cosfi = dsx * dex + dsy * dey;
+//        norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
+//        cosfi /= Math.sqrt(norm);
+//        if (cosfi >= 1.0) return 0;
+//        if (cosfi <= -1.0) return Math.PI;
+//        fi = Math.acos(cosfi);
+//        if (180 * fi / Math.PI < 180) {
+//            return 180 * fi / Math.PI;
+//        } else {
+//            return 360 - 180 * fi / Math.PI;
+//        }
+//    }
 }

+ 161 - 6
src/main/java/com/fdkk/fdkkmeta/task/UpdateFrameMetaTask.java

@@ -1,10 +1,18 @@
 package com.fdkk.fdkkmeta.task;
 
 import cn.hutool.core.util.ArrayUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+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.*;
+import com.fdkk.fdkkmeta.grpc.*;
+import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
 import com.fdkk.fdkkmeta.redis.RedisCache;
+import com.fdkk.fdkkmeta.service.BreakpointsService;
 import com.fdkk.fdkkmeta.service.UserService;
+import com.fdkk.fdkkmeta.service.RotateFrameService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -19,11 +27,16 @@ import java.util.List;
 @Component
 @Slf4j
 public class UpdateFrameMetaTask {
-   @Autowired
-   RedisCache redisCache;
-   @Autowired
+    @Autowired
+    RedisCache redisCache;
+    @Autowired
     UserService userService;
-
+    @Autowired
+    RotateFrameService rotateFrameService;
+    @Autowired
+    SceneGrpcService sceneGrpcService;
+    @Autowired
+    BreakpointsService breakpointsService;
     @Scheduled(initialDelay=1000, fixedDelay=2000)
    public void updateFrameMetadata(){
        List<UserEntity> userOnline = userService.findUserOnline(true);
@@ -40,16 +53,158 @@ public class UpdateFrameMetaTask {
 
    }
 
-   private void createMetaDataForRotate(){
+   private boolean createMetaDataForRotate(String userId){
+       List<RotatePO> list = redisCache.getCacheList("setCacheRequest:rotate:"+userId);
+       UserEntity user = userService.findUserId(userId);
+       if(list.size()>0){
+           String[] traceIds = new String[list.size()];
+           JSONArray actionResponses = new JSONArray();
+           double horizontal_move = 0;
+           for(int i=0;i<list.size();++i){
+               RotatePO rotateRequestPO = list.get(i);
+               traceIds[i] = rotateRequestPO.getTrace_id();
+               horizontal_move += rotateRequestPO.getRotation_action().getDouble("horizontal_move");
+
+               //actionResponses
+               JSONObject actionResponse = sceneGrpcService.createActionResponse(rotateRequestPO.getAction_type(),traceIds[i]);
+               actionResponses.add(actionResponse);
+           }
+
+           RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
+
+           double hAngle = horizontal_move * 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.getAppId(),user.getBreakPointId(),currentFrame);
+           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( userId, 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:"+userId,metaDataFramePO);
+           //删除操作数据
+           //redisCache.delete("setCacheRequest:rotate:"+userId);
+           return true;
+       }
+       return false;
    }
 
     private void createMetaDataForMove(){
 
     }
 
-    private void createMetaDataForJoystick(){
+    private boolean createMetaDataForJoystick(String userId){
+        List<JoystickPO> list = redisCache.getCacheList("setCacheRequest:joystick:"+userId);
+        UserEntity user = userService.findUserId(userId);
+        if(list.size()>0){
+            String[] traceIds = new String[list.size()];
+            JSONArray actionResponses = new JSONArray();
+
+            int moveAngle = 0;
+            for(int i=0;i<list.size();++i){
+                JoystickPO joystickRequestPO = list.get(i);
+                traceIds[i] = joystickRequestPO.getTrace_id();
+                int move_angle = joystickRequestPO.getDir_action().getIntValue("move_angle");
+                //actionResponses
+                JSONObject actionResponse = sceneGrpcService.createActionResponse(joystickRequestPO.getAction_type(),traceIds[i]);
+                actionResponses.add(actionResponse);
+
+                moveAngle = move_angle;
+            }
+
+            RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
+            //只是人物转动
+            if(list.get(list.size() - 1).getDir_action().getIntValue("speed_level")<7){
+                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(list.get(list.size() - 1).getDir_action().getIntValue("move_angle")).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( userId, 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:"+userId,metaDataFramePO);
+                //删除操作数据
+                //redisCache.delete("setCacheRequest:joystick:"+userId);
+                return true;
+            }
+            //需要过渡了
+            //邻居点里找角度最合适的点
+            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;
+            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;
+                }
+            }
+
+            //开始过渡
+
 
+        }
+        return false;
     }
    /*
    * {