2013-02-25 63 views
1

我正在开发使用Vuforia的iOS SDK(不团结插件)的iOS应用。Vuforia iOS版SDK:联合ImageTargets&VideoPlayback例如

我想将VideoPlaybackImageTargets样品混合在一起。从论坛建议我开始videoplayback示例,并集成imageTarget。在编辑EAGLView文件后,该应用程序会同时获得视频和3D模型,但不会显示3D模型。当图像被跟踪时,它将获得renderFrameQCAR中的3D对象并打印日志。

我能不明白的地方去看看。有没有人尝试过,没有Unity的支持?任何帮助表示赞赏。

+0

您是否找到了解决办法?我面临同样的问题.. – TKumar 2013-03-07 11:35:16

+0

烨我张贴的答案 – EarlySun 2013-03-14 10:16:10

+0

我正在寻找可申请样品版本2.6.6 – Raptor 2013-11-27 06:07:46

回答

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"); 
} 

只是确保你所有的东西正确加载,应该只是罚款。

+0

**注:**这不适用于样本版本2.6.6 – Raptor 2013-11-27 06:06:02

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"); 

我希望这可以帮助任何人......

哦,顺便说一句,你需要把在的appdelegate视频这个目标和透明背景纹理,使这项工作就像一个魅力 问候