1但指、將模型轉(zhuǎn)換為.obj格式寡痰,這個通過很多三維軟件都可以實現(xiàn),我用的是3Dmax棋凳。
2拦坠、將obj文件轉(zhuǎn)換為.h文件
因為高通ARsdk識別的是這類的頭文件。頭文件中包含了這個模型的坐標(biāo)數(shù)據(jù)剩岳。提取這些坐標(biāo)數(shù)據(jù)通過OpenGL進(jìn)行渲染就可以繪制出圖形贞滨。這是后話。現(xiàn)在介紹怎么將obj文件轉(zhuǎn)為頭文件拍棕。首先從網(wǎng)上下載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文件拷貝進(jìn)bin文件夾下事甜。這樣這個工具就可以用了。很簡單吧滔韵。下面將你需要轉(zhuǎn)換的obj文件也拷貝進(jìn)bin文件夾中逻谦,例如是banana.obj,再運(yùn)行下面的dos命令就可以了陪蜻,見下圖:
這樣你會發(fā)現(xiàn)你的bin文件夾下就多生成了一個banana.h文件邦马。
3、替換模型囱皿,這里我們以ImageTargets為例勇婴,將生成的banana.h文件替換程序中的teapot.h。
首先來簡單看一下生成的頭文件的內(nèi)容:
<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>
由于篇幅有限制截取這么一點嘱腥。其實已經(jīng)夠了,下面的都是類似這樣的坐標(biāo)值拘悦。那主要有哪些呢?看下面這些就可以了齿兔,在程序里面需要用到的就是這些。opengl的基礎(chǔ)知識础米,這里就不贅述了分苇。
<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>
切入正題:
準(zhǔn)備工作:把banana.h拷貝到j(luò)ni文件夾下。把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. 設(shè)置 kObjectScale= 120.f;
為了使模型的大小適當(dāng),否則模型太小了蘑斧。
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可得結(jié)果。
最后效果圖如下:
更新:最近在一個美女程序猿的幫助下解決了模型貼圖的問題捕传,現(xiàn)在簡單說下具體流程惠拭,并附上官方方法:
高通采用的是UV貼圖,正常展UV即可庸论,但是坐標(biāo)有問題职辅,貼上去的就上面的圖一樣。