加载Obj 文件首先需要了解Obj 文件的格式
“#” 号开头的行为注释,在程序加载的过程中可以省略
“v” 号开头的为存放顶点的坐标,其后面的3个数值分别表示一个顶点的x,y,z 坐标。
"vt"开头的用于存放顶点纹理坐标,其后面的3个数值分别表示纹理坐标的S,T,W
"vn" 开头的用于存放法向量,其后面的3个数值 分别表示一个顶点的法向量在x,y,z的分量
"g" 表示一组的开始,后面的字符串为此组的名称。所谓组是指由顶点组成的一些面的几何。只包含“g”的行表示一组的结束,与“g”开头的行对应
“f”开头的行表示组中的一个面,如果是三角形(OpenGL只支持三角形)则后面有3组用空格分隔的数据,代表三角形的3个顶点。 每组顶点包含3个数值,用 “/” 分割,依次表示顶点坐标的 数据索引,顶点纹理坐标的数据索引,顶点法向量的数据索引.
分割每组 数据 采用 String.split() ,在Obj 中,每行数据 中用 空格间断,所以要用正则表达式
String[] tempsa=temps.split("[ ]+");
意思是 按照 空格(1个或者多个) 进行数据的分割
!!好像没什么好讲的~~上一份来自 OpenGL es 2.0 游戏开发 的读取obj 方法,不包括骨骼,以及动画。
唯一要讲的是,书上给出的obj 法向量是需要自己计算的,并没有在obj文件中给出这里涉及了2中 计算法向量的方式
1 采用面法向量 计算法,也就是说该点在的面的 法向量,即是该点的发现量,
这种计算的方法适合于 菱角分明的模型,如矩形。(也许会想,同一个点,可能涉及了多个面,那到底是哪个面的法向量呢?~是这样的,我们绘制的用的是
GL_Triangle 的方式绘制面,也就是说 每3个点就一个面,即每个点只会涉及一个面~~)
2. 采用点法向量 计算法,
一般曲面采取该方法计算,会得到更加平滑的法向量 计算光照, 每个顶点的法向量 = 临近3个面的法向量的 平均值。。
!
计算面的法向量使用 叉积计算, 如 面由 0 1 2 三个顶点组成 那么 0->1 0->2 两个向量的 叉积即使 该面的法向量
package com.bn.Sample9_4;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import android.content.res.Resources;
import android.util.Log;
public class LoadUtil
{
//求两个向量的叉积
public static float[] getCrossProduct(float x1,float y1,float z1,float x2,float y2,float z2)
{
//求出两个矢量叉积矢量在XYZ轴的分量ABC
float A=y1*z2-y2*z1;
float B=z1*x2-z2*x1;
float C=x1*y2-x2*y1;
return new float[]{ A,B,C};
}
//向量规格化
public static float[] vectorNormal(float[] vector)
{
//求向量的模
float module=(float)Math.sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);
return new float[]{ vector[0]/module,vector[1]/module,vector[2]/module};
}