2014-06-16 1 views
0

네트워크 시뮬레이션에서 사용하기 위해 엔티티 상태 PDU를 네트워크를 통해 전송할 Java 프로그램을 개발 중입니다. 나는 이것을하기 위해 open-DIS 라이브러리를 사용하고있다.Java 엔티티의 현재 방향과 목표 대상 사이의 각도를 계산하는 방법

현재 프로그램을 실행하면 하나의 시뮬레이션에서 실행중인 여러 엔티티가 있고 두 번째 시뮬레이션에 첫 번째 시뮬레이션에서 전송 된 PDU를 수신하여 다른 시뮬레이션에 표시하려는 경우 그래픽으로 포함 된 정보.

두 번째 시뮬레이션에서는 첫 번째 시뮬레이션에서 모든 엔티티를 볼 수 있지만 현재는 첫 번째 시뮬레이션의 엔티티 중 하나가 움직일 때 볼 수 있습니다.하지만 동일한 엔티티가 그들은 두 번째 시뮬레이션에서 원래 방향과 똑같은 방향을 유지해야합니다. 즉 현재 움직이는 방향을 향하지 않습니다.

은 내가, 그들이 직면해야하는 방향/각도를 설정할 필요가 무엇 인 오픈 DIS 라이브러리 setPhi과 '방향'클래스를 가지고 setPsi & setTheta 방법을 알고 있지만 내가 뭘 아니에요 물론 그 메소드에 어떤 값을 주는지 어떻게 알아낼 수 있을까요?이 값을 얻기위한 수학적 방법을 제공하는 라이브러리가 있습니까? 아니면이 책을 직접 작성해야합니까?

EDIT

EntitStateFormatter.java 클래스에 다음 라인을 추가하는 시도했다 (이 프로토콜 데이터 유닛의 데이터를 획득 한, 제 시뮬레이션을 통해 전송 될 수있는 PDU를 생성하는 클래스이다 즉) 제 시뮬레이션받은 :

orientation.setPhi((float) (entity.getLocation().getAzimuth())); 
orientation.setPsi((float) (entity.getLocation().getElevation())); 
orientation.setTheta((float) (entity.getLocation().getTilt())); 

'방향'I가 작성한 라인에 '방향'변수 (edu.nps.moves.dis.Orientation)이다

'실체'나는 선 사용 방법에 대한 매개 변수로 통과에 '엔티티'변수 (법인 내 프로그램에서 다른 클래스 인)입니다 :

public static EntityStatePdu createPdu(Entity entity){... 

을하지만 어떤 이유로이 때 내 프로그램을 실행, 비록 첫 번째 시뮬레이션에서 생성 된 엔티티가 두 번째 시뮬레이션에 표시되는 것을 볼 수 있지만, 두 번째 시뮬레이션에서는 지형을 따라 이동할 때 (첫 번째 시뮬레이션에서 명령 된대로), 두 번째 시뮬레이션에서는 대면하지 않습니다. 그들이 움직이는 방향, 그들은 단지 그 방향으로 움직입니다. 차량이 옆으로 움직이는 지 등).

내 프로그램을 실행할 때, 나는, 콘솔 창은 그 모든 이제 다시 일부 debug-를 표시 열이 그라는 메시지가 밖으로 던졌습니다 :

INTERNAL ERROR: java.lang.ArrayIndexOutOfBoundsException: 154

이 특히 - 이것도 내가 왜 아무 생각을 실제로 EntityStateFormatter.java 클래스에 배열이 없기 때문에 ...

누구든지 아이디어가 있습니까? 미리 감사드립니다!

답변

0

phi/psi/theta는 오일러 각입니다.지금은 PDU의 방향 부분에 각 엔티티에 사용하는 2 또는 3 각도를 설정할 수 있어야합니다 (롤이 필요한지 여부에 따라 다름). 수신 측에서는 게터를 사용하십시오 DIS와 자신의 각도가 맞는지 상관없이 (이는 PDU가 제 3 자 시뮬레이션 구성 요소에 의해 사용되는 경우에만 중요하지만 내부 데이터 교환을 먼저 수행해야합니다). 예 (의사)의 경우

// sender: 
pdu.orientation.setPhi(entity.heading) 
pdu.orientation.setPsi(entity.pitch) 
pdu.orientation.setTheta(entity.roll) 

// receiver: 
entity.heading = pdu.orientation.getPhi() 
entity.pitch = pdu.orientation.getPsi() 
entity.roll = pdu.orientation.getTheta() 

당신이 위의 작품, 당신은, PSI 세타를 피하도록 각도를 변환하는 방법을 알아낼 수 있다는 것을 보여 일단

. wikipedia의 Euler Angles 페이지를 살펴보십시오. 많은 변환 공식을 포함하고 있습니다. 논의 된 오리엔테이션 시스템 중 어느 것이 당신의 엔티티에 사용하고 있는지를 결정하는 데 필요한 모든 것이 있습니다.

관련 문제