Я работаю над приложением Android AR. Я использую библиотеку RAJAWALI для рендеринга AR и openCV для обнаружения и отслеживания целей. Я вычисляю матрицу вращения и перемещения, используя функцию PNPRansac от opencv.
cv::Mat rotation=cv::Mat::zeros(3, 1, CV_64FC1);
cv::Mat translation=cv::Mat::zeros(3, 1, CV_64FC1);
TranslationMatrix=cv::Mat::zeros(3, 1, CV_64FC1);
RotationMatrix=cv::Mat::zeros(3, 3, CV_64FC1);
if (!cv::solvePnPRansac(objectPoints_float,
scenePoints_float,
cameraParams.cameraMatrix,
cameraParams.distortionMatrix,
rotation,
translation,
false,
iterationsCount,
cameraParams.reprojectionError,
confidence)) {
rotation.release();
translation.release();
return;
}
TranslationMatrix = translation;
cv::Rodrigues(rotation,
RotationMatrix); // converts Rotation Vector to Matrix
cv::Mat R_t, A;
R_t = cv::Mat::zeros(3, 3, CV_64FC1);
A = cv::Mat::zeros(3, 1, CV_64FC1);
A.at<double>(0, 0) = 0;//[0]
A.at<double>(1, 0) = 0;//[0]
A.at<double>(2, 0) = 1;//[1]
//transpose of rotation matrix
R_t = RotationMatrix.t();
// Reference for this formula https://en.wikipedia.org/wiki/Camera_resectioning
cameraPosition = -1 * (R_t * TranslationMatrix);
//CameraOrientation = R_t * A;
//CameraOrientation = rot2euler(RotationMatrix).clone();
Я пытаюсь передать это вращение и положение на камеру Раджавали, чтобы получить опыт AR. Положение кажется правильным, но вращение установлено неправильно.
У меня есть это в onRender
сцены Раджавали:
// Get camera position and rotation from C++ to Java using native method
getCameraPositionRotation(cameraPosition.getNativeObjAddr(), cameraOrientation.getNativeObjAddr());
double POSx = cameraPosition.get(0, 0)[0] / 1000;
double POSy = cameraPosition.get(1, 0)[0] / 1000;
double POSz = cameraPosition.get(2, 0)[0] / 1000;
double ROTx = Math.toDegrees(cameraOrientation.get(0, 0)[0]);
double ROTy = Math.toDegrees(cameraOrientation.get(1, 0)[0]);
double ROTz = Math.toDegrees(cameraOrientation.get(2, 0)[0]);
getCurrentCamera().setPosition(POSx, POSy, POSz);
getCurrentCamera().setRotation(ROTx,ROTy,ROTz);
Как правильно настроить вращение камеры Раджавали?