|
|
@@ -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);
|
|
|
+// }
|
|
|
+
|
|
|
}
|