如何在opengl中实现桌子
如何在opengl中实现桌子,上网上查看后说要用建模导入,但是我画好了后保存为3ds不知道怎样导入到opengl,不知道有其他的方法没 --------------------编程问答-------------------- 有没办法将模型转为Opengl支持的数组格式。 --------------------编程问答-------------------- 有这么想的,但是代码的量比较大,不是很容易。 --------------------编程问答-------------------- public class Max3DSParser extends AParser implements IParser {private final int IDENTIFIER_3DS = 0x4D4D;
private final int MESH_BLOCK = 0x3D3D;
private final int OBJECT_BLOCK = 0x4000;
private final int TRIMESH = 0x4100;
private final int TRI_MATERIAL = 0x4130;
private final int VERTICES = 0x4110;
private final int FACES = 0x4120;
private final int TEXCOORD = 0x4140;
private final int TEX_MAP = 0xA200;
private final int TEX_NAME = 0xA000;
private final int TEX_FILENAME = 0xA300;
private final int MATERIAL = 0xAFFF;
private int chunkID;
private int chunkEndOffset;
private boolean endReached;
private String currentObjName;
public Max3DSParser(Resources resources, String resourceID, boolean generateMipMap) {
super(resources, resourceID, generateMipMap);
} --------------------编程问答-------------------- @Override
public void parse() {
InputStream fileIn = resources.openRawResource(resources.getIdentifier(
resourceID, null, null));
BufferedInputStream stream = new BufferedInputStream(fileIn);
Log.d(Min3d.TAG, "Start parsing object");
co = new ParseObjectData();
parseObjects.add(co);
try {
readHeader(stream);
if(chunkID != IDENTIFIER_3DS)
{
Log.d(Min3d.TAG, "Not a valid .3DS file!");
return;
}
else
{
Log.d(Min3d.TAG, "Found a valid .3DS file");
}
while(!endReached)
{
readChunk(stream);
}
} catch (IOException e) {
e.printStackTrace();
}
Log.d(Min3d.TAG, "End parsing object");
}
private void readHeader(InputStream stream) throws IOException {
chunkID = readShort(stream);
chunkEndOffset = readInt(stream);
endReached = chunkID < 0;
}
private void readChunk(InputStream stream) throws IOException {
readHeader(stream);
switch (chunkID) {
case MESH_BLOCK:
break;
case OBJECT_BLOCK:
currentObjName = readString(stream);
Log.d(Min3d.TAG, "Parsing object " + currentObjName);
break;
case TRIMESH:
if(firstObject)
{
co.name = currentObjName;
firstObject = false;
}
else
{
co = new ParseObjectData();
co.name = currentObjName;
parseObjects.add(co);
}
break;
case VERTICES:
readVertices(stream);
break;
case FACES:
readFaces(stream);
break;
case TEXCOORD:
readTexCoords(stream);
break;
case TEX_NAME:
currentMaterialKey = readString(stream);
break;
case TEX_FILENAME:
String fileName = readString(stream);
StringBuffer texture = new StringBuffer(packageID);
texture.append(":drawable/");
StringBuffer textureName = new StringBuffer(fileName.toLowerCase());
int dotIndex = textureName.lastIndexOf(".");
if (dotIndex > -1)
texture.append(textureName.substring(0, dotIndex));
else
texture.append(textureName);
textureAtlas.addBitmapAsset(new BitmapAsset(currentMaterialKey, texture.toString()));
break;
case TRI_MATERIAL:
String materialName = readString(stream);
int numFaces = readShort(stream);
for(int i=0; i<numFaces; i++)
{
int faceIndex = readShort(stream);
co.faces.get(faceIndex).materialKey = materialName;
}
break;
case MATERIAL:
break;
case TEX_MAP:
break;
default:
skipRead(stream);
}
} --------------------编程问答-------------------- private void skipRead(InputStream stream) throws IOException
{
for(int i=0; (i<chunkEndOffset - 6) && !endReached; i++)
{
endReached = stream.read() < 0;
}
}
private void readVertices(InputStream buffer) throws IOException {
float x, y, z, tmpy;
int numVertices = readShort(buffer);
for (int i = 0; i < numVertices; i++) {
x = readFloat(buffer);
y = readFloat(buffer);
z = readFloat(buffer);
tmpy = y;
y = z;
z = -tmpy;
co.vertices.add(new Number3d(x, y, z));
}
}
private void readFaces(InputStream buffer) throws IOException {
int triangles = readShort(buffer);
for (int i = 0; i < triangles; i++) {
int[] vertexIDs = new int[3];
vertexIDs[0] = readShort(buffer);
vertexIDs[1] = readShort(buffer);
vertexIDs[2] = readShort(buffer);
readShort(buffer);
ParseObjectFace face = new ParseObjectFace();
face.v = vertexIDs;
face.uv = vertexIDs;
face.faceLength = 3;
face.hasuv = true;
co.numFaces++;
co.faces.add(face);
co.calculateFaceNormal(face);
}
}
private void readTexCoords(InputStream buffer) throws IOException {
int numVertices = readShort(buffer);
for (int i = 0; i < numVertices; i++) {
Uv uv = new Uv();
uv.u = readFloat(buffer);
uv.v = readFloat(buffer) * -1f;
co.texCoords.add(uv);
}
}
public Object3dContainer getParsedObject() {
Log.d(Min3d.TAG, "Start object creation");
Object3dContainer obj = new Object3dContainer(0, 0);
int numObjects = parseObjects.size();
Bitmap texture = null;
if(textureAtlas.hasBitmaps())
{
textureAtlas.generate();
texture = textureAtlas.getBitmap();
Shared.textureManager().addTextureId(texture, "atlas", generateMipMap);
}
for (int i = 0; i < numObjects; i++) {
ParseObjectData o = parseObjects.get(i);
Log.d(Min3d.TAG, "Creating object " + o.name);
obj.addChild(o.getParsedObject(textureAtlas));
}
if(textureAtlas.hasBitmaps())
{
if(texture != null) texture.recycle();
}
Log.d(Min3d.TAG, "Object creation finished");
super.cleanup();
return obj;
}
}
--------------------编程问答-------------------- 如果你只是想显示桌子 加上简单的颜色光泽和法线的话 我建议你用obj格式 然后转成自定义的binary 再读取 3ds模型内容很多 读取不是很方便 不过网上有很多loader 也有开源的 你如果想可以去看看 --------------------编程问答-------------------- 上述代码是什么意思阿,不是很明白,能不能讲解一下
--------------------编程问答-------------------- 是3ds文件的一个简单的loader 你上网查都有的
补充:移动开发 , Android