首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android ARToolkit -标记位置

Android ARToolkit -标记位置
EN

Stack Overflow用户
提问于 2015-07-31 02:13:25
回答 2查看 2.1K关注 0票数 3

我正在使用android的ARToolkit,并尝试在检测到的标记上写一个文本。我想用一个简单的TextView来做这件事。因此,我只使用ARToolkit来查找标记。

但是我怎么才能找到我的相机预览标记的正确位置呢?否(我需要坐标),这样我就可以在标记上添加TextView了?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-08-01 12:24:31

这两个注释都是正确的,ARToolkit同时返回投影矩阵和转换矩阵。两者都是为使用OpenGL而设计的,而不是标准的安卓视图。投影矩阵应用于相机,变换矩阵应用于对象(姿态矩阵)

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

您拥有的其他选项包括:

a)将文本渲染为纹理并将其绘制在四边形上,您可以基于具有立方体的示例来执行此操作。

b)使用matrix和apply transformation to the TextView on position and rotation使用转换矩阵( Android类)进行一些矩阵计算。虽然这是可能的,但涉及的数学计算相当复杂。如果你想让它只是漂浮在相机上,setTranslationX,Y和Z应该足够了。

c)将具有文本渲染功能的3D引擎链接到ARToolkit。我已经用jPCT-AE做到了这一点。虽然这是可行的,但它需要相当多的工作。我计划很快写下这方面的内容。

票数 3
EN

Stack Overflow用户

发布于 2016-08-18 03:58:23

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

派生或克隆artoolkit5 github存储库,并进行以下更改:

将条目添加到ARMarker.h

代码语言:javascript
复制
float cornerPoints[8];

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

代码语言:javascript
复制
// 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以检索角点:

代码语言:javascript
复制
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定义:

代码语言:javascript
复制
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共享对象,并使用了这些新的共享对象。

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

代码语言:javascript
复制
/**
 * 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:

代码语言:javascript
复制
/**
 * 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);
}

另请参阅:

https://archive.artoolkit.org/community/forums/viewtopic.php?f=26&t=16099

在这个分支中也可以看到这些变化:https://github.com/ekkelenkamp/artoolkit5/tree/marker_corner_points

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31731120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档