ARCore - получить угол наклона камеры к миру вперед (ось -Z) - PullRequest
0 голосов
/ 04 октября 2019

Есть ли способ получить угол, на который направлена ​​камера ARCore, по сравнению с одной из осей ARCore в углах Эйлера? Я понимаю, что мы можем получить прямой вектор камеры ARCore, но я не уверен, как получить правильный угол, который можно рассчитать из этого.

1 Ответ

0 голосов
/ 11 октября 2019

Вероятно, задумался над проблемой. Вот простой способ получить угол, с которым камера обращена к оси -Z (положительный угол находится справа от оси -Z). Этот метод также можно использовать для определения угла, на который камера направлена ​​и к другой оси.

// get the camera
Camera arCamera = arFragment.getArSceneView().getScene().getCamera();

// get forward vector of the camera
Vector3 cameraPos = arCamera.getWorldPosition();
Vector3 cameraForward = Vector3.add(cameraPos, arCamera.getForward().scaled(1.0f));
Vector3 forwardVector = Vector3.subtract(cameraForward, cameraPos);
forwardVector = new Vector3(forwardVector.x, 0, forwardVector.z).normalized();

double degreesFromCamToNegZAxis = Vector3.angleBetweenVectors(Vector3.forward(), forwardVector);

// take the dot product between the two vectors
// to see from what side of the -Z axis it is facing
float dotProduct = Vector3.dot(Vector3.right(), forwardVector);

// value is between -1 to 1 
// if negative, forward vector is facing to the right of -Z axis
if (dotProduct < 0) {
    degreesFromCamToNegZAxis = -degreesFromCamToNegZAxis;
}

Если вы хотите разобраться с другой осью, просто измените вектор на мир, который вы пытаетесь связать с ним, вот так. В этом примере положительный угол находится справа от положительной оси Z.

double degreesFromCamToZAxis = Vector3.angleBetweenVectors(Vector3.back(), forwardVector);

// take the dot product between the two vectors
// to see from what side of the Z axis it is facing
float dotProduct = Vector3.dot(Vector3.left(), forwardVector);

// value is between -1 to 1
// if negative, forward vector is facing to the left of Z axis
if (dotProduct < 0) {
    degreesFromCamToZAxis = -degreesFromCamToZAxis;
}

Это изображение, которое визуализирует систему координат, которую использует ARCore (аналогично сенсорам Android). Справочная система координат ARCore

...