如何使用标记vuforia native android使AR视频始终面向用户的相机

时间:2018-05-19 12:57:14

标签: android opengl-es native augmented-reality vuforia

我正在研究标记AR与本机android vuforia我正在尝试做的是根据相机移动我的视频对象(它应该总是面对相机)我试过跟随但它不工作但有时它的工作,但它不是持久性

import win32com.client as win32

xl = win32.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open('file_name')
ws = wb.Worksheets("sheet_name")
dest_cell = ws.Range("C2") #change to your wanted location
obj = ws.OLEObjects()
obj.Add(ClassType=None, Filename='file_path', Link=False, DisplayAsIcon=True, Left=dest_cell.Left, Top=dest_cell.Top, Width=50, Height=50)
wb.Save()
xl.Application.Quit()

到目前为止,我已经尝试了以上,并且它的工作有时但不正确 请帮助我,我试着在一周内完成这项工作。enter image description here

1 个答案:

答案 0 :(得分:1)

  

我要做的是根据相机移动我的视频对象(它应该始终面向相机)

如果您希望对象面向摄像机(Billboarding),则必须使用模型矩阵,该矩阵是逆视图矩阵,但没有翻译部分。 使用Matrix44FInverse来确定Matrix44F的反矩阵:

public void renderFrame(State state, float[] projectionMatrix) {

    .....

    // get the view matrix and set translation part to (0, 0, 0)
    float[] tempViewMat = Tool.convertPose2GLMatrix(trackableResult.getPose()).getData();
    tempViewMat[12] = 0;
    tempViewMat[13] = 0;
    tempViewMat[14] = 0;

    // create the billboard matrix 
    Matrix44F billboardMatrix = new Matrix44F();
    billboardMatrix.setData(tempViewMat);
    billboardMatrix = SampleMath.Matrix44FInverse(billboardMatrix);

    // calculate the model view projection matrix

    float[] viewMatrixVideo = Tool.convertPose2GLMatrix(trackableResult.getPose()).getData();

    float[] modelViewVideo = new float[16];
    Matrix.multiplyMM(modelViewVideo, 0, viewMatrixVideo, 0, billboardMatrix.getData(), 0);

    float[] modelViewProjectionVideo = new float[16];
    Matrix.multiplyMM(modelViewProjectionVideo, 0, projectionMatrix, 0, modelViewVideo, 0);

    .....
}
  

我使用了你的代码,但我的AR在各个方向旋转但我想要一些不同的东西我有一个视频,我想将它垂直放在标记上,如果用户向左或向右移动,那么我想将它旋转到面相机,这样我就可以看到我的AR视频在任何视图中都是垂直的

你想要做的是修正向上的方向,但要将法线向量定位到视线。

视线是Right-Handed Coordinate System中视图空间的反Z轴。

Matrix44F inverse_view = SampleMath.Matrix44FInverse(
    Tool.convertPose2GLMatrix(trackableResult.getPose()));

// line of sight  
Vec3F los = new Vec3F(-inverse_view[8], -inverse_view[9], -inverse_view[10] );

Eiterh Y轴(0,1,0)或模型的Z轴(0,1,0)必须是Z-方向矩阵的轴。 X轴是视线的交叉积(Vec3FCross)和方向矩阵的Z轴。

e.g。

Vec3F z_axis = new Vec3F(0, 0, 1);
Vec3F x_axis = Vec3FNormalize(Vec3FCross(los, z_axis));
Vec3F y_axis = Vec3FCross(z_axis, x_axis);

float[] orientationMatrix = new float[]{
    x_axis.getData()[0], x_axis.getData()[1], x_axis.getData()[2], 0,
    y_axis.getData()[0], y_axis.getData()[1], y_axis.getData()[2], 0,
    z_axis.getData()[0], z_axis.getData()[1], z_axis.getData()[2], 0,
    0,                   0,                   0,                   1
};

// calculate the model view projection matrix

float[] viewMatrixVideo = Tool.convertPose2GLMatrix(trackableResult.getPose()).getData();

float[] modelViewVideo = new float[16];
Matrix.multiplyMM(modelViewVideo, 0, viewMatrixVideo, 0, orientationMatrix, 0);

float[] modelViewProjectionVideo = new float[16];
Matrix.multiplyMM(modelViewProjectionVideo, 0, projectionMatrix, 0, modelViewVideo, 0);