`
micheal19840929
  • 浏览: 167324 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一点对m3g模型文件解析的工作

    博客分类:
  • J2ME
阅读更多

因为最近不会在m3g文件上继续工作,把之前一点少少的工作放出来,希望可以有点帮助

/*
 * Main.java
 *
 * Created on 2005年5月15日, 下午11:41
 */
package m3gloader;
import java.io.*;
import java.util.zip.*;
/**
 *
 * @author admin
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        File f=new File("otokka_jump2.m3g");
        System.out.println("\nFile \""+f.toString()+"\" exists? : "+f.exists());
        if(!f.exists())
            err("File "+f.toString()+" does not exists!");
        FileInputStream fis=new FileInputStream(f);
        M3GDataInputStream dis=new M3GDataInputStream(fis);
        System.out.println("====== File identifier ======");
        byte[] fileIdentifier=new byte[12];
        if(dis.available()>=12){
            dis.read(fileIdentifier);
            System.out.println("File Identifier is: ");
            for(int l=0;l<fileIdentifier.length;l++)
                System.out.print(fileIdentifier[l]+" ");
            System.out.print("\nFile Identifier characters is: \n");
            System.out.println(new String(fileIdentifier));
            System.out.println("====== end of file identifier ======\n");
        } else
            err("File Identifier Error! ");
        
        /*
        Section 0: Header Object
         */
        System.out.println("====== Section 0: Header Object ======");
        if(dis.available()<5)
            err("Section 0: Header error! ");
        System.out.println("CompressionScheme: "+dis.readByte());
        UInt32 totalSectionLength=dis.readUInt32();
        //We have read 5 bytes.So we just check if (totalSectionLength.longvalue()-5) is available.
        if(dis.available()<totalSectionLength.longvalue()-5)
            err("Section 0: Content error! ");
        System.out.println("TotalSectionLength: "+totalSectionLength);
        System.out.println("UncompressedLength: "+dis.readUInt32());
        System.out.println("$$$$$$ Objects $$$$$$");
        System.out.println("ObjectType: "+dis.readByte());
        //length1 is the length of 1st object we load, length2 is the 2nd.
        UInt32 length1=dis.readUInt32();
        System.out.println("Length: "+length1);
        
        System.out.print("VersionNumber: ");
        System.out.print(dis.readByte()+".");
        System.out.println(dis.readByte());
        
        System.out.println("hasExternalReferences: "+dis.readBoolean());
        System.out.println("TotalFileSize: "+dis.readUInt32());
        System.out.println("ApproximateContentSize: "+dis.readUInt32());
        
        /*
        Head Object contain:
        Byte[2] VersionNumber
        Boolean hasExternalReferences
        UInt32  TotalFileSize
        UInt32  ApproximateContentSize
        String  AuthoringField
        So AuthoringField's length is object (length-11)
         */
        byte[] authoringField=new byte[length1.intvalue()-11];
        dis.readFully(authoringField);
        System.out.println("------ AuthoringField ------");
        System.out.println(new String(authoringField,"UTF-8"));
        System.out.println("------ End of AuthoringField ------");
        System.out.println("$$$$$$ End of Objects $$$$$$");
        System.out.println("Checksum: "+dis.readUInt32());
        System.out.println("====== End of Section 0: Header Object ======\n");
        
        
        //new section
        System.out.println(dis.readByte());
        System.out.println(dis.readUInt32());
        System.out.println(dis.readUInt32());
        M3GInflaterInputStream iis=new M3GInflaterInputStream(fis);
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        /////////////////////a camera
        //user id
        System.out.println(iis.readUInt32());
        //animation track
        System.out.println(iis.readUInt32());
        //user para
        System.out.println(iis.readUInt32());
        //hasComponentTransform;
        System.out.println(iis.read());
        //hasGeneralTransform;
        System.out.println(iis.read());
        //enable rendering
        System.out.println(iis.read());
        // enablePicking;
        System.out.println(iis.read());
        // alphaFactor;
        System.out.println(iis.read());
        //scope;
        System.out.println(iis.readUInt32());    
        //hasAlignment;
        System.out.println(iis.read());
        //h
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());    
        System.out.println(iis.readUInt32());    
        System.out.println(iis.readUInt32());    
        System.out.println(iis.readUInt32());    
/////////////next object/////////////////////
        //image 2d
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        //user id
        System.out.println(iis.readUInt32());
        //animation tracks
        System.out.println(iis.readUInt32());
        //user object
        System.out.println(iis.readUInt32());
        //format
        System.out.println(iis.read());
        //is mutable
        System.out.println(iis.read());
        //width
        System.out.println(iis.readUInt32());
        //height
        System.out.println(iis.readUInt32());
        //  palette;
        System.out.println(iis.read());
        //pixels;
        System.out.println(iis.read());
        /*
        for(int l=0;l<4894;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<40;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<66;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<66;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<66;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<41;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<29;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<25;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
        
        for(int l=0;l<68;l++)
            iis.read();
        System.out.println(iis.read());
        System.out.println(iis.readUInt32());
    */
        dis.close();
        fis.close();
    }
    
    public static void err(String msg){
        System.out.println("\n**** An error has occured!!! The program was terminated!!! The errot infomation is: ");
        System.out.println(msg+"\n");
        System.exit(0);
    }
    
    static class M3GDataInputStream extends DataInputStream{
        
        public M3GDataInputStream(InputStream in){
            super(in);
        }
        
        public UInt32 readUInt32() throws IOException {
            int ch1 = in.read();
            int ch2 = in.read();
            int ch3 = in.read();
            long ch4 = in.read();
            //System.out.println(ch1+" "+ch2+" "+ch3+" "+ch4);
            if ((ch1 | ch2 | ch3 | ch4) < 0)
                throw new EOFException();
            return new UInt32((ch1 << 0) + (ch2 << 8) + (ch3 << 16) + (ch4 << 24));
        }
    }
    
    static class M3GInflaterInputStream extends InflaterInputStream{
        
        public M3GInflaterInputStream(InputStream in){
            super(in,new Inflater(),32);
        }
        
        public UInt32 readUInt32() throws IOException {
            int ch1 = super.read();
            int ch2 = super.read();
            int ch3 = super.read();
            long ch4 = super.read();
            //System.out.println(ch1+" "+ch2+" "+ch3+" "+ch4);
            if ((ch1 | ch2 | ch3 | ch4) < 0)
                throw new EOFException();
            return new UInt32((ch1 << 0) + (ch2 << 8) + (ch3 << 16) + (ch4 << 24));
        }
    }
    static class Float32{
        
    }
    static class UInt32{
        private long value;
        
        public UInt32(long value){
            this.value=value;
            Integer f=new Integer(2);
            
        }
        
        public long longvalue(){
            return value;
        }
        
        public int intvalue(){
            if(value > 2147483647 && value < -2147483648)
                throw new ClassCastException();
            return (int)value;
        }
        
        public String toString(){
            return Long.toString(value);
        }
    }
}

 

分享到:
评论

相关推荐

    tk_m3gtk_v4_5.zip_m3g_tk_m3g_tk_m3gtk_v4_5

    1. **M3G解析器**:这是程序的核心部分,负责读取M3G文件的二进制数据,解析出模型的几何信息、材质属性、光照设置、动画序列等,并将其转化为可以显示的结构。 2. **3D渲染引擎**:利用Java J2ME的图形库,将解析...

    LoaderM3G.rar_j2me loaderm_m3g_手机加载_手机游戏加载

    3. **加载模型**:根据解析出的数据,创建M3G模型实例,并将它们添加到场景中。 4. **应用纹理和动画**:将M3G文件中包含的纹理映射到模型表面,并根据需要启动动画。 5. **渲染帧**:使用M3G API的渲染函数,每帧...

    M3GToolkit-0.5.0

    《M3GToolkit-0.5.0:深入解析M3G文件检查工具》 M3GToolkit-0.5.0是一款专为J2ME(Java 2 Micro Edition)开发者设计的实用工具,用于检查和分析M3G(Mobile 3D Graphics)文件。在移动设备上的3D图形开发中,M3G...

    Eclipse M3g Viewer-开源

    Eclipse M3g Viewer 的出现,极大地便利了开发者对M3G格式文件的检查和调试。 此插件适用于Eclipse 3.1版本或更高,具体要求为I20050627构建或更新版本。这意味着,如果你的Eclipse版本低于这个要求,可能无法正常...

    [JSR-184][3D编程指南]Part V: Heightmap terrain rendering using M3G

    6. **光照和纹理**:M3G提供了光照模型,可以添加光源来模拟真实世界的光照效果。同时,通过`Texture2D`对象加载地形纹理,结合高度信息进行混合,使地形更具视觉吸引力。 7. **渲染**:最后,调用`World`对象的`...

    j2me实现3D效果

    在J2ME程序中,我们需要解析这些文件并将数据加载到M3G对象中。 2. **场景管理**:创建一个3D场景,包括定义物体的位置、旋转和缩放,以及它们之间的关系。这通常涉及对M3G的WorldNode和GroupNode类的使用。 3. **...

    模型读取库assimp.zip_文件格式_Others_

    - 其他:除了这些,assimp还支持许多其他格式,如3DS、FBX、BLEND、COLLADA、GLTF、MD5、MD2、MD3、MDL、M3G、3DMAX、X、3DSMAX、PLY、STL、IFC、B3D、NFF、OFF、ASE、Q3D、Q3BSP、RAW、WOX、X3D、ZGL等。...

    Autodesk 3dsMax exporters for 3DVIA Studio

    本文将深入探讨"Autodesk 3dsMax exporters for 3DVIA Studio"这一主题,解析如何利用3dsMax的导出功能,将精心制作的3D模型无缝导入到3DVIA Studio中,以便于分享、协作和展示。 3dsMax支持的版本包括9、2008、...

    j2me 开发手机3D图形程序源代码

    2. **加载模型**:在J2ME程序中读取模型文件,解析顶点、纹理和索引信息。 3. **渲染设置**:配置光照、相机视角和渲染参数。 4. **绘制模型**:通过调用M3G API的函数将模型渲染到屏幕上。 5. **动画和交互**:实现...

    ColombiaEGM08_STM32F103_Colombia_

    压缩包内的“ColombiaEGM08.byn”文件可能是项目的数据文件,格式可能是专有的或经过压缩的,用于存储与EGM08相关的地球重力模型数据。这种数据通常由一系列的重力场系数组成,用于计算地球表面或近地空间的重力场。...

    基于stm32f103的3d打印机

    再者,**G代码解析**是将3D模型转换为机器可理解指令的过程。STM32F103可以读取并解析G代码文件,将指令转化为电机运动信号。G代码是一种通用的编程语言,用于指示3D打印机进行特定的移动和操作。 此外,**温度控制...

    基于MATLAB模型的南水北调受水县城地下水开采量预测与评价.pdf

    根据提供的文件信息,以下是关于“基于MATLAB模型的南水北调受水县城地下水开采量预测与评价”的知识点解析: 1. 南水北调项目背景 南水北调是我国为了解决北方地区水资源短缺问题,特别是京津冀地区水资源供需矛盾...

    实现技术报告.docx

    在程序中直接使用M3G文件,不仅简化了开发流程,还能确保游戏运行时的流畅性和稳定性。 ### 蓝牙技术 #### RFCOMM协议 项目中还实现了蓝牙技术,以便支持双人对战模式。这一功能的实现基于RFCOMM协议,该协议是一...

    基于stm32F103的GRBL 0.9版本的移植

    GRBL是一种开源的G代码解析器,主要用于控制小型数控机床,如3D打印机和激光切割机。它将接收到的G代码指令转化为精确的电机运动命令。STM32F103是意法半导体(STMicroelectronics)生产的一款基于ARM Cortex-M3内核...

    基于j2me的手机3D赛车游戏源码

    j2ME的M3G库支持模型加载和渲染,以及纹理的映射和管理。 5. **声音和动画**:虽然j2ME的音频功能相对有限,但仍然可以实现简单的音效和背景音乐。动画则可能通过改变模型的位置和角度来实现,比如赛车的行驶和转弯...

    GRBL控制代码,仅供参考

    2. **G代码编程**:理解G代码的基本语法和用途,如上述的G00、G01等,以及M代码(辅助功能),如M3/M4(启动主轴正转/反转),M5(停止主轴)。 3. **速度控制**:GRBL允许通过G代码设置进给速度(F值)和主轴速度...

    三轴步进电机控制

    G代码生成通常由CAD/CAM软件完成,它可以基于设计模型自动生成对应的运动轨迹。 实现这一控制过程通常分为以下几个步骤: 1. **G代码解析**:STM32F205接收到G代码后,解析代码中的各个命令,如G01(直线插补)、...

    J2ME 3D手机游戏开发详解

    保留模式构造3D场景章节讲解了如何加载和解析M3G文件,以及使用3ds max、Maya和Blender等软件构建3D场景,并展示了如何浏览M3G文件。 3D动画制作章节则涵盖了动画的基本概念,如关键帧序列、动画轨迹和动画控制器,...

    基于STM32矿用3D打印机.pdf

    文章未提供系统软件设计的具体内容,但从其设计思路可以看出,软件部分应该包括对硬件的精确控制逻辑,比如模型数据的解析、温度控制算法、运动轨迹规划和用户交互界面的设计。考虑到3D打印机需要精确控制三维打印...

    AD7606采集程序

    STM32F103ZGT6是意法半导体(STMicroelectronics)生产的一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设接口和高速处理能力,适用于实时控制和数据处理。在这个项目中,STM32F103ZGT6作为主控芯片,通过其...

Global site tag (gtag.js) - Google Analytics