Объедините jMonkeyEngine и Vuforia: геометрия не остается в центре цели

Я пытаюсь объединить Vuforia SDK и jMonkeyEngine. Пока куб находится на цели (ImageTarget). Но когда я двигаю камеру, куб тоже немного двигается. Я хочу, чтобы куб оставался в центре цели (как чайник в VuforiaSamples ImageTarget). У вас есть идея, как я могу решить проблему?

Я думаю, что это соответствующий код:

public void initForegroundCamera()
{
    foregroundCamera = new Camera(settings.getWidth(), settings.getHeight());

    foregroundCamera.setLocation(new Vector3f(0.0f, 0.0f, 0.0f));

    // Get perspective transformation
    CameraCalibration cameraCalibration = CameraDevice.getInstance().getCameraCalibration(); 

    VideoBackgroundConfig config = Renderer.getInstance().getVideoBackgroundConfig();

    float viewportWidth = config.getSize().getData()[0];
    float viewportHeight = config.getSize().getData()[1];

    float cameraWidth = cameraCalibration.getSize().getData()[0];
    float cameraHeight = cameraCalibration.getSize().getData()[1];

    float screenWidth = settings.getWidth();
    float screenHeight = settings.getHeight();

    Vec2F size = new Vec2F(cameraWidth, cameraHeight);
    Vec2F focalLength = cameraCalibration.getFocalLength();

    float fovRadians = 2 * (float) Math.atan(0.5f * (size.getData()[1] / focalLength.getData()[1]));
    float fovDegrees = fovRadians * 180.0f / (float) Math.PI;
    float aspectRatio = (size.getData()[0] / size.getData()[1]);

    // Adjust for screen / camera size distortion
    float viewportDistort = 1.0f;

    if (viewportWidth != screenWidth)
    {
        viewportDistort = viewportWidth / screenWidth;
        fovDegrees = fovDegrees * viewportDistort;
        aspectRatio = aspectRatio / viewportDistort;
        Log.v(TAG, "viewportDistort: " + viewportDistort + " fovDegreed: " + fovDegrees + " aspectRatio: " + aspectRatio); 
    }

    if (viewportHeight != screenHeight)
    {
        viewportDistort = viewportHeight / screenHeight;
        fovDegrees = fovDegrees / viewportDistort;
        aspectRatio = aspectRatio * viewportDistort;
        Log.v(TAG, "viewportDistort: " + viewportDistort + " fovDegreed: " + fovDegrees + " aspectRatio: " + aspectRatio); 
    }

    setCameraPerspectiveFromVuforia(fovDegrees, aspectRatio);

    setCameraViewportFromVuforia(viewportWidth, viewportHeight, cameraWidth, cameraHeight);

    ViewPort foregroundViewPort = renderManager.createMainView("ForegroundView", foregroundCamera);
    foregroundViewPort.attachScene(rootNode);
    foregroundViewPort.setClearFlags(false, true, false);
    foregroundViewPort.setBackgroundColor(ColorRGBA.Blue);

    sceneInitialized = true;
}

private void ProcessTrackable(TrackableResult result, int i)
{
    // Show the 3D object corresponding on the found trackable
    Spatial model = rootNode.getChild(0);
    model.setCullHint(CullHint.Dynamic);

    Matrix44F modelViewMatrix_Vuforia = Tool.convertPose2GLMatrix(result.getPose());
    Matrix44F inverseMatrix_Vuforia = MathHelpers.Matrix44FInverse(modelViewMatrix_Vuforia);
    Matrix44F inverseTransposedMatrix_Vuforia = MathHelpers.Matrix44FTranspose(inverseMatrix_Vuforia);

    float[] modelViewMatrix = inverseTransposedMatrix_Vuforia.getData();

    // Get camera position
    float cam_x = modelViewMatrix[12];
    float cam_y = modelViewMatrix[13];
    float cam_z = modelViewMatrix[14];

    // Get camera rotation
    float cam_right_x = modelViewMatrix[0];
    float cam_right_y = modelViewMatrix[1];
    float cam_right_z = modelViewMatrix[2];
    float cam_up_x =    modelViewMatrix[4];
    float cam_up_y =    modelViewMatrix[5];
    float cam_up_z =    modelViewMatrix[6];
    float cam_dir_x =   modelViewMatrix[8];
    float cam_dir_y =   modelViewMatrix[9];
    float cam_dir_z =   modelViewMatrix[10];


    setCameraPoseFromVuforia(cam_x, cam_y, cam_z);
    setCameraOrientationFromVuforia(cam_right_x, cam_right_y, cam_right_z, cam_up_x, cam_up_y, cam_up_z, cam_dir_x, cam_dir_y, cam_dir_z);

}

//we modify the left axis of the JME camera to match the coodindate system used by Vuforia
private void setCameraPerspectiveFromVuforia(float fovY, float aspectRatio) 
{

    foregroundCamera.setFrustumPerspective(fovY, aspectRatio, 1.0f, 1000.0f); 
    foregroundCamera.update();
}

private void setCameraPoseFromVuforia(float camX, float camY, float camZ)
{
    foregroundCamera.setLocation(new Vector3f(camX, camY, camZ));
    foregroundCamera.update();
}

private void setCameraOrientationFromVuforia(float camRightX, float camRightY, float camRightZ, float camUpX, float camUpY, float camUpZ, float camDirX, float camDirY, float camDirZ)
{
    foregroundCamera.setAxes(new Vector3f(-camRightX, -camRightY, -camRightZ), new Vector3f(-camUpX, -camUpY, -camUpZ), new Vector3f( camDirX, camDirY, camDirZ));
    foregroundCamera.update();
}

1 ответ

Я также реализовал Vuforia с JMonkey Engine. Я должен признать, что шаткое движение 3D-моделей заметно даже тогда, когда я держу телефон неподвижно, тогда как использование движка рендеринга OpenGl только с Vuforia не дает таких результатов.

Причиной может быть то, что на экране отображается Quad с текстурой, выводимой с камеры, а также требуется некоторое время для изменения каждого кадра. Более того, во время работы моего приложения телефон сильно нагревается, поэтому я думаю, что это слишком большая нагрузка для процессора.

Другие вопросы по тегам