- 最后登录
- 2021-9-15
- 注册时间
- 2011-7-15
- 阅读权限
- 100
- 积分
- 50625
- 纳金币
- 53202
- 精华
- 32
|
在本教程中,您将引入令人难以置信的Away3D强大的纹理系统中,它允许你在你的场景创建极其逼真的照明和阴影。这个例子有一些有质感的方式不同,举例说明如何实现这一目标的现实主义的基本对象。作为一个轻微的除了主实施例中,有三个子的例子,随着纹理的各个方面的影响的方式,它的外观如何显示每个原语。最后的场面将所有这些对象有多个光源。
点击图片去看看灯光与材质的案例。基本底纹的例子源代码在 附件1。
设置场景
例如,在本教程中包含一个地面平面和三个不同的徘徊在它上面的原始几何体网格。球体,立方体和一个圆环。
要好好看看你的对象,本示例使用HoverController的围绕一个点,用摇摄,倾斜和距离性能,让您只需将相机。再加上这是一个数字的属性,这限制了极限运动。在这种情况下minTiltAngle maxTiltAngle用于停止上升到高相机或droping下方的地板。
所有这种设置载initEngine()方法。
scene = new Scene3D();
camera = new Camera3D();
view = new View3D();
view.antiAlias = 4;
view.scene = scene;
view.camera = camera;
//setup controller to be used on the camera
cameraController = new HoverController(camera);
cameraController.distance = 1000;
cameraController.minTiltAngle = 0;
cameraController.maxTiltAngle = 90;
cameraController.panAngle = 45;
cameraController.tiltAngle = 20;
view.addSourceURL("srcview/index.html");
addChild(view);
使用addChild(图)
要有光
要添加什么样的阴影,或突出显示的场景/对象,你需要某种形式的光源。的光源之一Away3D的开发团队4.x版是DirectionalLight的规定。这种类型的光不具有位置的概念的,唯一的方向。因此,构造函数或方向属性是用来定义光角度,emminating。从DirectionalLights的光具有恒定 的强度,也就是说,它是没有差异多远一个对象是远离光源,它会以同样的方式被照射。
Away3D中也有一个的POINTLIGHT类,其中的光强度随着距离脱落,并从它的位置在每一个方向的光emminates,但是它们没有在本例中使用。
的主要的例子有两个平行光的对象,其中之一是白色,慢慢地在现场周围旋转,而另一个是固定的,具有青色。
方向和颜色是不Away3D的光obejcts的唯一属性。这里有一些其他常用的。
环境 周围环境的光强度。这可以看出,作为最低限度的照明,将有对象的纹理。
扩散 位图纹理的漫反射强度的照明。改变这个改变多么激烈的位图纹理的颜色出现。
镜面 镜面反射的光的强度。调整改变你的模型的镜面高光的光泽度/光泽的特定区域。后说明了这一点。
light1 = new DirectionalLight();
light1.direction = new Vector3D(0, -1, 0);
light1.ambient = 0.1;
light1.diffuse = 0.7;
scene.addChild(light1);
light2 = new DirectionalLight();
light2.direction = new Vector3D(0, -1, 0);
light2.color = 0x00FFFF;
light2.ambient = 0.1;
light2.diffuse = 0.7;
scene.addChild(light2);
lightPicker = new StaticLightPicker([light1, light2]);
一旦你创建你的灯,与其他对象一样,他们需要到现场。虽然补充说,他们是可见的实体,但如何影响其他对象提供。如果你需要看到一个表示你的光,你就需要手动添加一个对象,并将其放置在您的灯光对象相同的坐标。
最后一件事,以确保灯都可以使用,你需要做的是定义一个光拾取器。这里您使用StaticLightPicker。光拾取器的目的是作为灯用于影响渲染的对象的集合。这允许根据需要作用于特定对象的一组光源。
纹理领域
这是一个有点背离的主要例子和论点集中在球体对象。的球体纹理是由一个位图表示的颜色的球表面和镜面的地图改变的表面的光点reflectivness。
这里的漫反射纹理和高光贴图中使用的图像。
弥漫性纹理
高光贴图
画像被映射到的对象的表面上使用的标准的UV坐标系统。三角形中的一个对象,以及,具有X,Y,Z的3个顶点的坐标也包含U&V的每个顶点的坐标,在0-1的范围内,定义在该位图中的位置,其中的颜色信息是从。位图的左上角:UV坐标0,0的图像,而右下角的UV坐标1,1。
这个例子演示了在不同的纹理状态的球体对象。最初,该对象是还未纹理化和使用缺省的纹理。点击在现场将发展到一个新的水平纹理 - 将漫位图纹理。再次点击将适用于高光贴图。随后点击将再次开始循环。这将让你看到在对象上应用的各种纹理的影响。
默认的纹理是一个简单的黑色和白色棋盘格的图像显示,如果没有纹理是提供您的网。
采用漫反射纹理显示在上面的位图的颜色。
当您申请的高光贴图的影响是非常微妙的,可能不容易看到。下面的图片表现出的差异,但下面的例子演示效果更为显着。
纹理的领域案例请点击图片预览效果。源代码请下载 附件2。
纹理的立方体
同样,纹理的立方体有弥漫位,和一个反射贴图,但也有一个额外的法线贴图。一个正常的地图包含描述的表面法线的角度的信息,和,因为它是从正常的地图描述,它具有的分辨率的位图,而不是粗网。这种正常的信息是考虑到在着色器程序,改变照明场景中的灯光方向的基础上的表面。
这里的立方体纹理的图像。
同样,点击图像揭示了addtional质地部分。从没有质感 - >弥漫性纹理 - >漫反射高光贴图 - >漫反射,镜面反射和法线贴图。
这个例子演示了的镜面映射好一点。如果你看的立方体的顶面的漫反射,然后漫反射与镜面,可以清楚地看到通过镜面高光来。
漫反射和漫反射与镜面之间的差异
点图片进入效果预览。纹理的立方体。源代码在 附件3。
纹理的圆环
最终的对象,在环面,再次使得使用漫位图纹理,镜面地图和正常映射。这纹理唯一真正的区别是使用的重复图案。的镜面地图在这种情况下,被设置到相同的作为漫射地图上。
通过点击下面的纹理模式,没有质感 - >弥漫 - >反复弥漫性(水平和垂直的5倍) - >漫反射贴图 - >漫反射与镜面和正常的地图。
寻找在圆环的同时,在弥漫只读模式,在前面与光源,它是在白色和黑色区域的图案可见。快速点击鼠标,添加高光贴图,你可以看到暗区松轻,但较白的区域保持镜面反射。
请点击图片去预览效果。纹理的圆环。源代码 在附件4。
把他们放在一起
现在你已经看到的主纹理的物体,让它们组合起来的场景中,看看他们是如何看待的多个光源又饿先前创建的。
这里是的材质设置代码:
/**
* Initialise the materials
*/
private function initMaterials():void
{
planeMaterial = new TextureMaterial(Cast.bitmapTexture(FloorDiffuse));
planeMaterial.specularMap = Cast.bitmapTexture(FloorSpecular);
planeMaterial.normalMap = Cast.bitmapTexture(FloorNormals);
planeMaterial.lightPicker = lightPicker;
planeMaterial.repeat = ***e;
planeMaterial.mipmap = false;
sphereMaterial = new TextureMaterial(Cast.bitmapTexture(BeachBallDiffuse));
sphereMaterial.specularMap = Cast.bitmapTexture(BeachBallSpecular);
sphereMaterial.lightPicker = lightPicker;
cubeMaterial = new TextureMaterial(Cast.bitmapTexture(TrinketDiffuse));
cubeMaterial.specularMap = Cast.bitmapTexture(TrinketSpecular);
cubeMaterial.normalMap = Cast.bitmapTexture(TrinketNormals);
cubeMaterial.lightPicker = lightPicker;
cubeMaterial.mipmap = false;
var weaveDiffuseTexture:BitmapTexture = Cast.bitmapTexture(WeaveDiffuse);
t***sMaterial = new TextureMaterial(weaveDiffuseTexture);
t***sMaterial.specularMap = weaveDiffuseTexture;
t***sMaterial.normalMap = Cast.bitmapTexture(WeaveNormals);
t***sMaterial.lightPicker = lightPicker;
t***sMaterial.repeat = ***e;
}
下面是创建对象的代码。
/**
* Initialise the scene objects
*/
private function initObjects():void
{
plane = new Mesh(new PlaneGeometry(1000, 1000), planeMaterial);
plane.geometry.scaleUV(2, 2);
plane.y = -20;
scene.addChild(plane);
sphere = new Mesh(new SphereGeometry(150, 40, 20), sphereMaterial);
sphere.x = 300;
sphere.y = 160;
sphere.z = 300;
scene.addChild(sphere);
cube = new Mesh(new CubeGeometry(200, 200, 200, 1, 1, 1, false), cubeMaterial);
cube.x = 300;
cube.y = 160;
cube.z = -250;
scene.addChild(cube);
t***s = new Mesh(new T***sGeometry(150, 60, 40, 20), t***sMaterial);
t***s.geometry.scaleUV(10, 5);
t***s.x = -250;
t***s.y = 160;
t***s.z = -250;
scene.addChild(t***s);
}
结论
在本教程中,您已经介绍了基本的材质和纹理在Away3D,并看到了如何通过使用高光贴图,法线贴图和照明用最小的努力,您可以创建令人惊讶的现实创作。
|
|