게임에 두 개의 벡터가 있습니다. 하나의 벡터가 플레이어이고, 하나의 벡터가 객체입니다. 또한 플레이어가 직면 할 방향을 지정하는 벡터가 있습니다. 방향 벡터에는 z 부분이 없습니다. 원점 주변에 1의 크기를 갖는 점입니다.두 점과 방향 벡터로부터 각도를 계산하십시오.
군인이 현재 향하고있는 방향과 대상 사이의 각도를 계산하여 일부 오디오 (스테레오 전용)를 올바르게 팬 할 수 있습니다.
아래 그림은 내 문제를 설명합니다. 두 점선 사이의 각도를 계산하고 싶습니다. 한 점선은 플레이어와 객체를 연결하고, 다른 하나는 플레이어가있는 지점에서 플레이어가 향하고있는 방향을 나타내는 선입니다. 순간
, 나는이 (플레이어, 객체와 방향이다 3 점, (X, Y, Z)와 모든 벡터 가정)하고있는 중이 야 :Vector3d v1 = direction;
Vector3d v2 = object - player;
v1.normalise();
v2.normalise();
float angle = acos(dotProduct(v1, v2));
을하지만 줄 것으로 보인다 나 부정확 한 결과. 어떤 충고? 코드의
테스트 : 3D 공간에서
Vector3d soldier = Vector3d(1.f, 1.f, 0.f);
Vector3d object = Vector3d(1.f, -1.f, 0.f);
Vector3d dir = Vector3d(1.f, 0.f, 0.f);
Vector3d v1 = dir;
Vector3d v2 = object - soldier;
long steps = 360;
for (long step = 0; step < steps; step++) {
float rad = (float)step * (M_PI/180.f);
v1.x = cosf(rad);
v1.y = sinf(rad);
v1.normalise();
float dx = dotProduct(v2, v1);
float dy = dotProduct(v2, soldier);
float vangle = atan2(dx, dy);
}
귀하의 수학 소리를, 당신은 '잘못된 결과'가 무엇을 의미하는지 명확하게. 그것은 당신이 기대하는 것과 약간의 상쇄입니까? 우리가 테스트 한 번호를 알려주십시오. –
@Ron Warholic, oggmonster : 수학이 정확하지 않습니다. 한 가지 문제는 [acos]는 [0,2pi] 범위의 각도를 원할 때 [0, pi] 범위의 각도를 항상 반환한다는 것입니다. 당신은 정보를 잃어 버리기 때문에 점 제품을 가져 와서 그 각도를 계산할 수는 없습니다. 당신이 필요로하는 것은'-pi, pi]의 범위를 갖는'atan2' 함수입니다. [0,2pi]에 충분히 가깝습니다 - 간단한 함수는 절대적으로 필요하다면 이것을 고칠 수 있지만 음의 각도는 대부분의 경우 큰 문제는 아닙니다. – dvitek
atan2의 두 번째 인수로 무엇을 사용해야합니까? – oggmonster