Qualcomm AR SDK之替换模型(已解决模型贴图问题)

ARVR技术交流群:129340649

欢迎加入!


求从事移动应用开发以及基于移动终端的AR应用开发的朋友,一起做一些事!有兴趣可以给我私信,谢谢!

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。

首先来简单看一下生成的头文件的内容:

/*                                                          
created with obj2opengl.pl                                  
                                                            
source file    : .\banana.obj                               
vertices       : 4032                                       
faces          : 8056                                       
normals        : 4032                                       
texture coords : 4420                                       
                                                            
                                                            
// include generated arrays                                 
#import ".\banana.h"                                        
                                                            
// set input data to arrays                                 
glVertexPointer(3, GL_FLOAT, 0, bananaVerts);               
glNormalPointer(GL_FLOAT, 0, bananaNormals);                
glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords);         
                                                            
// draw data                                                
glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts);              
*/                                                          
                                                            
unsigned int bananaNumVerts = 24168;                        
                                                            
float bananaVerts [] = {                                    
  // f 231/242/231 132/142/132 131/141/131                  
  0.172233487787643, -0.0717437751698985, 0.228589675538813,
  0.176742968653347, -0.0680393472738536, 0.2284149434494,  
  0.167979223684599, -0.0670168837233226, 0.24286384937854, 
  // f 131/141/131 230/240/230 231/242/231                  
  0.167979223684599, -0.0670168837233226, 0.24286384937854, 
  0.166391290343292, -0.0686544011752973, 0.241920432968569,
………………

由于篇幅有限制截取这么一点。其实已经够了,下面的都是类似这样的坐标值。那主要有哪些呢?看下面这些就可以了,在程序里面需要用到的就是这些。opengl的基础知识,这里就不赘述了。

// include generated arrays                                 
#import ".\banana.h"                                        
                                                            
// set input data to arrays                                 
glVertexPointer(3, GL_FLOAT, 0, bananaVerts);               
glNormalPointer(GL_FLOAT, 0, bananaNormals);                
glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords);         
                                                            
// draw data                                                
glDrawArrays(GL_TRIANGLES, 0, bananaNumVerts);

切入正题:

准备工作:把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一直cdimagetargets目录后NDK-build可得结果。

最后效果图如下:

 

 

更新:最近在一个美女程序猿的帮助下解决了模型贴图的问题,现在简单说下具体流程,并附上官方方法:

高通采用的是UV贴图,正常展UV即可,但是坐标有问题,贴上去的就上面的图一样。下面是官方的解决方法:

Qualcomm AR SDK之替换模型(已解决模型贴图问题)_第1张图片Qualcomm AR SDK之替换模型(已解决模型贴图问题)_第2张图片

就是将贴图垂直翻转,注意不是旋转。你可以使用PS,或者画图工具

Qualcomm AR SDK之替换模型(已解决模型贴图问题)_第3张图片

最后的效果下图所示:

Qualcomm AR SDK之替换模型(已解决模型贴图问题)_第4张图片Qualcomm AR SDK之替换模型(已解决模型贴图问题)_第5张图片


^_^本团队专业从事移动增强现实应用开发以及解决方案,有合作请私信联系!^_^


 


 

 

你可能感兴趣的:(Vuforia,AR,SDK,高通增强现实开发,Activeperl,android,qualcomm,AR)