Vuforia 收藏本版 已有9人收藏 +发表新主题
查看: 62061|回复: 0
打印 上一主题 下一主题

[分享] Qualcomm AR SDK之替换模型

[复制链接]

[分享] Qualcomm AR SDK之替换模型

精华AngleYF 发表于 2013-6-1 11:12:37 浏览:  62061 回复:  0 只看该作者 复制链接
1、将模型转换为.obj格式,这个通过很多三维软件都可以实现,我用的是3Dmax。
2、将obj文件转换为.h文件
因为高通ARsdk识别的是这类的头文件。头文件中包含了这个模型的坐标数据。提取这些坐标数据通过OpenGL进行渲染就可以绘制出图形。这是后话。现在介绍怎么将obj文件转为头文件。首先从网上下载ActivePerl和obj2opengl.pl。ActivePerl是一个perl的脚本解释器。obj2opengl.pl就是使用perl语言写的一个脚本程序。顾名思义,就可以知道这个脚本程序的作用就是将obj->opengl能够使用的头文件。这两个可以在下面这个链接下载:
http://download.csdn.net/detail/ggtaas/4998573
http://download.csdn.net/detail/ggtaas/4998714
ActivePerl解压之后直接安装,一般安装在c盘的perl文件夹下,然后将第二个压缩包解压得到的obj2opengl.pl文件拷贝进bin文件夹下。这样这个工具就可以用了。很简单吧。下面将你需要转换的obj文件也拷贝进bin文件夹中,例如是banana.obj,再运行下面的dos命令就可以了,见下图:



这样你会发现你的bin文件夹下就多生成了一个banana.h文件。
3、替换模型,这里我们以ImageTargets为例,将生成的banana.h文件替换程序中的teapot.h。
首先来简单看一下生成的头文件的内容:
  1.     <span style="font-family:SimSun;font-size:14px;">/*                                                           
  2.     created with obj2opengl.pl                                   
  3.                                                                  
  4.     source file    : .\banana.obj                                
  5.     vertices       : 4032                                       
  6.     faces          : 8056                                       
  7.     normals        : 4032                                       
  8.     texture coords : 4420                                       
  9.                                                                  
  10.                                                                  
  11.     // include generated arrays                                 
  12.     #import ".\banana.h"                                         
  13.                                                                  
  14.     // set input data to arrays                                 
  15.     glVertexPointer(3, GL_FLOAT, 0, bananaVerts);               
  16.     glNormalPointer(GL_FLOAT, 0, bananaNormals);                 
  17.     glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords);         
  18.                                                                  
  19.     // draw data                                                
  20.     glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts);               
  21.     */                                                            
  22.                                                                   
  23.     unsigned int bananaNumVerts = 24168;                          
  24.                                                                   
  25.     float bananaVerts [] = {                                      
  26.       // f 231/242/231 132/142/132 131/141/131                    
  27.       0.172233487787643, -0.0717437751698985, 0.228589675538813,  
  28.       0.176742968653347, -0.0680393472738536, 0.2284149434494,   
  29.       0.167979223684599, -0.0670168837233226, 0.24286384937854,   
  30.       // f 131/141/131 230/240/230 231/242/231                    
  31.       0.167979223684599, -0.0670168837233226, 0.24286384937854,   
  32.       0.166391290343292, -0.0686544011752973, 0.241920432968569,  
  33.     ………………</span>  
复制代码
由于篇幅有限制截取这么一点。其实已经够了,下面的都是类似这样的坐标值。那主要有哪些呢?看下面这些就可以了,在程序里面需要用到的就是这些。opengl的基础知识,这里就不赘述了。
  1.     <span style="font-family:SimSun;font-size:14px;">// include generated arrays                                   
  2.     #import ".\banana.h"                                          
  3.                                                                   
  4.     // set input data to arrays                                   
  5.     glVertexPointer(3, GL_FLOAT, 0, <span style="color:#ff0000;">bananaVerts</span>);                 
  6.     glNormalPointer(GL_FLOAT, 0, <span style="color:#ff0000;">bananaNormals</span>);                  
  7.     glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords);           
  8.                                       <span style="color:#ff0000;">               </span>            
  9.     // draw data                                                  
  10.     glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts);</span>  
复制代码
切入正题:
准备工作:把banana.h拷贝到jni文件夹下。把banana.jpg拷贝到assets文件下。在ImageTargets文件夹打开Jni文件夹。打开ImageTargets.cpp
1.#include"Teapot.h" ->#include"banana.h"
2.
glTexCoordPointer(2, GL_FLOAT, 0, (const GLvoid*)&teapotTexCoords[0]);
       glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*) &teapotVertices[0]);
       glNormalPointer(GL_FLOAT, 0, (const GLvoid*) &teapotNormals[0]);
       glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT,
                      (const GLvoid*)&teapotIndices[0]);
改为:
glTexCoordPointer(2, GL_FLOAT, 0, (constGLvoid*) &bananaTexCoords[0]);
       glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*) & bananaVerts [0]);
       glNormalPointer(GL_FLOAT, 0, (const GLvoid*) &bananaNormals[0]);
       glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts);
3.
       glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (constGLvoid*) &teapotVertices[0]);
       glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (constGLvoid*) &teapotNormals[0]);
       glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (constGLvoid*) &teapotTexCoords[0]);
改为:
       glVertexAttribPointer(vertexHandle,3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaVerts[0]);
       glVertexAttribPointer(normalHandle,3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaNormals[0]);
       glVertexAttribPointer(textureCoordHandle,2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &bananaTexCoords[0]);
4.
      glDrawElements(GL_TRIANGLES,NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&teapotIndices[0]);
改为:
      glDrawArrays(GL_TRIANGLES, 0,bananaNumVerts);
5. 设置 kObjectScale= 120.f;
为了使模型的大小适当,否则模型太小了。
6.打开src文件夹,com文件夹,qualcomm文件夹,打开ImageTargets.java。在private void loadTextures()添加: mTextures.add(Texture.loadTextureFromApk("banana.jpg",getAssets())); 如下所示:
    private voidloadTextures()
    {
       mTextures.add(Texture.loadTextureFromApk("banana.jpg",getAssets()));
       //mTextures.add(Texture.loadTextureFromApk("TextureTeapotBrass.png", getAssets()));
       //mTextures.add(Texture.loadTextureFromApk("TextureTeapotBlue.png", getAssets()));
       //mTextures.add(Texture.loadTextureFromApk("TextureTeapotRed.png", getAssets()));      
    }
7.在cygwin一直cd到imagetargets目录后NDK-build可得结果。
最后效果图如下:


问题:现在换模型是可以实现了,但是有的模型包含多个贴图,本人能力有限,还贴不好。希望有兴趣的可以一起研究交流一下,也希望高手可以指导一下,~_~谢谢!本人QQ:472947433
如果大家觉得有什么问题或者建议的话也可以联系我!
如果图片看不清,大家可以去CSDN看一下http://blog.csdn.net/ggtaas/article/details/8507049



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.