1

Vuforia iOS SDK (Unity プラグインではありません) を使用して iOS アプリを開発しています。

VideoPlaybackImageTargetsサンプルを混ぜたい。フォーラムの提案から、私は videoplayback サンプルから始め、それに imageTarget を統合しました。EAGLView ファイルを編集した後、アプリはビデオと 3D モデルの両方を取得しますが、3D モデルは表示しません。画像が追跡されると、内部の 3D オブジェクトが取得され、renderFrameQCARログが出力されます。

どこを見たらいいのかわからない。Unity のサポートなしでこれを試してみた人はいますか? どんな助けでも大歓迎です。

4

2 に答える 2

0

VideoPlayback プロジェクトの作業を開始し、EAGLViewサンプル用のファイルのみを変更して、ファイルをインポートしTeapot.hますEAGLview.m

ImageTargets名前空間宣言内の先頭からコード部分を追加します。

const float kObjectScale = 3.0f;
const char* textureFilenames[] = {
    "icon_play.png",
    "icon_loading.png",
    "icon_error.png",
    "VuforiaSizzleReel_1.png",
    "VuforiaSizzleReel_2.png",

    // added for 3d model
    "TextureTeapotBrass.png",
    "TextureTeapotBlue.png",
    "TextureTeapotRed.png"
};

この関数を追加します (からImageTargets)

- (void)setup3dObjects
{
for (int i=0; i < [textures count]; ++i) {
    Object3D* obj3D = [[Object3D alloc] init];
    if (i >= 5)
    {
        obj3D.numVertices = NUM_TEAPOT_OBJECT_VERTEX;
        obj3D.vertices = teapotVertices;
        obj3D.normals = teapotNormals;
        obj3D.texCoords = teapotTexCoords;
        obj3D.numIndices = NUM_TEAPOT_OBJECT_INDEX;
        obj3D.indices = teapotIndices;
    }
    obj3D.texture = [textures objectAtIndex:i];
    [objects3D addObject:obj3D];
    [obj3D release];
}
}

次に、 のRenderFrameQCAR後:

int numActiveTrackables = state.getNumTrackableResults();

3D モデルのコードを追加、ImageTargetsサンプルから取得

for (int i = 0; i < state.getNumTrackableResults(); ++i) {
    // Get the trackable
    const QCAR::TrackableResult* result = state.getTrackableResult(i);
    const QCAR::Trackable& trackable = result->getTrackable();
    QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());

    // Choose the texture based on the target name
    int targetIndex = 0; // "stones"
    if (!strcmp(trackable.getName(), "chips"))
        targetIndex = 1;
    else if (!strcmp(trackable.getName(), "tarmac"))
        targetIndex = 2;
    Object3D *obj3D = [objects3D objectAtIndex:targetIndex+5];

    // OpenGL 2
    QCAR::Matrix44F modelViewProjection;
    ShaderUtils::translatePoseMatrix(0.0f, 0.0f, kObjectScale, &modelViewMatrix.data[0]);
    ShaderUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]);
    ShaderUtils::multiplyMatrix(&qUtils.projectionMatrix.data[0], &modelViewMatrix.data[0], &modelViewProjection.data[0]);
    glUseProgram(shaderProgramID);
    glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.vertices);
    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.normals);
    glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.texCoords);
    glEnableVertexAttribArray(vertexHandle);
    glEnableVertexAttribArray(normalHandle);
    glEnableVertexAttribArray(textureCoordHandle);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, [obj3D.texture textureID]);
    glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
    glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
    glDrawElements(GL_TRIANGLES, obj3D.numIndices, GL_UNSIGNED_SHORT, (const GLvoid*)obj3D.indices);
    ShaderUtils::checkGlError("EAGLView renderFrameQCAR");
}

すべてのものが正しくロードされていることを確認してください。問題なく動作するはずです。

于 2013-03-14T10:25:21.177 に答える
0

この答えは、実際の経験に基づいています。

私は videoplayback 呼び出しで 3d モデルを呼び出します。

if (strcmp(imageTarget.getName(), "affogato") == 0)
{
const int kObjectScale = 500;
[self secondSetup3dObjects];
playerIndex = 99;
const QCAR::TrackableResult* result = state.getTrackableResult(i);
QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());
int targetIndex = 9;
Object3D *obj3D = [objects3D objectAtIndex:targetIndex];
QCAR::Matrix44F modelViewProjection;
ShaderUtils::translatePoseMatrix(0.0f, 0.0f, 50.0f, &modelViewMatrix.data[0]);
ShaderUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]);
ShaderUtils::multiplyMatrix(&qUtils.projectionMatrix.data[0], &modelViewMatrix.data[0], &modelViewProjection.data[0]);
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.vertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.normals);
            glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.texCoords);

glEnableVertexAttribArray(vertexHandle);
            glEnableVertexAttribArray(normalHandle);
            glEnableVertexAttribArray(textureCoordHandle);

            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, [obj3D.texture textureID]);
            glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
            glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
            glDrawArrays(GL_TRIANGLES, 0,  obj3D.numVertices);

            ShaderUtils::checkGlError("EAGLView renderFrameQCAR");

これが誰にも役立つことを願っています...

ああ、ところで、アプリにビデオをこのターゲットに委任し、透明な背景をテクスチャに配置して、この作品を魅力的なものにする必要があります よろしく

于 2013-07-31T23:12:08.280 に答える