当前位置:  编程技术>移动开发
本页文章导读:
    ▪M3G课程:进阶篇(四)模型        M3G教程:进阶篇(四)模型   import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.m3g.Camera; import javax.microedition.m3g.Graphics3D; import javax.microedition.m3g.Light; imp.........
    ▪ wtk下可以播放, 真机下为啥就放不出来呢        wtk上可以播放, 真机上为啥就放不出来呢? 很简单的一个j2me播放程序 , 装到手机上就是放不出来, 为什么呢? ......
    ▪ 3DS MAX导出M3G卡通片       3DS MAX导出M3G动画 1、用3D Studio Max或者Maya的插件h3texporter导出的文件格式是.h3t的文件。.h3t的文件是一个文本文件,可以用记事本,写字板或者其他的文本编辑工具打开。.h3t文件描述了所创建.........

[1]M3G课程:进阶篇(四)模型
    来源: 互联网  发布时间: 2014-02-18
M3G教程:进阶篇(四)模型

 

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Object3D;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.World;


public class M3GCanvas extends GameCanvas implements Runnable {
	
	public static final int FPS = 50;	//每秒绘制的帧数
	
//	 Thread-control
	boolean running = false;

	boolean done = true;

	// If the game should end
	public static boolean gameOver = false;

	// Rendering hints
	public static final int STRONG_RENDERING_HINTS = Graphics3D.ANTIALIAS
			| Graphics3D.TRUE_COLOR | Graphics3D.DITHER;

	public static final int WEAK_RENDERING_HINTS = 0;

	public static int RENDERING_HINTS = STRONG_RENDERING_HINTS;

	// Key array
	boolean[] key = new boolean[5];

	// Key constants
	public static final int FIRE = 0;
	public static final int UP = 1;
	public static final int DOWN = 2;
	public static final int LEFT = 3;
	public static final int RIGHT = 4;

	// Global identity matrix
	Transform identity = new Transform();

	// Camera rotation
	float camRot = 0.0f;

	double camSine = 0.0f;

	double camCosine = 0.0f;

	// Head bobbing
	float headDeg = 0.0f;

	private Graphics3D g3d;
	private World world;
	private boolean runnable=true;
	private Thread thread;
	private Camera camera;

	protected M3GCanvas() {
		super(false);
		setFullScreenMode(true);
		g3d = Graphics3D.getInstance();
		
		//Load our world
		loadWorld();

		// Load our camera
		loadCamera();
	}
	
	/** Loads our camera */
	private void loadCamera() {
		// BAD!
		if (world == null)
			return;

		// Get the active camera from the world
		camera = world.getActiveCamera();

		// Create a light
		Light l = new Light();

		// Make sure it's AMBIENT
		l.setMode(Light.AMBIENT);

		// We want a little higher intensity
		l.setIntensity(3.0f);

		// Add it to our world
		world.addChild(l);
	}

	/** Loads our world */
	private void loadWorld() {
		try {
			// Loading the world is very simple. Note that I like to use a
			// res-folder that I keep all files in. If you normally just put
			// your
			// resources in the project root, then load it from the root.
			Object3D[] buffer = Loader.load("/map.m3g");

			// Find the world node, best to do it the "safe" way
			for (int i = 0; i < buffer.length; i++) {
				if (buffer[i] instanceof World) {
					world = (World) buffer[i];
					break;
				}
			}

			// Clean objects
			buffer = null;
		} catch (Exception e) {
			// ERROR!
			System.out.println("Loading error!");
			reportException(e);
		}
	}
	
	private void moveCamera() {
		// Check controls
		if (key[LEFT]) {
			camRot += 5.0f;
		} else if (key[RIGHT]) {
			camRot -= 5.0f;
		}

		// Set the orientation
		camera.setOrientation(camRot, 0.0f, 1.0f, 0.0f);

		// Calculate trigonometry for camera movement
		double rads = Math.toRadians(camRot);
		camSine = Math.sin(rads);
		camCosine = Math.cos(rads);

		if (key[UP]) {
			// Move forward
			camera.translate(-2.0f * (float) camSine, 0.0f, -2.0f
					* (float) camCosine);

			// Bob head
			headDeg += 0.5f;

			// A simple way to "bob" the camera as the user moves
			camera.translate(0.0f, (float) Math.sin(headDeg) / 3.0f, 0.0f);
		} else if (key[DOWN]) {
			// Move backward
			camera.translate(2.0f * (float) camSine, 0.0f,
					2.0f * (float) camCosine);

			// Bob head
			headDeg -= 0.5f;

			// A simple way to "bob" the camera as the user moves
			camera.translate(0.0f, (float) Math.sin(headDeg) / 3.0f, 0.0f);
		}

		// If the user presses the FIRE key, let's quit
		if (key[FIRE])
			System.out.println("Fire");
	}
	
	private void reportException(Exception e) {
		System.out.println(e.getMessage());
		System.out.println(e);
		e.printStackTrace();
	}
	
	protected void process() {
		int keys = getKeyStates();

		if ((keys & GameCanvas.FIRE_PRESSED) != 0)
			key[FIRE] = true;
		else
			key[FIRE] = false;

		if ((keys & GameCanvas.UP_PRESSED) != 0)
			key[UP] = true;
		else
			key[UP] = false;

		if ((keys & GameCanvas.DOWN_PRESSED) != 0)
			key[DOWN] = true;
		else
			key[DOWN] = false;

		if ((keys & GameCanvas.LEFT_PRESSED) != 0)
			key[LEFT] = true;
		else
			key[LEFT] = false;

		if ((keys & GameCanvas.RIGHT_PRESSED) != 0)
			key[RIGHT] = true;
		else
			key[RIGHT] = false;
	}

	public void run() {
		Graphics g = getGraphics();
		while (runnable) {
			long startTime = System.currentTimeMillis();
			
			//Call the process method (computes keys)
			process();

			//Move the camera around
			moveCamera();
			
			try {
				//First bind the graphics object. We use our pre-defined rendering
				// hints.
				g3d.bindTarget(g, true, RENDERING_HINTS);
				//Now, just render the world. Simple as pie!
				g3d.render(world);
			} finally {
				g3d.releaseTarget();
			}
			flushGraphics();
			
			long endTime = System.currentTimeMillis();
            long costTime = endTime - startTime;
            if(costTime<1000/FPS)
            {
                try{
                  Thread.sleep(1000/FPS-costTime);
                }
                catch(Exception e){
                   e.printStackTrace();
                }
            }
		}
		System.out.println("Canvas stopped");

	}
	
	public void start()
	{
		thread=new Thread(this);
		thread.start();
	}
	
	public void stop()
	{
		this.runnable=false;
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 效果如下:


    
[2] wtk下可以播放, 真机下为啥就放不出来呢
    来源: 互联网  发布时间: 2014-02-18
wtk上可以播放, 真机上为啥就放不出来呢?
很简单的一个j2me播放程序 , 装到手机上就是放不出来, 为什么呢?

    
[3] 3DS MAX导出M3G卡通片
    来源: 互联网  发布时间: 2014-02-18
3DS MAX导出M3G动画

1、用3D Studio Max或者Maya的插件h3texporter导出的文件格式是.h3t的文件。.h3t的文件是一个文本文件,可以用记事本,写字板或者其他的文本编辑工具打开。.h3t文件描述了所创建的模型的所有信息(例如顶点信息,面的信息,骨骼动画的信息,关键帧的信息等)。

2、将.h3t文件用转换工具M3G Converter转换成为.m3g文件从而用JSR184API识别和导入。

相关下载:

这个插件是由日本的HI公司所开发的,具体的插件可以在下面的link下载:http://www.mascotcapsule.com/toolkit/m3g/en/index.html。这个链接页面上有上面提到的插件跟工具下载链接。

注意事项:

1、导出h3t文件切记贴图文件也在导出路径下,否则会出现M3G模块没有贴图的情况。

2、物体的材质必须选择“H3T Material”,如下:

3、对于面的贴图出现纹理坐标不对的情况,可以在3ds max中加个修改器“UVW贴图”,将参数“贴图”改为“面”就可以了(或者使用“平面项”,并调整其长度跟宽度跟你的平面对应)

4、如果导出的h3t文件和m3g文件都能在M3G Viewer中播放,而导入J2ME项目时出现异常:

java.io.IOException: no ':' in URL
at javax.microedition.m3g.Loader.loadHelper(+375)

......

请检查我是否把纹理图像也拷进项目里,而且不能使用TGA格式,目前我只发现PNG格式是支持的,不知还支持哪些格式。

 

以下是我从魔兽的模型文件中转换过来的样图:


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3