分享
 
 
 

精通Micro3D v3基础技术

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

作者:numenzq 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=1097

现在将带领你使用Mascot Capsule Micro 3D v3进行3D开发,这里有十个简单的例子将一步一步的向你介绍你必须掌握的基本技术。所有例子都基于同一个核心代码去展示一个简单的3D模型。下面是这些例子的基本组织和内容:

例1 简单的显示这是3D模型

例2 按下数字键‘2’,’8’,’4’,’6’)实现3D模型上下左右移动

例3 按下数字键’7’和’9’实现3D模型的缩放效果(注意:缩放模型不是让该模型在Z轴上移动)

例4 按下”Light”键实现在3D场景中添加灯光效果

例5 按下”Perspective”键实现3D模型在平行投影和透视投影之间切换

例6 使用手机的方向键实现3D模型的旋转

例7 给3D模型添加动画效果

例8 添加两个动画,使用数字键’1’进行切换

例9 显示多个3D模型

例10 显示如何在屏幕上绘制一个原始模型

所有的例子可以通过下面的链接下载:

下载源代码

注意:这些程序是使用的Micro3D技术,但并不是很好的编码实践。例如,程序并没有编码实现处理中断退出该程序时正常的软键,只得一直按住”back”键来退出程序

大多数代码都很容易理解,并不需要更多的解释,不过下面还是有些要点需要论述。

例1 简单的显示这是3D模型

下面几行是基本的3D模型和纹理的导入和设置:

figure = new Figure("/example/DemoMIDP/test_model_robo.mbac");

mainTexture = new Texture("/example/DemoMIDP/tex_001.bmp", true);

figure.setTexture(mainTexture);

下面是在Canvas里绘制3D世界

private Graphics3D g3 = new Graphics3D();

protected void paint(Graphics g) {

...

g3.bind(g);

g3.renderFigure(figure, 0, 0, layout, effect);

//Flush to screen

g3.flush();

//Release the Graphics 3D object

g3.release(g);

}

例2 移动模型

AffineTrans类是用来处理所有变换的,例如:移动和旋转。程序在X和Y轴上移动3D模型只需要改变AffineTrans矩阵的两个变量。

affineTrans.m03 += moveX;

affineTrans.m13 += moveY;

例3 缩放模型

要实现3D模型的缩放,我们应该先用比例因数创建一个矩阵,然后添加这个矩阵到AffineTrans矩阵中。

AffineTrans scaleTrans = new AffineTrans();

scaleTrans.set(scaleX,0,0,0,0,scaleY,0,0,0,0,scaleZ,0);

// Scaling the model

affineTrans.mul(scaleTrans);

例4 添加灯光

灯光非常容易设置。一个方向向量和一个亮度值就足够了

private Vector3D dir = new Vector3D(-3511, 731, 878); // Light vector

private final int dirIntensity = 4096; // Light intensity

private final int ambIntensity = 1755; // Ambient light intensity

...

light = new Light(dir,dirIntensity,ambIntensity);

effect = new Effect3D( light, Effect3D.NORMAL_SHADING, true, null);

g3.renderFigure(figure, 0, 0, layout, effect);

...

例5 投影

你可以3D模型上使用透视或平行投影。通过简单的调用实现两者间转换。

// Camera distance

private final static int persNear = 1; // Minimum distance to the camera

private final static int persFar = 4096; // Maximum distance to the camera

private final static int persAngle = 682; // Angle

...

//Setting the projection method

if(persEnabled){

layout.setPerspective(persNear, persFar, persAngle);

}else{

layout.setParallelSize(800, 800);

}

例6 旋转模型

旋转3D模型与例3中的缩放模型是用的同样的技术。你创建一个AffineTrans对象来控制你的旋转数据,并把它的矩阵添加到模型的主AffineTrans里。

// Rotation value

public final static int SPIN_X_PLUS = 100; // Increase or decrease value of the rotation around X axis

public final static int SPIN_Y_PLUS = 100; // Increase or decrease value of the rotation around Y axis

private static int spinX = 0; // X axis rotation value

private static int spinY = 0; // Y axis rotation value

...

kc = getGameAction(kc);

switch (kc) {

case Canvas.UP: // roll up

setSpinX(-SPIN_X_PLUS);

break;

case Canvas.DOWN: // roll down

setSpinX(SPIN_X_PLUS);

break;

case Canvas.LEFT: // roll left

setSpinY(-SPIN_Y_PLUS);

break;

case Canvas.RIGHT: // roll right

setSpinY(SPIN_Y_PLUS);

break;

default:

break;

}

...

AffineTrans rotTrans = new AffineTrans();

//X roll

rotTrans.setIdentity();

rotTrans.setRotationX(spinX);

affineTrans.mul(rotTrans);

//Y roll

rotTrans.setIdentity();

rotTrans setRotationY(spinY);

affineTrans.mul(rotTrans);

例7 模型中的动画效果

这个例子为你演示如何导入.mtra文件里的动画数据并应用于你的3D模型。

action = new ActionTable("/example/DemoMIDP/action_01.mtra");

...

frame += action.getNumFrames(0)/10;

if( frame >= action.getNumFrames(0) ){

frame = 0;

}

figure.setPosture(action, 0, frame);

g3.renderFigure(figure, 0, 0, layout, effect);

例8 模型中的多个动画效果

使用两个不同的动画文件比不比使用一个动画文件难多少。仅仅是导入两个文件并在每次3D模型绘制时选择其中一个。

action[0] = new ActionTable("/example/DemoMIDP/action_01.mtra");

action[1] = new ActionTable("/example/DemoMIDP/action_02.mtra");

...

case Canvas.KEY_NUM1: // action

actNo = 1;

frame = 0;

break;

...

frame += action[actNo].getNumFrames(0)/10;

if( frame >= action[actNo].getNumFrames(0) ){

frame = 0;

actNo = 0;

}

figure.setPosture(action[actNo], 0, frame);

g3.renderFigure(figure, 0, 0, layout, effect);

例9 显示多个3D模型

使用多个3D模型同在一个模型中使用多个动画一样的简单。从新从一个新的3D模型.mbac文件去创建一个新的figure实例与创建第一个实例的方法相同。

// One Figure created from a mbac file...

figure = new Figure("/example/DemoMIDP/test_model_robo.mbac");

mainTexture = new Texture("/example/DemoMIDP/tex_001.bmp", true);

figure.setTexture(mainTexture);

//... And another Figure created from another mbac file.

figureBg = new Figure("/example/DemoMIDP/test_model_haikei.mbac");

例10 用原型绘制

即使Micro3D v3主要是使用预先建立的模型进行3D建模编程,你也可以直接从原始的数组命令来创建3D图形。

// Use this array of commands to show a triangle with texture....

static int[] command = {

Graphics3D.COMMAND_LIST_VERSION_1_0,

Graphics3D.PRIMITVE_TRIANGLES |

Graphics3D.PDATA_NORMAL_PER_FACE |

Graphics3D.PDATA_TEXURE_COORD |

Graphics3D.PATTR_LIGHTING |

Graphics3D.PATTR_SPHERE_MAP |

Graphics3D.PATTR_BLEND_HALF |

(1<<16), // Nbr of primitives, in this case just one triangle

0, 0, 0, // The triangle's ccordinates

200, 0, 0,

0, 200, 0,

0, 0, 4096, // The Normal

0,255,255,255, 0, 0, // The coordinates for the texture

Graphics3D.COMMAND_END, };

...

protected void paint(Graphics g) {

...

g3.drawCommandList( mainTexture, 0, 0, layout, effect, command);

...

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有