3

如何在 Vuforia 的 Image Target 示例中更改带有文本内容的茶壶?

该示例位于:https ://developer.vuforia.com/resources/sample-apps/image-targets-sample-app

4

1 回答 1

3

我试图访问 mbrenon 提供的链接。不幸的是,他们没有加载。

我的解决方案:

您拥有 Teapot 的原因是因为 Vuforia 使用该类作为要显示的图像。为了有平面文本,我创建了自己的 PlaneTextClass。

  1. 转到 src->main->java->com.qualcomm.vuforia.samples->SampleApplication->utils。在那里你可以找到你可以使用的对象。

  2. 添加一个名为“TextPlane”并从“MeshObject”扩展的类

    public class TextPlane extends MeshObject {
    
      private final static double planeVertices[] =
            {
                    -50f, -50f, 0.0f, 50f, -50f, 0.0f, 50f, 50f, 0.0f, -50f, 50f, 0.0f
            };
      private final static double planeTexcoords[] =
            {
                    0, 0, 1, 0, 1, 1, 0, 1
            };
      private final static double planeNormals[] =
            {
                    0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1
            };
      private final static short planeIndices[] =
            {
                    0, 1, 2, 0, 2, 3
            };
    
    
      private Buffer mVertBuff;
      private Buffer mTexCoordBuff;
      private Buffer mNormBuff;
      private Buffer mIndBuff;
    
      public TextPlane(){
        mVertBuff = fillBuffer(planeVertices);
        mTexCoordBuff = fillBuffer(planeTexcoords);
        mNormBuff = fillBuffer(planeNormals);
        mIndBuff = fillBuffer(planeIndices);
      }
    
      @Override
      public Buffer getBuffer(BUFFER_TYPE bufferType) {
        Buffer result = null;
        switch (bufferType)
        {
            case BUFFER_TYPE_VERTEX:
                result = mVertBuff;
                break;
            case BUFFER_TYPE_TEXTURE_COORD:
                result = mTexCoordBuff;
                break;
            case BUFFER_TYPE_INDICES:
                result = mIndBuff;
                break;
            case BUFFER_TYPE_NORMALS:
                result = mNormBuff;
            default:
                break;
         }
        return result;
      }
    
      @Override
      public int getNumObjectVertex() {
          return planeVertices.length / 3;
      }
    
      @Override
      public int getNumObjectIndex() {
          return planeIndices.length;
      }}
    

如果要更改图像的大小,请更改 PlaneVertices[] 中的值。

  1. 转到 src->main->java->com.qualcomm.vuforia.samples->VuforiaSamples->app->ImageTargets->ImageTargetRenderer.java

  2. 在 ImageTargetRenderer.java 中添加新类:

private TextPlane mTextPlane;

  1. 在方法 initRendering() 中初始化 mTextPlane

mTextPlane = new TextPlane();

  1. 用新的文本平面代码替换茶壶代码:

替换这个:

GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT,
                        false, 0, mTeapot.getVertices());
                GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT,
                        false, 0, mTeapot.getNormals());
                GLES20.glVertexAttribPointer(textureCoordHandle, 2,
                        GLES20.GL_FLOAT, false, 0, mTeapot.getTexCoords());

有了这个:

GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT,
                        false, 0, mTextPlane.getVertices());
                GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT,
                        false, 0, mTextPlane.getNormals());
                GLES20.glVertexAttribPointer(textureCoordHandle, 2,
                        GLES20.GL_FLOAT, false, 0, mTextPlane.getTexCoords());
  1. 替换这个:

GLES20.glDrawElements(GLES20.GL_TRIANGLES, mTeapot.getNumObjectIndex(), GLES20.GL_UNSIGNED_SHORT, mTeapot.getIndices());

有了这个:

GLES20.glDrawElements(GLES20.GL_TRIANGLES,
                            mTextPlane.getNumObjectIndex(), GLES20.GL_UNSIGNED_SHORT,
                            mTextPlane.getIndices());
  1. 试试看。它应该工作!
于 2015-09-17T14:07:23.493 回答