当前位置: 代码迷 >> java >> Android ARToolkit - 标记的位置
  详细解决方案

Android ARToolkit - 标记的位置

热度:85   发布时间:2023-07-17 21:10:07.0

我正在使用ARToolkit for android并尝试在检测到的标记上写一个文本。 我想使用简单的TextView来做到这一点。 所以我只使用ARToolkit来找到标记。

但是我怎样才能找到我的相机预览标记是正确的(我需要坐标),所以我可以在标记上面找TextView?

提前致谢 !

两条评论都是正确的,ARToolkit同时返回投影矩阵和转换矩阵。 两者都设计用于OpenGL,而不是标准的Android视图。 将投影矩阵应用于相机,并将变换应用于对象(姿势矩阵)

如果您只想显示文本,我建议您使用Unity插件,然后使用Unity UI组件添加画布和附加到标记的文本。 这些组件已经设计为3D对象(如果你这样做,记得将画布设置为“World Space”

您拥有的其他选项是:

a)将文本渲染为纹理并在Quad上绘制,您可以根据具有立方体的示例执行此操作。

b)使用矩阵和使用转换矩阵(Android类)对位置和旋转的TextView应用转换进行一些矩阵计算。 尽管可能,但涉及的数学相当复杂。 如果你想让它只是浮动看着相机,setTranslationX,Y和Z就足够了。

c)将3D引擎与文本渲染功能链接到ARToolkit。 我用jPCT-AE完成了这个。 虽然这有效,但它需要做很多工作。 我打算很快写下来。

还有另一种选择来检测标记角点。 它需要对包装器代码进行一些更改并重新编译Android二进制文件。

分叉或克隆artoolkit5 github存储库并进行以下更改:

在ARMarker.h中添加一个条目

float cornerPoints[8];

在ARMarkerSquare.cpp中,在确定标记可见的代码之后,对updateWithDetectedMarkers方法进行更改,更新cornerPoints:

// Consider marker visible if a match was found.
    if (k != -1) {
        visible = true;
        m_cf = markerInfo[k].cf;
        for (int c = 0; c < 4; c++) {
            cornerPoints[c*2] = markerInfo[k].vertex[c][0];
            cornerPoints[c*2 + 1] = markerInfo[k].vertex[c][1];
        }

添加一个新方法ARToolKitWrapperExportedAPI.cpp来检索角点:

EXPORT_API bool arwQueryMarkerCornerPoints(int markerUID, float points[8])
{
 ARMarker *marker;

if (!gARTK) return false;
if (!(marker = gARTK->findMarker(markerUID))) {
    gARTK->logv(AR_LOG_LEVEL_ERROR, "arwQueryMarkerCornerPoints(): Couldn't locate marker with UID %d.", markerUID);
    return false;
}
for (int i = 0; i < 8; i++) points[i] = (float)marker->cornerPoints[i];
return marker->visible;

}

并为此添加JNI定义:

JNIEXPORT jfloatArray JNICALL JNIFUNCTION(arwQueryMarkerCornerPoints(JNIEnv *env, jobject obj, jint markerUID))
{
float trans[8];

if (arwQueryMarkerCornerPoints(markerUID, trans)) return glArrayToJava(env, trans, 8);
return NULL;

}

毕竟,我使用build.sh脚本重新编译android目录中的ARWrapper共享对象,并使用这些新的共享对象。

在他的NativeInterface.java中添加以下方法:

/**
 * Retrieves the corner points for the specified marker
 *
 * @param markerUID The unique identifier (UID) of the marker to check
 * @return A float array of size 8 containing the corner points starting at top left (x,y) top right, bottom right, bottom left.
 * So
 */
public static native float[] arwQueryMarkerCornerPoints(int markerUID);

最后将方法添加到ARToolKit.java:

/**
 * Retrieves the corner points for the specified marker
 *
 * @param markerUID The unique identifier (UID) of the marker to check
 * @return A float array of size 8 containing the corner points starting at top left (x,y) top right, bottom right, bottom left.
 *
 */
public float[] arwQueryMarkerCornerPoints(int markerUID) {
    if (!initedNative) return null;
    return NativeInterface.arwQueryMarkerCornerPoints(markerUID);
}

也可以看看:

可以在此fork中看到更改: :

  相关解决方案