快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡萄app下载_龟发之家论坛



原文地址链接

现在将带领你应用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 projecti澳门新葡萄app下载on method

if(persE澳门新葡萄app下载nabled){

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; /澳门新葡萄app下载/ 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

set澳门新葡萄app下载SpinX(-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建模编程,你也可以直接从原始的数组敕令来澳门新葡萄app下载创建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

protected void paint(Graphics g) {

...

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

...

}

您可能还会对下面的文章感兴趣: