Qualcomm AR SDK之替换模型(一)
来源:互联网 发布:江苏移动网络电视伴侣 编辑:程序博客网 时间:2024/05/21 09:58
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。
首先来简单看一下生成的头文件的内容:
由于篇幅有限制截取这么一点。其实已经够了,下面的都是类似这样的坐标值。那主要有哪些呢?看下面这些就可以了,在程序里面需要用到的就是这些。opengl的基础知识,这里就不赘述了。
切入正题:
准备工作:把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可得结果。
最后效果图如下:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<span style="font-family:SimSun;font-size:14px;">/*
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,
………………</span>
由于篇幅有限制截取这么一点。其实已经够了,下面的都是类似这样的坐标值。那主要有哪些呢?看下面这些就可以了,在程序里面需要用到的就是这些。opengl的基础知识,这里就不赘述了。
1
2
3
4
5
6
7
8
9
10
<span style="font-family:SimSun;font-size:14px;">// include generated arrays
#import ".\banana.h"
// set input data to arrays
glVertexPointer(3, GL_FLOAT, 0, <span style="color:#ff0000;">bananaVerts</span>);
glNormalPointer(GL_FLOAT, 0, <span style="color:#ff0000;">bananaNormals</span>);
glTexCoordPointer(2, GL_FLOAT, 0, bananaTexCoords);
<span style="color:#ff0000;"> </span>
// draw data
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可得结果。
最后效果图如下:
0 0
- Qualcomm AR SDK之替换模型(一)
- Qualcomm AR SDK之替换模型(已解决模型贴图问题)
- Qualcomm AR SDK之替换模型(已解决模型贴图问题)
- Qualcomm AR之Vuforia SDK框架
- Qualcomm AR之目标识别、跟踪
- Qualcomm AR之创建简单工程
- Catchoom AR SDK应用一
- 高通增强现实SDK开发实例,COCOACHINA首发。qualcomm ar sdk
- QualComm AR 笔记
- Vuforia SDK----重新看世界 —— Qualcomm Vuforia™ AR/VR开发者沙龙
- [ios版本]AR 现实增强之高通Vuforia QCAR SDK (一)
- 基于高通AR SDK的Demo总结(一)——常规3D模型的行为脚本
- 初识Qualcomm Adreno SDK
- 初识Qualcomm Adreno SDK
- Qualcomm Vuforia SDK背景
- 初识Qualcomm Adreno SDK
- AR涂涂乐项目之识别图制作模型的制作一
- Vuforia SDK---- AR开发旋转缩放模型功能
- SVN安装配置与使用
- 签了工作之后才发现,自己太草率了.....我看过的关于职业规划最好最全面的一篇文章 分类: 体会
- POJ3261 Milk Patterns
- 【黑马程序员】面向对象总结
- C++中的结构的使用
- Qualcomm AR SDK之替换模型(一)
- 华为招聘机试整理5:简单四则运算
- POJ 2823 Sliding Window(线段树入门)
- TreeMap学习笔记(一)
- 高通ARIOS源码开发之更换识别卡片以及更换模型
- Visual Studio 问题集
- POJ3254--Corn Fields
- NSFileManager 创建,复制,删除,剪切文件
- Linux网络编程:基于TCP的程序开发