介绍JSR184(3D)中的光线概念

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

把光线加进3D场景中可以给3D最终的外观带来一个巨大的变化。但是这里有很多东西需要思考,同时结果也不会总是和预期的一样。这篇文章描述怎样把光线加入一个由JSR184开发的3D的场景中,和怎样设置一个物体的材质(material)。


  

 


  

 

在我们开始之前,需要知道一个很重要的事情:添加光线到一个3D场景中对于性能来说是一个代价很高的操作,必须时刻记住。

JSR184中有4个不同的光线选项。

 

Ambient(周围):在一个无限的时间点上,光线以分散的形式在环境表面上照射,使光源不可能决定。这种光线的位置和方向不会影响最终的结果。(其实就是物体表面发光,太阳散射)

Directional(方向):举个真实世界的例子就是太阳光照到物体表面,光线被平均的分散到各个方向。这种光线的位置不会影响最终结果。     

Omnidirectional(全方向):这种光线能被认为是一点光,光线被光源平均分配到各个方向,你能通过改变光源的位置来改变最终的结果,但是改变方向不能影响结果。

Spot(斑点):这种光线在已选择的方向上射出一道锥形的光线,这道锥形光线的宽和强度能改变,而且它的位置和方向能影响3D场景。

 

一条法线的意思是:相对于平面90度角的矢量。(垂直线)

JSR184中我们为被用于物体外型上的每一个点输入一条法线,下面的代码告诉我们它能实现一个棱锥,必须要记住输入法线的取值范围在-127~127的角度之间。

// 棱锥的最高点. x, y, z
short []POINTS = new short[] {

-1, -1, 1,  1, -1, 1,   0, 1, 0,     //
    1, -1, 1,    1, -1, -1,  0, 1, 0,    //

    1, -1, -1,  -1, -1, -1,  0, 1, 0,    //

   -1, -1, -1,  -1, -1, 1,   0, 1, 0,    //

   -1, -1, 1,    1, -1, 1,   1, -1, -1,  //
下右
   -1, -1, 1,    1, -1, -1, -1, -1, -1}; //
下左

// 棱锥的底角为70
short []NORMALS = new short[] {

 0, 56,113,      0, 56, 113,     0, 56, 113,
    113,56,0,        113,56,0,     113,56,0,                           0,56,-113,        0,56,-113,     0,56,-113, -113,56,0,        -113,56,0,     -113,56,0,                        0,-127,0,        0,-127,0,     0,-127,0,                            0, -127,0,        0, -127,0,     0, -127,0};

我们还可以设置网眼的材质。

Material material = new Material();
material.setVertexColorTrackingEnable(true);
appearance.setMaterial(material);
mesh.setAppearance(0, appearance);

光线在物体外型上的反射受材质颜色的影响。一个红色的材质(0XFF0000)只会出反射红色的光,即使这个光源是纯白色的。同样蓝色的材质只会反射出蓝色的光。

在法线设置和材质添加后,你只需要把光本身添加到场景中。

light = new Light();        // 创建一个新的light对象
light.translate( 0.0f , 0.0f , -1.0f ); // Light
的位置
light.setMode(Light.AMBIENT);   // Light
模式
light.setColor(0xFFFFFF);    // Light
的颜色 白色

world.addChild(light);      // 把光线添加到场景

       这就是本文介绍的内容,难点在于使得你的应用程序运行的和你期望的一样,通常这比你最初认为的要难很多。你可以在下面下载一个小的关于JSR184光线的MIDLET程序。

从这里下载JSR814Light

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值