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.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.ActionPO; import com.fdkk.fdkkmeta.domain.po.AnglePO; 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 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; @Slf4j @Service public class SceneGrpcServiceImpl implements SceneGrpcService { @Autowired RedisCache redisCache; @Autowired RotateFrameService rotateFrameService; @Override public int test(int a){ return 0; } @Override public UserState createUserState(String user_id, State state, RenderInfo renderInfo, Event event) { UserState.Builder builder = UserState.newBuilder(); builder.setUserId(user_id); builder.setPlayerState(state); builder.setRenderInfo(renderInfo); builder.setRelation(1); if (ObjectUtil.isNotNull(event)){ builder.setEvent(event); } UserState userState = builder.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(userInfo.getString("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; } } @Override 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.setY(startPosition.getY()); temp.setZ(startPosition.getZ()); int angle = (int)calAngle(startPosition, temp, endPosition); return angle; } @Override public AnglePO setRotateForMove(JSONObject user, String trace_id, AnglePO cameraAngle){ int angle = cameraAngle.getYaw(); int offAngle = 0; offAngle = angle%45; //先简单来,就累加。后续要再调试 //存储矫正的一组帧 offAngle = Math.abs(45 - offAngle); RotateFrameEntity _rotateFrameEntity = null; for(int j=0;j