3D编程指南第三部分:粒子系统和立即模式渲染
2008-01-05 08:52:05 来源:WEB开发网介绍
欢迎来到M3G指南的第三部分!今天我将介绍如何控制整个渲染过程(立即渲染),以及如何创建一个精密的粒子系统。此外,这里有一些链接,万一你感到迷惑就可以参考:
首先,或许也是最重要的,就是在索尼爱立信开发者世界上专业的移动java 3D网络区。其次,假如你碰到困难,就去索尼爱立信移动Java 3D论坛。对于其他的任何情况,使用索尼爱立信开发者世界网络门户,在那里你可以找到你的问题的答案,并且可以了解到更多。
这篇文章的目的是向你展示,如何根据不同的变换在不同的时间内渲染同一个对象。这被称作立即模式。你将会看到这种模式对很多事情是多么的强大。另外,这篇文章将是深入更高级的指南的基础,因为从现在开始,我们几乎只使用立即模式进行渲染。
因为文中的代码是用来演示使用的,所以它不是最优化的,并且它也没有包括所有可能发生的错误。稍后将会有更高级的话题。
你应该了解的
在你开始阅读这篇指南以前,你应该已经阅读过先前的两篇,并且已经对基本的M3G功能有一个稍微扎实的领会。
第一部分:快速进入移动JAVA 3D编程世界
第二部分:光的3D理论与定位
保留模式和立即模式渲染
保留模式是当你使用一个世界它含有的全部信息——包括照相机和灯光渲染整个世界时使用的模式。这是一种相当受限制的模式,因为我们几乎总是希望根据不同的变换多次绘制一个模型,而不是调用整个场景图像。所以,我们在M3G中渲染一个组、节点或者是一个子网面就被称为立即模式。这些是立即模式的方法:
render ( Node node, Transform transform)
render ( VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform)
render ( VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform, int scope)
像你看到的一样,三个方法都需要某种顶点数据:Node和VertexBuffer/IndexBuffer。一个Node可能主要是一个场景图像的任意部分,甚至一个世界也可以被认为是一个Node。通常你会给第一个渲染的方法传递一个Mesh或者一个Group。VertexBuffer,我们在第二篇指南中已经谈论过,它是描述3D空间中一个模型的网面数据的集合。最后的两个方法也需要Appearance类,以明白如何显示网面数据。在这篇指南中我们只使用第一个方法,向你展示立即模式是如何工作的。
所有方法还有另外一个共同点,就是它们都需要一个Transform类,这个类描述了模型从本地到3D世界空间的转换信息。请记住,我们在最后一篇指南中讨论它。另外需要记住的一件事时,你希望的渲染的大多数模型都是可变化的。这就意味着它们拥有自己的内部变换矩阵。然而,立即模式渲染忽略所有的这种转换信息,只使用为这个方法提供的Transform矩阵。这是非常便利的,因为你可以在内存中保存一个太空船的Mesh,但是可以使用不同的Transform矩阵多次渲染它,这样就可以获得很多不同的太空船。当我们开始设计粒子引擎时,你将会看到实际使用的这种方法。
那是全部吗?
立即模式渲染的问题是在渲染之前你必须治理更多的对象,因为你没有一个便利的World类,它存储了所有照相机、背景和照明信息。因此现在你需要手动控制的是,使用一个Background对象的视口缓冲器、场景照明信息和照相机。
背景(Background)
为了使用立即模式渲染,我们必须手动清除视口,这样为下一次绘制周期做预备。这个操作既可以在一个渲染循环之前也可以在它之后完成,但是它必须在你绑定Graphics3D对象之后和释放Graphics3D之前完成。M3G使用一个Background类来帮助你完成这个操作。这个Background类保存了很多极好的信息,例如用来清除屏幕的背景颜色和绘制背景的图片。它是很有用的,因为你可以使用一个很大的图片作为背景,但是可以只显示它的一些小块和部分就似乎你走来走去。例如,你可以在你的视野之内拥有一个大PNG,然后当玩家在游戏世界中移动时,你就可以移动背景的修剪区域来显示视野的其它部分。然而你必须明白,使用大的PNG不仅仅十分慢,而且内存效率很低。下面是Background类的最重要的方法:
setColor (int ARGB)
setCrop (int cropX, int cropY, int width, int height)
setImageMode (int modeX, int modeY)
setImage ( Image2D image)
让我们一个一个考虑它们。第一个方法是最简单和最常用的。它以0xAARRGGBB形式设置背景的颜色——这个颜色是在屏幕被清除时使用的。那么例如一个鲜红的颜色就是0xFFFF0000。很多人设置这个颜色为黑色或者天空的颜色。然而,默认颜色是白色。
setCrop方法是非常有用的,假如你正在使用一个背景图片作为一个背景显示。利用这个方法,你可以决定整个背景图片的哪个部分被渲染。这里有一些非凡的情况需要考虑,像修剪区域跨出背景图片的边界之外。这是就要用到第三个方法。它决定了对在源图片之外的像素将会发生什么。有两种可用的模式:REPEAT和BORDER。REPEAT意味着这个图片无限的重复自己,就像是一个平铺的纹理;而BORDER意味着在源图片以外的像素将使用setColor方法提供的背景颜色进行着色。一个很好的事情就是你可以分开决定x轴和y轴的图像模式动作。这就意味着,你可以在x轴(水平方向)环绕一个背景图片,而在y轴(垂直方向)保持静止。
最后一个方法,setImage是用来决定哪一个图片将会被用作背景。你可以为这个方法提供一个null参数关闭背景图像渲染,只使用背景颜色填充屏幕。这是默认的模式。不过请注重,图片是Image2D必须的,并且不是标准的Java ME平台图片。可是从一个Image创建一个Image2D并不是很难,你既可以使用十分有用的Loader类直接将它指向一个.PNG图像,也可以仅仅使用Image2D的构造方法,如下所示:
Image2D (int format, java.lang.Object image)
它是一个十分简单的构造方法,首先它获得图片的格式(在99% 的情况下,它是Image2D.RGBA或者Image2D.RGB,这依靠于你是否使用透明度),然后就是获得图片自身。第二个参数应该是你的Image类。所以,你将转换一个正常的Java ME平台图片为一个Image2D对象:
Image img = Image.createImage("/myimage.png");
Image2D img2d = new Image2D(Image2D.RGBA, img);
极其轻易!因此Image2D没有任何威胁,它仅仅是M3G系统使用的一个Image封装。
现在,你可能迫不及待了,想知道在你渲染任何对象之前,如何使用Background类清除背景。它是非常轻易的,这是第一个向你展示方法的代码片断:
// 背景
Background back = null;
更多精彩
赞助商链接