2016-12-21 7 views
0

아래와 같이 물체를 가리키는 가상 카메라가 있고이 두 물체가 전역 좌표계와 관련하여 방향과 위치로 정의된다고 가정합니다. 도면에서, 흑색은 GCS를 나타내고 청색은 LCS를 나타낸다. 예컨대,이 경우에 화면이나 LED를 같은3D에서 물체의 시야각을 계산하는 방법

Problem

일부 개체는, 시야각을 갖는다. 예를 들어, 관찰자와의 각도가 ± 70 ° 이내 인 경우에만 볼 수 있습니다.

이 문제를 해결하기 위해 지금까지 다음의 의사 코드에 의해 입증 된 단계를 수행했습니다. 적용 가능한 경우 우리는 ZYX 순서로 적용되는 외재 회전을 사용하여 오른 손잡이 좌표계에서 작업합니다.

LEDToWorldTransform = LED.Transform; 
CameraToWorldTransform = Camera.Transform; 
WorldToCameraTransform = CameraToWorldTransform.Inverse; 
CameraToLEDTransform = WorldToCameraTransform * LEDToWorldTransform; 

제가 알다시피 CameraToLEDTransform에는 이제 카메라 좌표계에 대한 LED의 이동 및 회전이 포함되어야합니다. 시각화 목적 : 나는 우리가 카메라의 좌표계에 대한 회전의 Z 구성 요소에 영향을주지 않는 것으로 결론을 내릴 수 있다고 생각 CameraToLEDTransform의 오일러 구성 요소를보고, 막히는 곳

Partial Solution

을 지금 이것은이다 LED보기. 나는 정확하지 않은 다음을 시도했다. 그러나 내가 뭔가 의심, 세 번째 단계에서 나는 그들이이 일종의 올바른 보이는 답을 제공

R_Z, R_Y, R_X = CameraToLEDTransform.Rotation.Eulers 
CameraToLEDTransform.Rotation.Eulers = 0, R_Y, R_X 
CameraToLEDTransform.Rotation *= Rotation.AngleAxis[180deg,X] 
Angle, Axis = CameraToLEDTransform.Rotation.AngleAxis 

같은 방향을 가리하도록 Z 축 중 하나의 방향을 반전하기 위해 노력하고있어, 참고 내 논리를 다음과 같이 어쩌면 잘못된 또한 함께 세 번째 단계를 대체 할 수 있어야한다 :

CameraToLEDTransform.Rotation *= Rotation.AngleAxis[180deg,Y] 

그러나, 이러한 경우가 나는 다른 (확실히 잘못된) 답변을 얻을. 이 접근법은 완전히 틀릴 수도 있습니다. X 주위의 180도 회전이이 상황에서 Y를 중심으로 180도 회전하는 것과 왜 다른지는 분명하지 않습니다. 아마도 대체 방법은 Dot 제품을 사용하여 각도를 계산하는 것이지만 두 회전 사이가 아닌 두 벡터 사이에서만 작동한다고 생각합니다. 두 객체의 방향을 기준으로 두 개의 새 벡터를 투영하는 것은 매우 약 접근 방법 인 것 같습니다.

답변

2

내적을 사용하는 방법은 라운드가 아니므로 올바른 접근 방법입니다. 필요한 각도의 코사인을 얻으려면 카메라의 뷰 방향 벡터와 법선 (즉, 관찰자에서 문제의 LED/대상까지의 벡터) 사이의 내적을 사용해야합니다. 물체가 표면 인 경우 화면처럼이 좋습니다. 대신 표면의 법선을 사용하는 것이 좋습니다. 각도가 필요한 범위 내에있는 경우 확인하면서

// normalized returns a unit vector 
Vector3 normal = (led.position - observer.position).Normalized(); 
Vector3 lookDirection = observer.lookDirection; // Should be a unit vector 

float cosAngle = Vector3.Dot(normal, lookDirection); 

, 우리는 acos 전화를 피하기 위해 cos 함수의 다음과 같은 속성을 사용할 수 있습니다 :

cos(theta) >= cos(angle), -angle <= theta <= angle합니다. (그것을 밖으로 시도하십시오!)

다음과 같이 귀하의 확인은 다음과 같습니다

// You can constantize or precompute this 
float cosViewingAngle = cos(deg2rad(70)); 
bool inViewingAngle = cosAngle >= cosViewingAngle; 
+0

당신이 올바른지를. 나는 잘못된 길로 나를 데려간 나쁜 가정으로 시작했다. – allsey87