sceneGrpcServer.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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. try {
  103. String user_id = request.getUserId();
  104. String nick_name = request.getNickName();
  105. String skin_id = request.getSkinId();
  106. String avatar_id = request.getAvatarId();
  107. String room_id = request.getRoomId();
  108. String app_id = request.getAppId();
  109. //保存user
  110. UserEntity userEntity=new UserEntity();
  111. userEntity.setAppId(app_id);
  112. userEntity.setAvatarId(avatar_id);
  113. userEntity.setNickName(nick_name);
  114. userEntity.setRoomId(room_id);
  115. userEntity.setSkinId(skin_id);
  116. userEntity.setFrameId(0L);
  117. userEntity.setBreakPointId(0L);
  118. //初始化的时候可以写死
  119. AnglePO player_angle = new AnglePO();
  120. player_angle.setPitch(0);
  121. player_angle.setYaw(0);
  122. player_angle.setRoll(0);
  123. userEntity.setPlayerAngle(player_angle);
  124. userService.save(userEntity);
  125. }
  126. catch(Exception e) {
  127. e.printStackTrace();
  128. }
  129. }
  130. @Override
  131. public void rotate(RotateRequest request, StreamObserver<NormalReply> responseObserver) {
  132. try {
  133. /*
  134. {
  135. "action_type":1014,
  136. "rotation_action":
  137. {
  138. "vertical_move":0,
  139. "horizontal_move":-0.020630372492836675
  140. },
  141. "trace_id":"b40a894e-cd59-4db5-8d75-a8466a0c9f15",
  142. "user_id":"0a3987974feb4"
  143. }
  144. */
  145. int action_type = request.getActionType();
  146. String trace_id = request.getTraceId();
  147. String user_id = request.getUserId();
  148. RotationAction rotation_action = request.getRotationAction();
  149. double horizontal_move = rotation_action.getHorizontalMove();
  150. //这三个变量从user表和rotateframe表里取
  151. UserEntity user = userService.findUserId(user_id);
  152. Long breakPointId = user.getBreakPointId();
  153. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(),breakPointId);
  154. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  155. PointPO playerPoint = breakpointsEntity.getPosition();
  156. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  157. AnglePO playerAnglePO = user.getPlayerAngle();
  158. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  159. Space player = createSpace(playerPosition,playerAngle);
  160. double hAngle = horizontal_move * 90;
  161. int offFrameIndex = (int)Math.ceil(hAngle);
  162. int currentFrame = rotateFrameEntity.getFrameIndex(); //从数据库里读取
  163. currentFrame +=offFrameIndex;
  164. if(currentFrame<0){
  165. currentFrame+=360;
  166. }
  167. else{
  168. currentFrame = currentFrame % 359;
  169. }
  170. //currentFrame
  171. log.info("currentFrame{}",currentFrame);
  172. String appId = user.getAppId();
  173. rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(appId,breakPointId,currentFrame);
  174. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  175. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  176. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  177. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  178. Space camera = createSpace(cameraPosition,cameraAngle);
  179. //对准player
  180. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  181. State playerState = createPlayerState( player, camera, cameraCenter);
  182. RenderInfo renderInfo = createRenderInfo();
  183. Event event = createEvent();
  184. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  185. String frameSrc = metaConfig.getVideoFramePath()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName();
  186. /// metaConfig.getVideoFramePath()
  187. log.info("VideoFramePath{}", metaConfig.getVideoFramePath());
  188. NormalReply res = NormalReply.newBuilder()
  189. .addTraceIds( trace_id)
  190. //.setVehicle(null)
  191. .addNewUserStates(userState)
  192. .addActionResponses(0) //这个要查查
  193. .setGetStateType(0)
  194. .setCode(0)
  195. .setMsg("OK")
  196. .setFrameSrc(frameSrc) //从数据库中获取对应的路径
  197. .build();
  198. responseObserver.onNext(res);
  199. responseObserver.onCompleted();
  200. }
  201. catch(Exception e) {
  202. e.printStackTrace();
  203. }
  204. }
  205. //返回的是角度矫正数据
  206. @Override
  207. public void moveStart(StartMoveRequest request, StreamObserver<MoveReply> responseObserver) {
  208. try {
  209. /*
  210. * 1.从user表里获得当前人物所在的breakPoint_id
  211. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  212. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  213. * 4.返回整个路径的一段
  214. *
  215. * */
  216. int action_type= request.getActionType();
  217. ClickingAction clicking_action = request.getClickingAction();
  218. Point end = clicking_action.getClickingPoint();
  219. State clicking_state = request.getClickingState();
  220. String trace_id = request.getTraceId();
  221. String user_id = request.getUserId();
  222. UserEntity user = userService.findUserId(user_id);
  223. String appId = user.getAppId();
  224. Long breakPointId = user.getBreakPointId();
  225. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,breakPointId);
  226. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  227. Point start = null; //从user表里取
  228. boolean isEnd = false;
  229. //计算路径
  230. RouteDto po=new RouteDto();
  231. PointPO s=new PointPO();
  232. s.setX(Double.parseDouble(start.getX()));
  233. s.setY(Double.parseDouble(start.getY()));
  234. s.setZ(Double.parseDouble(start.getY()));
  235. PointPO e=new PointPO();
  236. e.setX(Double.parseDouble(end.getX()));
  237. e.setY(Double.parseDouble(end.getY()));
  238. e.setZ(Double.parseDouble(end.getY()));
  239. po.setE_location(e);
  240. po.setS_location(s);
  241. po.setSceneCode(appId);
  242. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
  243. //处理路径数组,处理完成后放入缓存
  244. //获得下一个要走的breakPointId
  245. Long nextbreakPointId = 0L;
  246. if (ObjectUtil.isNotNull(maps)&&maps.size()>=2){
  247. nextbreakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(1)).toString()).getLong("id");
  248. maps.remove(0);
  249. redisCache.setCacheObject("route:"+trace_id,maps);
  250. }
  251. else {
  252. isEnd = true;
  253. }
  254. //开始返回结果,一段一段的返回(每段是两个邻居点的过渡),第一段之前还要有角度的矫正
  255. //矫正的结果:
  256. //moveFrameService.findById()
  257. PointPO playerPoint = breakpointsEntity.getPosition();
  258. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  259. AnglePO playerAnglePO = user.getPlayerAngle();
  260. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  261. Space player = createSpace(playerPosition,playerAngle);
  262. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  263. int angle = cameraAnglePO.getYaw();
  264. int offAngle = 0;
  265. offAngle = angle%45;
  266. if(offAngle>45-offAngle) {
  267. offAngle = 45-offAngle;
  268. }
  269. else {
  270. offAngle = -1*offAngle;
  271. }
  272. List<RotateFrameEntity> rotateFrameEntityList = rotateFrameService.findByAppIdAndBreakPointIdBetweenFrameIndex(appId, breakPointId, angle, offAngle + angle);
  273. //循环
  274. for(int i=0;i<rotateFrameEntityList.size();++i) {
  275. RotateFrameEntity _rotateFrameEntity = rotateFrameEntityList.get(i);
  276. PointPO cameraPoint = _rotateFrameEntity.getCameraPosition();
  277. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  278. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  279. Space camera = createSpace(cameraPosition,cameraAngle);
  280. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  281. String frameSrc = metaConfig.getVideoFramePath()+"/"+_rotateFrameEntity.getDirectory()+"/"+_rotateFrameEntity.getFileName();
  282. //添加player,camera,cameraCenter,frameSrc
  283. }
  284. breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,nextbreakPointId);
  285. PointPO endPosition = breakpointsEntity.getPosition();
  286. JSONObject p1 = new JSONObject();
  287. p1.put("x", playerPoint.getX());
  288. p1.put("y", playerPoint.getY());
  289. JSONObject p2 = new JSONObject();
  290. p2.put("x", playerPoint.getX()+1);
  291. p2.put("y", playerPoint.getY());
  292. JSONObject p3 = new JSONObject();
  293. p3.put("x",endPosition.getX());
  294. p3.put("y",endPosition.getY());
  295. int _playerAngle = (int)calAngle(p1,p2,p3);
  296. List<MoveFrameEntity> moveFrameEntityList = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle(appId, breakPointId, nextbreakPointId, (int)(offAngle + angle)/45);
  297. double offsetX = endPosition.getX() - playerPoint.getX();
  298. double offsetY = endPosition.getY() - playerPoint.getY();
  299. double offsetZ = endPosition.getZ() - playerPoint.getZ();
  300. for(int i=0;i<moveFrameEntityList.size();++i) {
  301. MoveFrameEntity _moveFrameEntityList = moveFrameEntityList.get(i);
  302. PointPO cameraPoint = _moveFrameEntityList.getCameraPosition();
  303. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  304. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  305. Space camera = createSpace(cameraPosition,cameraAngle);
  306. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  307. String frameSrc = metaConfig.getVideoFramePath()+"/"+_moveFrameEntityList.getDirectory()+"/"+_moveFrameEntityList.getFileName();
  308. Point _playerPosition = createPoint(String.valueOf(playerPoint.getX()+offsetX/moveFrameEntityList.size()),String.valueOf(playerPoint.getY()+offsetY/moveFrameEntityList.size()),String.valueOf(playerPoint.getZ()+offsetZ/moveFrameEntityList.size()));
  309. //Space _player = createSpace(_playerPosition,_playerAngle);
  310. //添加player,camera,cameraCenter,frameSrc
  311. }
  312. // PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  313. // Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  314. // AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  315. // Space camera = createSpace(cameraPosition,cameraAngle);
  316. // Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  317. // State playerState = createPlayerState( player, camera, cameraCenter);
  318. State playerState = createPlayerState( player, null, null);
  319. RenderInfo renderInfo = createRenderInfo();
  320. Event event = createEvent();
  321. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  322. MoveReply res = MoveReply.newBuilder()
  323. .setTraceIds(0, trace_id)
  324. .setVehicle(null)
  325. .setNewUserStates(0, userState)
  326. .setActionResponses(0, 0) //这个要查查
  327. .setGetStateType(0)
  328. .setCode(0)
  329. .setMsg("OK")
  330. //.setPlayer(index, value)
  331. //.setCamera(index, value)
  332. //.setCameraCenter(index, value)
  333. //.setFrameSrc(index, value)
  334. .setIsEnd(isEnd)
  335. .build();
  336. }
  337. catch(Exception e) {
  338. e.printStackTrace();
  339. }
  340. }
  341. @Override
  342. public void moveProcess(MoveNextNeighborRequest request, StreamObserver<MoveReply> responseObserver) {
  343. try {
  344. /*
  345. * 1.从user表里获得当前人物所在的breakPoint_id
  346. * 2.根据breakPoint_id,从breakpoints表里获得对应的起始坐标
  347. * 3.根据request中的clicking_action里的clicking_point(目的地)以及当前起始坐标计算出路径
  348. * 4.返回整个路径的一段
  349. *
  350. * */
  351. String user_id = request.getUserId();
  352. String trace_id = request.getTraceId();
  353. boolean needNext = request.getNext();
  354. boolean isEnd = false;
  355. UserEntity user = userService.findUserId(user_id);
  356. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(),user.getBreakPointId());
  357. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  358. //moveStart的结果参考moveStart
  359. //开始返回结果,一段一段的返回(每段是两个邻居点的过渡),第一段之前还要有角度的矫正
  360. //矫正的结果:
  361. //moveFrameService.findById()
  362. PointPO playerPoint = breakpointsEntity.getPosition();
  363. Point playerPosition = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  364. AnglePO playerAnglePO = user.getPlayerAngle();
  365. AngleUe4 playerAngle = createAngle(playerAnglePO.getPitch(),playerAnglePO.getYaw(),playerAnglePO.getRoll());
  366. Space player = createSpace(playerPosition,playerAngle);
  367. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  368. int angle = cameraAnglePO.getYaw();
  369. int offAngle = 0;
  370. offAngle = angle%45;
  371. if(offAngle>45-offAngle) {
  372. offAngle = 45-offAngle;
  373. }
  374. else {
  375. offAngle = -1*offAngle;
  376. }
  377. Long nextbreakPointId = 0L;
  378. // 从缓存里面取 JSONArray cacheObject = redisCache.getCacheObject(trace_id);
  379. if (needNext&&redisCache.hasKey(trace_id)){
  380. JSONArray cacheObject = redisCache.getCacheObject(trace_id);
  381. if (cacheObject.size()>=2){
  382. nextbreakPointId = JSON.parseObject(JSONObject.toJSON(cacheObject.get(1)).toString()).getLong("id");
  383. cacheObject.remove(0);
  384. redisCache.setCacheObject("route:"+trace_id,cacheObject);
  385. }
  386. else {
  387. isEnd = true;
  388. }
  389. }
  390. else {
  391. isEnd = true;
  392. }
  393. //循环
  394. //for()
  395. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  396. Point cameraPosition = createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  397. AngleUe4 cameraAngle = createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  398. Space camera = createSpace(cameraPosition,cameraAngle);
  399. Point cameraCenter = createPoint(String.valueOf(playerPoint.getX()),String.valueOf(playerPoint.getY()),String.valueOf(playerPoint.getZ()));
  400. State playerState = createPlayerState( player, camera, cameraCenter);
  401. RenderInfo renderInfo = createRenderInfo();
  402. Event event = createEvent();
  403. UserState userState = createUserState( user_id, playerState, renderInfo, event);
  404. MoveReply res = MoveReply.newBuilder()
  405. .setTraceIds(0, trace_id)
  406. .setVehicle(null)
  407. .setNewUserStates(0, userState)
  408. .setActionResponses(0, 0) //这个要查查
  409. .setGetStateType(0)
  410. .setCode(0)
  411. .setMsg("OK")
  412. //.setPlayer(index, value)
  413. //.setCamera(index, value)
  414. //.setCameraCenter(index, value)
  415. //.setFrameSrc(index, value)
  416. .setIsEnd(isEnd)
  417. .build();
  418. }
  419. catch(Exception e) {
  420. e.printStackTrace();
  421. }
  422. }
  423. @Override
  424. public void getBreakPoint(BreakPointRequest request, StreamObserver<BreakPointReply> responseObserver) {
  425. try {
  426. log.info("进入{}",request);
  427. int action_type = request.getActionType();
  428. NeighborPointsAction get_neighbor_points_action = request.getGetNeighborPointsAction();
  429. String trace_id = request.getTraceId();
  430. String user_id = request.getUserId();
  431. //从表breakpoints里获取所有的呼吸点,并且是数组
  432. //TODO 根据查询所有
  433. UserEntity userEntity = userService.findUserId(user_id);
  434. List<BreakpointsEntity> allList = breakpointsService.findByAppId(userEntity.getAppId());
  435. Point[] nps=null;
  436. BreakPointReply res = BreakPointReply.newBuilder()
  437. .setActionType(action_type)
  438. .setPointType(100)
  439. .setExtra("")
  440. .setTraceId(trace_id)
  441. .setPacketId("")
  442. //.setNps(nps)
  443. .setPeopleNum(0)
  444. .setZoneId("")
  445. .setEchoMsg("")
  446. .setReserveDetail(null)
  447. //.setUserWithAvatarList()
  448. //.setNewUserStates()
  449. .setCode(0)
  450. .setMsg("")
  451. .build();
  452. responseObserver.onNext(res);
  453. responseObserver.onCompleted();
  454. log.info("回复{}",res);
  455. }
  456. catch(Exception e) {
  457. e.printStackTrace();
  458. }
  459. }
  460. //操作杆
  461. @Override
  462. public void joystick(JoystickRequest request, StreamObserver<NormalReply> responseObserver) {
  463. try {
  464. log.info("进入{}",request);
  465. /*
  466. {
  467. "action_type": 15,
  468. "dir_action": {
  469. "move_angle": 276,
  470. "speed_level": 8
  471. },
  472. "trace_id": "d0a45ade-b674-47dc-a546-36e981c78ae8",
  473. "user_id": "7ef177cb55c91",
  474. "packet_id": "d3a3b46a-33cf-486f-b8aa-36b26f786eeb"
  475. }
  476. */
  477. int actionType = request.getActionType();
  478. DirAction dirAction = request.getDirAction();
  479. String trace_id = request.getTraceId();
  480. String user_id = request.getUserId();
  481. String packet_id = request.getPacketId();
  482. UserEntity user = userService.findUserId(user_id);
  483. Long breakPointId = user.getBreakPointId();
  484. //获得当前点所有邻居点
  485. //TODO 获取棋盘邻居点 getContact
  486. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), breakPointId);
  487. log.info("breakpointsEntity-getContact",breakpointsEntity.getContact());
  488. //找到与角度move_angle最近的邻居点
  489. //移动player,并且更新相机角度
  490. }
  491. catch(Exception e) {
  492. e.printStackTrace();
  493. }
  494. }
  495. private UserState createUserState(String user_id,State state,RenderInfo renderInfo,Event event) {
  496. UserState userState = UserState.newBuilder()
  497. .setUserId(user_id)
  498. .setPlayerState(state)
  499. .setRenderInfo(renderInfo)
  500. .setEvent(event)
  501. .setRelation(1)
  502. .build();
  503. return userState;
  504. }
  505. private State createPlayerState(Space player,Space camera,Point cameraCenter) {
  506. State playerState = State.newBuilder()
  507. .setRoomTypeId("")
  508. .setPerson(0)
  509. .setAvatarId("")
  510. .setSkinId("")
  511. .setRoomId("")
  512. .setIsHost(false)
  513. .setIsFollowHost(false)
  514. .setSkinDataVersion("")
  515. .setAvatarComponents("")
  516. .setNickName("")
  517. .setMovingMode(0)
  518. .setAttitude("")
  519. .setAreaName("")
  520. .setPathName("")
  521. .setPathId("")
  522. .setAvatarSize(1)
  523. .setExtra("")
  524. .setPrioritySync(false)
  525. .setPlayer(player)
  526. .setCamera(camera)
  527. .setCameraCenter(cameraCenter).build();
  528. return playerState;
  529. }
  530. private RenderInfo createRenderInfo() {
  531. RenderInfo renderInfo = RenderInfo.newBuilder()
  532. .setRenderType(0)
  533. .setVideoFrame("")
  534. .setCameraStateType(0)
  535. .setIsMoving(0)
  536. .setNeedIfr(0)
  537. .setIsVideo(0)
  538. .setStillFrame(0)
  539. .setIsRotating(0)
  540. .setIsFollowing(0)
  541. .setClientPanoTreceId("")
  542. .setPrefetchVideoId("")
  543. .setNoMedia(false).build();
  544. return renderInfo;
  545. }
  546. private Event createEvent() {
  547. Event event = Event.newBuilder().setId("").setType(0).build();
  548. return event;
  549. }
  550. private Space createSpace(Point position,AngleUe4 angle) {
  551. Space space = Space.newBuilder().setPosition(position).setAngle(angle).build();
  552. return space;
  553. }
  554. private Point createPoint(String x,String y,String z) {
  555. Point point = Point.newBuilder().setX(x).setY(y).setZ(z).build();
  556. return point;
  557. }
  558. private AngleUe4 createAngle(int pitch,int yaw,int roll) {
  559. AngleUe4 angle = AngleUe4.newBuilder().setPitch(pitch).setYaw(yaw).setRoll(roll).build();
  560. return angle;
  561. }
  562. /**
  563. * 根据余弦定理计算线段1到线段2的夹角,线段1:起始点到原点,线段2:原点到结束点)
  564. * @param o 原点
  565. * @param s 起始点
  566. * @param e 结束点
  567. * @return
  568. */
  569. private double calAngle(JSONObject o, JSONObject s, JSONObject e) {
  570. double cosfi = 0;
  571. double fi = 0;
  572. double norm = 0;
  573. double dsx = s.getDoubleValue("x") - o.getDoubleValue("x");
  574. double dsy = s.getDoubleValue("y") - o.getDoubleValue("y");
  575. double dex = e.getDoubleValue("x") - o.getDoubleValue("x");
  576. double dey = e.getDoubleValue("y") - o.getDoubleValue("y");
  577. cosfi = dsx * dex + dsy * dey;
  578. norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
  579. cosfi /= Math.sqrt(norm);
  580. if (cosfi >= 1.0) return 0;
  581. if (cosfi <= -1.0) return Math.PI;
  582. fi = Math.acos(cosfi);
  583. if (180 * fi / Math.PI < 180) {
  584. return 180 * fi / Math.PI;
  585. } else {
  586. return 360 - 180 * fi / Math.PI;
  587. }
  588. }
  589. }