sceneGrpcServer.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. package com.fdkk.fdkkmeta.grpcService;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ArrayUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONArray;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.fdkk.fdkkmeta.config.MetaConfig;
  9. import com.fdkk.fdkkmeta.domain.dto.RouteDto;
  10. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  11. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  12. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  13. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  14. import com.fdkk.fdkkmeta.domain.po.AnglePO;
  15. import com.fdkk.fdkkmeta.domain.po.PointPO;
  16. import com.fdkk.fdkkmeta.grpc.*;
  17. import com.fdkk.fdkkmeta.redis.RedisCache;
  18. import com.fdkk.fdkkmeta.service.BreakpointsService;
  19. import com.fdkk.fdkkmeta.service.MoveFrameService;
  20. import com.fdkk.fdkkmeta.service.RotateFrameService;
  21. import com.fdkk.fdkkmeta.service.UserService;
  22. import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
  23. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  24. import com.google.protobuf.Message;
  25. import com.googlecode.protobuf.format.JsonFormat;
  26. import io.grpc.stub.StreamObserver;
  27. import lombok.extern.slf4j.Slf4j;
  28. import net.devh.boot.grpc.server.service.GrpcService;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import java.io.File;
  31. import java.io.IOException;
  32. import java.util.List;
  33. /**
  34. * @author Xiewj
  35. * @date 2022/5/9
  36. */
  37. @GrpcService
  38. @Slf4j
  39. public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBase {
  40. @Autowired
  41. MetaConfig metaConfig;
  42. @Autowired
  43. UserService userService;
  44. @Autowired
  45. BreakpointsService breakpointsService;
  46. @Autowired
  47. RotateFrameService rotateFrameService;
  48. @Autowired
  49. MoveFrameService moveFrameService;
  50. @Autowired
  51. RedisCache redisCache;
  52. /***
  53. * 回复 案例
  54. * SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  55. * responseObserver.onNext(res);
  56. */
  57. /*
  58. @Override
  59. public void testMethod(SceneRequest request, StreamObserver<SceneReply> responseObserver) {
  60. // grpc服务端获取调用端请求参数
  61. String id = request.getId();
  62. String name = request.getName();
  63. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  64. SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  65. responseObserver.onNext(res);
  66. responseObserver.onCompleted();
  67. log.info("回复{}",res);
  68. }
  69. */
  70. @Override
  71. public void getRoute(RouteRequest request, StreamObserver<RouteReply> responseObserver) {
  72. // grpc服务端获取调用端请求参数
  73. String sceneCode = request.getSceneCode();
  74. Point sLocation = request.getSLocation();
  75. Point eLocation = request.getELocation();
  76. RouteDto po=new RouteDto();
  77. PointPO s=new PointPO();
  78. s.setX(Double.parseDouble(sLocation.getX()));
  79. s.setY(Double.parseDouble(sLocation.getY()));
  80. s.setZ(Double.parseDouble(sLocation.getY()));
  81. PointPO e=new PointPO();
  82. e.setX(Double.parseDouble(eLocation.getX()));
  83. e.setY(Double.parseDouble(eLocation.getY()));
  84. e.setZ(Double.parseDouble(eLocation.getY()));
  85. po.setE_location(e);
  86. po.setS_location(s);
  87. po.setSceneCode(sceneCode);
  88. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +"target_freespace.json", po);
  89. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  90. RouteReply.Builder builder = RouteReply.newBuilder();
  91. if (ArrayUtil.isNotEmpty(maps)) {
  92. for (int i = 0; i < maps.size(); i++) {
  93. RouteArray.Builder addInBuilder = builder.addInBuilder();
  94. ProtoJsonUtils.toProtoBean(addInBuilder, maps.get(i).toString());
  95. }
  96. }
  97. responseObserver.onNext(builder.build());
  98. responseObserver.onCompleted();
  99. }
  100. @Override
  101. public void init(InitRequest request, StreamObserver<NormalReply> responseObserver) {
  102. /*
  103. {
  104. "id": "start",
  105. "room_id": "e629ef3e-022d-4e64-8654-703bb96410eb",
  106. "user_id": "f60d69e6e68cc",
  107. "trace_id": "78c891ae-0f4e-4db0-bdec-f80ca6c0b66e",
  108. "data": {
  109. "avatar_id": "KGe_Boy",
  110. "skin_id": "10089",
  111. "is_host": false,
  112. "skin_data_version": "1008900008",
  113. "rotation_render_type": 1,
  114. "is_all_sync": true,
  115. "nick_name": "f60d69e6e68cc",
  116. "app_id": "10016",
  117. "camera": {
  118. "position": {
  119. "x": -1047.49,
  120. "y": -1441.18,
  121. "z": 87.75
  122. },
  123. "angle": {
  124. "pitch": 0,
  125. "yaw": 0,
  126. "roll": 0
  127. }
  128. },
  129. "player": {
  130. "position": {
  131. "x": -727.49,
  132. "y": -1441.18,
  133. "z": -32.25
  134. },
  135. "angle": {
  136. "pitch": 0,
  137. "yaw": 0,
  138. "roll": 0
  139. }
  140. },
  141. "person": 0,
  142. "firends": [
  143. "user1"
  144. ],
  145. "sync_by_event": true,
  146. "area_name": "LQC",
  147. "path_name": "thirdwalk",
  148. "attitude": "walk",
  149. "room_type_id": "",
  150. "syncToOthers": true,
  151. "hasAvatar": true,
  152. "prioritySync": false,
  153. "extra": {
  154. "removeWhenDisconnected": true
  155. }
  156. }
  157. }
  158. */
  159. try {
  160. String user_id = request.getUserId();
  161. String nick_name = request.getNickName();
  162. String skin_id = request.getSkinId();
  163. String avatar_id = request.getAvatarId();
  164. String room_id = request.getRoomId();
  165. String app_id = request.getAppId();
  166. //保存user
  167. UserEntity userEntity=new UserEntity();
  168. userEntity.setAppId(app_id);
  169. userEntity.setUserId(user_id);
  170. userEntity.setAvatarId(avatar_id);
  171. userEntity.setNickName(nick_name);
  172. userEntity.setRoomId(room_id);
  173. userEntity.setSkinId(skin_id);
  174. userEntity.setFrameId(1L);
  175. userEntity.setBreakPointId(1L);
  176. userEntity.setOnline(true);
  177. //初始化的时候可以写死
  178. AnglePO player_angle = new AnglePO();
  179. player_angle.setPitch(0);
  180. player_angle.setYaw(0);
  181. player_angle.setRoll(0);
  182. userEntity.setPlayerAngle(player_angle);
  183. userService.save(userEntity);
  184. //todo 存入redis
  185. // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
  186. }
  187. catch(Exception e) {
  188. e.printStackTrace();
  189. }
  190. }
  191. @Override
  192. public void rotate(RotateRequest request, StreamObserver<NormalReply> responseObserver) {
  193. try {
  194. /*
  195. {
  196. "action_type":1014,
  197. "rotation_action":
  198. {
  199. "vertical_move":0,
  200. "horizontal_move":-0.020630372492836675
  201. },
  202. "trace_id":"b40a894e-cd59-4db5-8d75-a8466a0c9f15",
  203. "user_id":"0a3987974feb4"
  204. }
  205. */
  206. int action_type = request.getActionType();
  207. String trace_id = request.getTraceId();
  208. String user_id = request.getUserId();
  209. RotationAction rotation_action = request.getRotationAction();
  210. double horizontal_move = rotation_action.getHorizontalMove();
  211. //这三个变量从user表和rotateframe表里取
  212. UserEntity user = userService.findUserId(user_id);
  213. Long breakPointId = user.getBreakPointId();
  214. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(),breakPointId);
  215. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  216. PointPO playerPoint = breakpointsEntity.getPosition();
  217. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  218. AnglePO playerAnglePO = user.getPlayerAngle();
  219. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  220. Space player = createSpace(playerPosition,playerAngle);
  221. double hAngle = horizontal_move * 90;
  222. int offFrameIndex = (int)Math.ceil(hAngle);
  223. int currentFrame = rotateFrameEntity.getFrameIndex(); //从数据库里读取
  224. currentFrame +=offFrameIndex;
  225. if(currentFrame<0){
  226. currentFrame+=360;
  227. }
  228. else{
  229. currentFrame = currentFrame % 359;
  230. }
  231. //currentFrame
  232. log.info("currentFrame{}",currentFrame);
  233. String appId = user.getAppId();
  234. rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(appId,breakPointId,currentFrame);
  235. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  236. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  237. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  238. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  239. Space camera = createSpace(cameraPosition,cameraAngle);
  240. //对准player
  241. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  242. State playerState = createPlayerState( player, camera, cameraCenter);
  243. RenderInfo renderInfo = createRenderInfo();
  244. Event event = createEvent();
  245. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  246. String frameSrc = metaConfig.getVideoFramePath()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName();
  247. /// metaConfig.getVideoFramePath()
  248. log.info("VideoFramePath{}", metaConfig.getVideoFramePath());
  249. NormalReply.Builder builder = NormalReply.newBuilder();
  250. // for (int i = 0; i < 100; i++) {
  251. // builder.addActionResponses(0);//这个要查查
  252. // }
  253. builder.addTraceIds(trace_id);
  254. //builder.setVehicle(null);
  255. builder.setVehicle("");
  256. builder.addNewUserStates(userState);
  257. builder.addActionResponses(0);//这个要查查
  258. builder.addNewUserStates(userState);
  259. builder.setVehicle("");
  260. builder.setGetStateType(0);
  261. builder.setCode(0);
  262. builder.setMsg("OK");
  263. builder.setFrameSrc(frameSrc); //从数据库中获取对应的路径
  264. responseObserver.onNext(builder.build());
  265. responseObserver.onCompleted();
  266. }
  267. catch(Exception e) {
  268. e.printStackTrace();
  269. }
  270. }
  271. //返回的是角度矫正数据
  272. @Override
  273. public void moveStart(StartMoveRequest request, StreamObserver<MoveReply> responseObserver) {
  274. try {
  275. /*
  276. * 1.从user表里获得当前人物所在的breakPoint_id
  277. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  278. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  279. * 4.返回整个路径的一段
  280. *
  281. * */
  282. int action_type= request.getActionType();
  283. ClickingAction clicking_action = request.getClickingAction();
  284. Point end = clicking_action.getClickingPoint();
  285. State clicking_state = request.getClickingState();
  286. String trace_id = request.getTraceId();
  287. String user_id = request.getUserId();
  288. MoveReply.Builder builder = MoveReply.newBuilder();
  289. UserEntity user = userService.findUserId(user_id);
  290. String appId = user.getAppId();
  291. Long breakPointId = user.getBreakPointId();
  292. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,breakPointId);
  293. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  294. boolean isEnd = false;
  295. //计算路径
  296. RouteDto po=new RouteDto();
  297. PointPO s=breakpointsEntity.getPosition();
  298. PointPO e=new PointPO();
  299. e.setX(Double.parseDouble(end.getX()));
  300. e.setY(Double.parseDouble(end.getY()));
  301. e.setZ(Double.parseDouble(end.getZ()));
  302. po.setE_location(e);
  303. po.setS_location(s);
  304. po.setSceneCode(appId);
  305. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
  306. //处理路径数组,处理完成后放入缓存
  307. //获得下一个要走的breakPointId
  308. Long nextbreakPointId = 0L;
  309. if (ObjectUtil.isNotNull(maps)&&maps.size()>=2){
  310. nextbreakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(1)).toString()).getLong("id");
  311. maps.remove(0);
  312. redisCache.setCacheObject("route:"+trace_id,maps);
  313. }
  314. else {
  315. isEnd = true;
  316. }
  317. //开始返回结果,一段一段的返回(每段是两个邻居点的过渡),第一段之前还要有角度的矫正
  318. //矫正的结果:
  319. //moveFrameService.findById()
  320. PointPO playerPoint = breakpointsEntity.getPosition();
  321. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  322. AnglePO playerAnglePO = user.getPlayerAngle();
  323. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  324. Space player = createSpace(playerPosition,playerAngle);
  325. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  326. int angle = cameraAnglePO.getYaw();
  327. int offAngle = 0;
  328. offAngle = angle%45;
  329. if(offAngle>45-offAngle) {
  330. offAngle = 45-offAngle;
  331. }
  332. else {
  333. offAngle = -1*offAngle;
  334. }
  335. List<RotateFrameEntity> rotateFrameEntityList = rotateFrameService.findByAppIdAndBreakPointIdBetweenFrameIndex(appId, breakPointId, angle, offAngle + angle);
  336. //循环
  337. for(int i=0;i<rotateFrameEntityList.size();++i) {
  338. RotateFrameEntity _rotateFrameEntity = rotateFrameEntityList.get(i);
  339. PointPO cameraPoint = _rotateFrameEntity.getCameraPosition();
  340. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  341. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  342. Space camera = createSpace(cameraPosition,cameraAngle);
  343. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  344. String frameSrc = metaConfig.getVideoFramePath()+"/"+_rotateFrameEntity.getDirectory()+"/"+_rotateFrameEntity.getFileName();
  345. //添加player,camera,cameraCenter,frameSrc
  346. builder.addPlayer(player);
  347. builder.addCamera(camera);
  348. builder.addCameraCenter(cameraCenter);
  349. builder.addFrameSrc(frameSrc);
  350. }
  351. breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,nextbreakPointId);
  352. PointPO endPosition = breakpointsEntity.getPosition();
  353. JSONObject p1 = new JSONObject();
  354. p1.put("x", playerPoint.getX());
  355. p1.put("y", playerPoint.getY());
  356. JSONObject p2 = new JSONObject();
  357. p2.put("x", playerPoint.getX()+1);
  358. p2.put("y", playerPoint.getY());
  359. JSONObject p3 = new JSONObject();
  360. p3.put("x",endPosition.getX());
  361. p3.put("y",endPosition.getY());
  362. int _angle = (int)calAngle(p1,p2,p3);
  363. List<MoveFrameEntity> moveFrameEntityList = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle(appId, breakPointId, nextbreakPointId, (int)(offAngle + angle)/45);
  364. double offsetX = endPosition.getX() - playerPoint.getX();
  365. double offsetY = endPosition.getY() - playerPoint.getY();
  366. double offsetZ = endPosition.getZ() - playerPoint.getZ();
  367. for(int i=0;i<moveFrameEntityList.size();++i) {
  368. MoveFrameEntity _moveFrameEntityList = moveFrameEntityList.get(i);
  369. PointPO cameraPoint = _moveFrameEntityList.getCameraPosition();
  370. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  371. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  372. Space _camera = createSpace(cameraPosition,cameraAngle);
  373. Point _cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  374. String _frameSrc = metaConfig.getVideoFramePath()+"/"+_moveFrameEntityList.getDirectory()+"/"+_moveFrameEntityList.getFileName();
  375. Point _playerPosition = createPoint(String.valueOf(playerPoint.getX()+offsetX/moveFrameEntityList.size()),String.valueOf(playerPoint.getY()+offsetY/moveFrameEntityList.size()),String.valueOf(playerPoint.getZ()+offsetZ/moveFrameEntityList.size()));
  376. AngleUe4 _playerAngle = createAngle(playerAnglePO.getPitch(),_angle,playerAnglePO.getRoll());
  377. Space _player = createSpace(_playerPosition,_playerAngle);
  378. //添加_player,camera,cameraCenter,frameSrc
  379. builder.addPlayer(_player);
  380. builder.addCamera(_camera);
  381. builder.addCameraCenter(_cameraCenter);
  382. builder.addFrameSrc(_frameSrc);
  383. }
  384. // PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  385. // Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  386. // AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  387. // Space camera = createSpace(cameraPosition,cameraAngle);
  388. // Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  389. // State playerState = createPlayerState( player, camera, cameraCenter);
  390. State playerState = createPlayerState( player, null, null);
  391. RenderInfo renderInfo = createRenderInfo();
  392. Event event = createEvent();
  393. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  394. //builder.addTraceIds()
  395. //.setVehicle(null)
  396. builder.setVehicle("");
  397. builder.addNewUserStates( userState);
  398. builder.addActionResponses(0); //这个要查查
  399. builder.setGetStateType(0);
  400. builder.setCode(0);
  401. builder.setMsg("OK");
  402. builder.setIsEnd(isEnd);
  403. responseObserver.onNext(builder.build());
  404. responseObserver.onCompleted();
  405. }
  406. catch(Exception e) {
  407. e.printStackTrace();
  408. }
  409. }
  410. @Override
  411. public void moveProcess(MoveNextNeighborRequest request, StreamObserver<MoveReply> responseObserver) {
  412. try {
  413. /*
  414. * 1.从user表里获得当前人物所在的breakPoint_id
  415. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  416. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  417. * 4.返回整个路径的一段
  418. *
  419. * */
  420. String user_id = request.getUserId();
  421. String trace_id = request.getTraceId();
  422. boolean needNext = request.getNext();
  423. boolean isEnd = false;
  424. UserEntity user = userService.findUserId(user_id);
  425. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(),user.getBreakPointId());
  426. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  427. //moveStart的结果参考moveStart
  428. //开始返回结果,一段一段的返回(每段是两个邻居点的过渡),第一段之前还要有角度的矫正
  429. //矫正的结果:
  430. //moveFrameService.findById()
  431. PointPO playerPoint = breakpointsEntity.getPosition();
  432. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  433. AnglePO playerAnglePO = user.getPlayerAngle();
  434. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  435. Space player = createSpace(playerPosition,playerAngle);
  436. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  437. int angle = cameraAnglePO.getYaw();
  438. int offAngle = 0;
  439. offAngle = angle%45;
  440. if(offAngle>45-offAngle) {
  441. offAngle = 45-offAngle;
  442. }
  443. else {
  444. offAngle = -1*offAngle;
  445. }
  446. Long nextbreakPointId = 0L;
  447. // 从缓存里面取 JSONArray cacheObject = redisCache.getCacheObject(trace_id);
  448. if (needNext&&redisCache.hasKey(trace_id)){
  449. JSONArray cacheObject = redisCache.getCacheObject(trace_id);
  450. if (cacheObject.size()>=2){
  451. nextbreakPointId = JSON.parseObject(JSONObject.toJSON(cacheObject.get(1)).toString()).getLong("id");
  452. cacheObject.remove(0);
  453. redisCache.setCacheObject("route:"+trace_id,cacheObject);
  454. }
  455. else {
  456. isEnd = true;
  457. }
  458. }
  459. else {
  460. isEnd = true;
  461. }
  462. //循环
  463. //for()
  464. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  465. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  466. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  467. Space camera = createSpace(cameraPosition,cameraAngle);
  468. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  469. State playerState = createPlayerState( player, camera, cameraCenter);
  470. RenderInfo renderInfo = createRenderInfo();
  471. Event event = createEvent();
  472. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  473. MoveReply res = MoveReply.newBuilder()
  474. .setTraceIds(0, trace_id)
  475. //.setVehicle(null)
  476. .setVehicle("")
  477. .setNewUserStates(0, userState)
  478. .setActionResponses(0, 0) //这个要查查
  479. .setGetStateType(0)
  480. .setCode(0)
  481. .setMsg("OK")
  482. //.setPlayer(index, value)
  483. //.setCamera(index, value)
  484. //.setCameraCenter(index, value)
  485. //.setFrameSrc(index, value)
  486. .setIsEnd(isEnd)
  487. .build();
  488. }
  489. catch(Exception e) {
  490. e.printStackTrace();
  491. }
  492. }
  493. @Override
  494. public void getBreakPoint(BreakPointRequest request, StreamObserver<BreakPointReply> responseObserver) {
  495. try {
  496. log.info("进入{}",request);
  497. int action_type = request.getActionType();
  498. NeighborPointsAction get_neighbor_points_action = request.getGetNeighborPointsAction();
  499. String trace_id = request.getTraceId();
  500. String user_id = request.getUserId();
  501. //从表breakpoints里获取所有的呼吸点,并且是数组
  502. //TODO 根据查询所有
  503. UserEntity userEntity = userService.findUserId(user_id);
  504. List<BreakpointsEntity> allList = breakpointsService.findByAppId(userEntity.getAppId());
  505. Point[] nps=null;
  506. BreakPointReply res = BreakPointReply.newBuilder()
  507. .setActionType(action_type)
  508. .setPointType(100)
  509. .setExtra("")
  510. .setTraceId(trace_id)
  511. .setPacketId("")
  512. //.setNps(nps)
  513. .setPeopleNum(0)
  514. .setZoneId("")
  515. .setEchoMsg("")
  516. .setReserveDetail(null)
  517. //.setUserWithAvatarList()
  518. //.setNewUserStates()
  519. .setCode(0)
  520. .setMsg("")
  521. .build();
  522. responseObserver.onNext(res);
  523. responseObserver.onCompleted();
  524. log.info("回复{}",res);
  525. }
  526. catch(Exception e) {
  527. e.printStackTrace();
  528. }
  529. }
  530. //操作杆
  531. @Override
  532. public void joystick(JoystickRequest request, StreamObserver<NormalReply> responseObserver) {
  533. try {
  534. log.info("进入{}",request);
  535. /*
  536. {
  537. "action_type": 15,
  538. "dir_action": {
  539. "move_angle": 276,
  540. "speed_level": 8
  541. },
  542. "trace_id": "d0a45ade-b674-47dc-a546-36e981c78ae8",
  543. "user_id": "7ef177cb55c91",
  544. "packet_id": "d3a3b46a-33cf-486f-b8aa-36b26f786eeb"
  545. }
  546. */
  547. int actionType = request.getActionType();
  548. DirAction dirAction = request.getDirAction();
  549. String trace_id = request.getTraceId();
  550. String user_id = request.getUserId();
  551. String packet_id = request.getPacketId();
  552. UserEntity user = userService.findUserId(user_id);
  553. Long breakPointId = user.getBreakPointId();
  554. //获得当前点所有邻居点
  555. //TODO 获取棋盘邻居点 getContact
  556. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), breakPointId);
  557. log.info("breakpointsEntity-getContact",breakpointsEntity.getContact());
  558. //找到与角度move_angle最近的邻居点
  559. //移动player,并且更新相机角度
  560. }
  561. catch(Exception e) {
  562. e.printStackTrace();
  563. }
  564. }
  565. private UserState createUserState(String user_id,State state,RenderInfo renderInfo,Event event) {
  566. UserState userState = UserState.newBuilder()
  567. .setUserId(user_id)
  568. .setPlayerState(state)
  569. .setRenderInfo(renderInfo)
  570. .setEvent(event)
  571. .setRelation(1)
  572. .build();
  573. return userState;
  574. }
  575. private State createPlayerState(Space player,Space camera,Point cameraCenter) {
  576. State.Builder builder = State.newBuilder();
  577. builder.setRoomTypeId("");
  578. builder.setPerson(0);
  579. builder.setAvatarId("");
  580. builder.setSkinId("");
  581. builder.setRoomId("");
  582. builder.setIsHost(false);
  583. builder.setIsFollowHost(false);
  584. builder.setSkinDataVersion("");
  585. builder.setAvatarComponents("");
  586. builder.setNickName("");
  587. builder.setMovingMode(0);
  588. builder.setAttitude("");
  589. builder.setAreaName("");
  590. builder.setPathName("");
  591. builder.setPathId("");
  592. builder.setAvatarSize(1);
  593. builder.setExtra("");
  594. builder.setPrioritySync(false);
  595. builder.setPlayer(player);
  596. if(camera != null){
  597. builder.setCamera(camera);
  598. }
  599. if(cameraCenter!=null){
  600. builder.setCameraCenter(cameraCenter);
  601. }
  602. return builder.build();
  603. }
  604. private RenderInfo createRenderInfo() {
  605. RenderInfo renderInfo = RenderInfo.newBuilder()
  606. .setRenderType(0)
  607. //.setVideoFrame(null)
  608. .setVideoFrame("")
  609. .setCameraStateType(0)
  610. .setIsMoving(0)
  611. .setNeedIfr(0)
  612. .setIsVideo(0)
  613. .setStillFrame(0)
  614. .setIsRotating(0)
  615. .setIsFollowing(0)
  616. .setClientPanoTreceId("")
  617. .setPrefetchVideoId("")
  618. .setNoMedia(false).build();
  619. return renderInfo;
  620. }
  621. private Event createEvent() {
  622. Event event = Event.newBuilder().setId("").setType(0).build();
  623. return event;
  624. }
  625. private Space createSpace(Point position,AngleUe4 angle) {
  626. Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
  627. return space;
  628. }
  629. private Point createPoint(String x,String y,String z) {
  630. Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
  631. return point;
  632. }
  633. private AngleUe4 createAngle(int pitch,int yaw,int roll) {
  634. AngleUe4 angle = AngleUe4.newBuilder().setPitch(pitch).setYaw(yaw).setRoll(roll).build();
  635. return angle;
  636. }
  637. /**
  638. * 根据余弦定理计算线段1到线段2的夹角,线段1:起始点到原点,线段2:原点到结束点)
  639. * @param o 原点
  640. * @param s 起始点
  641. * @param e 结束点
  642. * @return
  643. */
  644. private double calAngle(JSONObject o, JSONObject s, JSONObject e) {
  645. double cosfi = 0;
  646. double fi = 0;
  647. double norm = 0;
  648. double dsx = s.getDoubleValue("x") - o.getDoubleValue("x");
  649. double dsy = s.getDoubleValue("y") - o.getDoubleValue("y");
  650. double dex = e.getDoubleValue("x") - o.getDoubleValue("x");
  651. double dey = e.getDoubleValue("y") - o.getDoubleValue("y");
  652. cosfi = dsx * dex + dsy * dey;
  653. norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
  654. cosfi /= Math.sqrt(norm);
  655. if (cosfi >= 1.0) return 0;
  656. if (cosfi <= -1.0) return Math.PI;
  657. fi = Math.acos(cosfi);
  658. if (180 * fi / Math.PI < 180) {
  659. return 180 * fi / Math.PI;
  660. } else {
  661. return 360 - 180 * fi / Math.PI;
  662. }
  663. }
  664. }