本文是此系列两部分中的第 1 部分,介绍了 Mobile 3D Graphics API (JSR 184) 的有关内容。作者将带领您进入 Java 移动设备的 3D 编程世界,并展示了处理光线、摄像机和材质的方法。
在图 8 中,您可以看到各种光线模式的不同效果。分别以 4 种类型的光照射示例立方体。这里的光线均为白色,就在摄像机前面,朝向立方体的三个面。
图 8. 使用不同的光线照射立方体 a) 全向光;b) 聚光;c) 环境光;d) 定向光
全向光在面对光源的顶点处最亮,然后逐渐暗淡下来。另外,聚光在聚光圆锥的边缘处制造了强烈的明暗对比。如果定义了一个足够大的光锥,那么所得到的结果可能与全向光相同。环境光从各个方向照亮立方体,立方体看上去是平的,这是因为缺乏阴影。最后,定向光使每面都具有不同的颜色。每面内的颜色都相同,这是因为光线是平行的。
照明并不精确,否则,聚光照亮的圆锥体范围应该是圆形。这是因为光线计算比较复杂,手机的部件将简化这一计算。可以为立方体的各边添加更多的三角形,从而提高其显示质量。尽管三角形并不能定义一个可见的几何图形,但可使 M3G 拥有更多的控制点(要计算的数量也更多)。
材质 通过光线可实现不同的效果。一个闪闪发光的银色球反射光线的方式与一张纸显然不同。M3G 使用以下属性为这些材质的特征建立模型:
环境反射:由环境光源反射的光线。
漫反射:反射光均匀地分散到各个方向。
放射光:一个像炽热的物体那样发射光线的对象。
镜面反射:光线从有光亮平面的对象反射回来。
您可为各材质属性设置颜色。闪闪发光的银色球的漫反射光线应该是银色的,其镜面反射部分为白色。材质的颜色与光线的颜色相融合,从而得到最终的对象颜色。如果您用蓝光照射银色球,那么球看上去应该略带蓝色。
清单 9 展示了使用材质的方式:
清单 9. 设置材质
// Create appearance and the material.
_cubeAppearance = new Appearance();
_colorTarget = COLOR_DEFAULT;
setMaterial(_cubeAppearance, _colorTarget);
/**
* Sets the material according to the given target.
*
* @param appearance appearance to be modified.
* @param colorTarget target color.
*/
protected void setMaterial(Appearance appearance, int colorTarget)
{
Material material = new Material();
switch (colorTarget)
{
case COLOR_DEFAULT:
break;
case COLOR_AMBIENT:
material.setColor(Material.AMBIENT, 0x00FF0000);
break;
case COLOR_DIFFUSE:
material.setColor(Material.DIFFUSE, 0x00FF0000);
break;
case COLOR_EMISSIVE:
material.setColor(Material.EMISSIVE, 0x00FF0000);
break;
case COLOR_SPECULAR:
material.setColor(Material.SPECULAR, 0x00FF0000);
material.setShininess(2);
break;
// no default
}
appearance.setMaterial(material);
}
setMaterial() 创建了一个新的 Material 对象,通过使用各颜色组件标识符的 setColor() 设置颜色。Material 对象随后被指派给 Appearance 对象,该对象用于调用 Graphics3D.render()。尽管这里没有展示,但您还可以使用 Material.setVertexColorTrackingEnable() 为环境反射和漫反射使用顶点颜色,不必使用 Material.setColor()。LightingMaterialsSample.java 这一示例中实现了光线和材质。按其中的键可以将不同的颜色与材质综合,感受不同的效果。