scene
- 创建场景
var scene = Laya.stage.addChild(new Laya.Scene());
- 加载外部场景
Laya.loader.create("LayaScene_01/loveScene.ls",
Laya.Handler.create(this, this.completeHandler), null, Laya.Scene);
function completeHandler() {
// 第一种方法 获取场景
// var scene=Laya.Scene.load("LayaScene_01/loveScene.ls");
// 第二种方法,缓存后加载方式
var scene = Laya.loader.getRes("LayaScene_01/loveScene.ls");
Laya.stage.addChild(scene);
}
camera
- 创建相机 (纵横比, 近距裁剪, 远距裁剪)
var camera = new Laya.Camera(0,0.1,100);
camera.nearPlane = 0;
camera.farPlane = 100;
- 添加到场景
scene.addChild(camera);
- 视野角度 (90度)
camera.fieldOfView = 90;
- 移动相机
camera.transform.translate(new Laya.Vector3(0,0,3),false);
- 旋转
camera.transform.rotate(new Laya.Vector3(0,0,3),true,true);
- 正交投影
camera.orthographicProjection = true;
- 正交大小
camera.orthographicVerticalSize = 7;
- 看向某点方向 (某点, 坐标系朝向)
camera.transform.lookAt(box.transform.position,new Laya.Vector3(0,1,0));
- 相机下的背景色
camera.clearColor = new Laya.Vector3(0.5,0.5,0.6);
- 天空盒
var skyBox:Laya.SkyBox = new Laya.SkyBox();
//必须设置, 否则无法显示天空
camera.clearFlag = Laya.BaseCamera.CLEARFLAG_SKY;
//绑定
camera.sky = skyBox;
加载贴图
skyBox.textureCube = Laya.TextureCube.load("skyBox/skyCube.ltc");
- 多镜头
var camera1=new Laya.Camera();
camera1.viewport=new Laya.Viewport(0,0,640,720);
var camera2=new Laya.Camera();
camera2.viewport=new Laya.Viewport(640,0,640,720);
light
- 点光源
//创建点光
var light = scene.addChild(new Laya.PointLight());
//移动灯光位置
light.transform.translate(new Laya.Vector3(-3,5,0));
//设置点光照亮范围
light.range = 6;
//设置点光的衰减
light.attenuation = new Laya.Vector3(0.01,0.01,0.03);
- 平行光
//创建平行光
var light = scene.addChild(new Laya.DirectionLight());
//设置平行光的方向
light.direction = new Laya.Vector3(0.5, -1, 0);
- 聚光灯
//添加聚光
var light = scene.addChild(new Laya.SpotLight());
//设置聚光的位置
light.transform.position = new Laya.Vector3(0,5,0);
//设置聚光的衰减
light.attenuation = new Laya.Vector3(0.1, 0, 0.1);
//设置聚光的方向
light.direction=new Laya.Vector3(0, -1, 0);
//设置聚光范围
light.range = 5;
//设置聚光值
light.spot = 5;
- 环境颜色
//貌似环境色从灯光中去除了, 材质中去找
light.ambientColor = new Laya.Vector3(1,1,0);
- 漫反射颜色
//设置灯光的漫反射色为纯红色
//light.diffuseColor = new Laya.Vector3(1,0,0);
//设置灯光颜色为纯红色(与diffuseColor作用相同)
light.color = new Laya.Vector3(1,0,0);
- 高光色
//设置高光颜色为蓝 貌似从灯光中去除了, 材质中去找
light.specularColor = new Laya.Vector3(0.5,0.5,1);
- 投影 shadow
//添加灯光投影
light.shadow=true;
//产生投影的范围(如过小将不会产生投影)
light.shadowDistance=45;
//生成阴影贴图数量
light.shadowPSSMCount = 1;
//模糊等级,越大越高,效果更好,更耗性能
light.shadowPCFType=1;
//投影质量
light.shadowResolution=2048;
材质需要设置
//产生阴影
sphere.meshRender.castShadow=true;
//接受阴影
box.meshRender.receiveShadow=true;
模型 Mesh / Geometry
- 创建盒子
//创建盒子模型(参数为:长、宽、高,单位:米)
var boxMesh:Laya.BoxMesh=new Laya.BoxMesh(2,2,2);
//创建模型显示对象
var box3D:Laya.MeshSprite3D=new Laya.MeshSprite3D(boxMesh);
- 创建球体
//创建球体模型(参数为:半径、水平层数、垂直层数)
var sphereMesh:Laya.SphereMesh=new Laya.SphereMesh(1,8,8);
//创建模型显示对象
var sphere3D:Laya.MeshSprite3D=new Laya.MeshSprite3D(sphereMesh);
- 创建圆柱体
//创建圆柱体模型(参数为:半径、高、圆截面线段数)
var cylinderMesh:Laya.CylinderMesh=new Laya.CylinderMesh(1,2,8);
//创建模型显示对象
var cylinder3D:Laya.MeshSprite3D=new Laya.MeshSprite3D(cylinderMesh);
- 模型贴图
//创建材质----------------------------------
var material:Laya.StandardMaterial = new Laya.StandardMaterial();
//为模型赋材质(单个材质可赋给多个模型)
box3D.meshRender.material = material;
- 加载建模和事件侦听
//加载导出的卡车模型
this.truck3D = Laya.Sprite3D.load("LayaScene_truck/truck.lh");
//模型与材质加载完成事件监听
this.truck3D.on(Laya.Event.HIERARCHY_LOADED,this,this.onLoded);
this.scene.addChild(this.truck3D);
//模型与材质加载完成后回调
private onLoded():void
{
console.log(this.truck3D);
//获取模型(查看.lh文件,有两个子对象模型,一为车头“head”,一为车身“body”,暂取其中一个模型)
var meshSprite3D:Laya.MeshSprite3D = this.truck3D.getChildAt(0).getChildAt(0) as Laya.MeshSprite3D;
//输出模型的名字(输出“body”)
console.log(meshSprite3D.name);
}
- 加载建模后替换建模
//加载导出的卡车模型
this.truck3D = Laya.Sprite3D.load("LayaScene_truck/truck.lh");
this.scene.addChild(this.truck3D);
//模型与材质加载完成事件监听
this.truck3D.on(Laya.Event.HIERARCHY_LOADED,this,this.onLoaded);
//模型与材质加载完成后回调
private onLoaded():void
{
console.log(this.truck3D);
//获取模型(查看.lh文件,有两个子对象模型,一为车头“head”,一为车身“body”,暂取其中一个模型)
this.meshSprite3D = this.truck3D.getChildAt(0).getChildAt(0) as Laya.MeshSprite3D;
//输出模型的名字(输出“body”)
console.log(this.meshSprite3D.name);
//2秒后更换模型网格
Laya.timer.once(2000,this,this.onTimerOnce);
}
private onTimerOnce():void{
//创建模型网格并更换原始网格
this.meshSprite3D.meshFilter.sharedMesh = Laya.Mesh.load("LayaScene_truck/Assets/truck-head.lm");
//因使用了卡车头网格,位置会冲个,所以进行位置移动
this.meshSprite3D.transform.translate(new Laya.Vector3(0,0,-8));
}
材质 Material
- 标准材质 standerd
//创建标准材质
var material = new Laya.StandardMaterial();
//创建漫反射二维纹理贴图
material.diffuseTexture = Laya.Texture2D.load("res/layabox.png");
//为box模型赋材质
box.meshRender.material = material;
异步加载
//异步加载材质文件创建标准材质(也可以预加载)
var material = Laya.StandardMaterial.load("truck/Assets/Materials/t0200.lmat");
//为box模型赋材质
box.meshRender.material = material;
- 修改材质
//加载导出的卡车模型
this.role3D = Laya.Sprite3D.load("LayaScene_truck/truck.lh");
//模型与材质加载完成监听与回调
this.role3D.on(Laya.Event.HIERARCHY_LOADED,this,onLoadComplete);
this.scene.addChild(this.role3D);
//模型与材质加载完成后回调
function onLoadComplete(){
//获取车身模型(查看.lh文件,模型中两个对象,车头“head”与车身“body”,他们都用同一个材质)
var meshSprite3D = this.role3D.getChildAt(0).getChildAt(0);
//从模型上获取自身材质
var material = meshSprite3D.meshRender.material;
//修改材质的反射颜色,让模型偏红
material.albedo = new Laya.Vector4(1,0,1,1);
}
- 修改共享材质
//加载导出的卡车模型
this.role3D = Laya.Sprite3D.load("LayaScene_truck/truck.lh");
//模型与材质加载完成监听与回调
this.role3D.on(Laya.Event.HIERARCHY_LOADED,this,onLoadComplete);
this.scene.addChild(this.role3D);
//模型与材质加载完成后回调
function onLoadComplete(){
//获取车身模型(查看.lh文件,模型中两个对象,车头“head”与车身“body”,它们都用同一个材质)
var meshSprite3D = this.role3D.getChildAt(0).getChildAt(0);
//从模型上获取共享材质
var shareMaterial = meshSprite3D.meshRender.shareMaterial;
//修改材质的反射颜色,让模型偏红
shareMaterial.albedo = new Laya.Vector4(1,0,0,1);
}
- 修改材质列表
//加载场景
this.scene = Laya.Scene.load("LayaScene_01/loveScene.ls");
Laya.stage.addChild(this.scene);
//场景模型与材质加载完成监听与回调
this.scene.on(Laya.Event.HIERARCHY_LOADED,this,function(){
setModelMaterial(this.scene);
});
//修改模型材质(场景或模型)
function setModelMaterial(model){
//如果是模型网格显示对象
if(model instanceof Laya.MeshSprite3D){
//获取模型网格对象
var meshSprite3D = model;
//获取材质列表数组
var materials = meshSprite3D.meshRender.materials;
//对模型网格中的所有材质进行修改
for(var m = 0;m < materials.length;m++){
//获取共享材质
var mat = materials[m];
//修改材质反射颜色
mat.albedo = new Laya.Vector4(0.5,0.5,1,1);
}
}
//如果是蒙皮模型网格显示对象
if(model instanceof Laya.SkinnedMeshSprite3D){
//获取蒙皮模型网格显示对象
var skinnedMeshSprite3D = model;
//获取材质列表数组
var materials1 = skinnedMeshSprite3D.skinnedMeshRender.materials;
//对蒙皮模型网格中的所有材质进行修改
for(var n = 0;n < materials1.length;n++){
//获取共享材质
var mat1 = materials1[n];
//修改材质反射颜色
mat1.albedo = new Laya.Vector4(0.5,0.5,1,1);
}
}
//递归方法获取子对象
for(var i = 0;i < model._childs.length;i++){
setModelMaterial(model._childs[i]);
}
}
材质的光色与贴图
- 反射率 albedo
反射率的值是一个四维向量,查看下列代码,向量中四个元素分别代表着红、绿、蓝、透明alpha。
透明alpha效果为百分比,0为全透明,1为全透明,如果需要设置为半透明或全透明显示,只调整反射率还不行,还需要设置材质的渲染模式为混合类型才能达到目的
反射率albedo数值越高,反射贴图效果越小,漫反射贴图效果越强,可根据实际的模型材质效果调节,比如水面、镜面、金属面可调节不同的反射率达到需求。
//创建标准材质
var material = new Laya.StandardMaterial();
//创建漫反射二维纹理贴图
material.diffuseTexture = Laya.Texture2D.load("res/layabox.png");
//只有设置了渲染模式为透明混合类型才能达到透明效果
//设置材质蓝色染色及30%半透明
material.albedo=new Laya.Vector4(1,1,2,0.3);
//渲染模式(也可设置数值,5-13等为混合类型,可观察其效果变化)
material.renderMode = Laya.StandardMaterial.RENDERMODE_DEPTHREAD_TRANSPARENTDOUBLEFACE;;
//为box模型赋材质
box.meshRender.material = material;
- 漫反射 diffuse
//添加方向光(灯光色会与材质色融合,因此改灯光色为黑白灰色,且不能曝光过度)
var directionLight = scene.addChild(new Laya.DirectionLight());
//环境色
directionLight.ambientColor = new Laya.Vector3(0.5, 0.5, 0.5);
//高光 / 金属色
directionLight.specularColor = new Laya.Vector3(0, 0, 0);
//漫反射色
directionLight.diffuseColor = new Laya.Vector3(1, 1, 1);
directionLight.direction = new Laya.Vector3(0.5, -1, 0);
//创建标准材质
var material = new Laya.StandardMaterial();
//创建漫反射颜色
material.diffuseColor=new Laya.Vector3(.5,.5,2);
//创建漫反射二维纹理贴图
material.diffuseTexture = Laya.Texture2D.load("res/layabox.png");
//为box模型赋材质
box.meshRender.material = material;
- 高光 specular
//创建平行光 -------------------
var light = scene.addChild(new Laya.DirectionLight());
//修改灯光方向
light.direction = new Laya.Vector3(0.3, -1, 0);
//设置高光色为白色
light.specularColor = new Laya.Vector3(1,1,1);
//加载导出的卡车模型
this.role3D = Laya.Sprite3D.load("LayaScene_truck/truck.lh");
//模型与材质加载完成事件监听
this.role3D.on(Laya.Event.HIERARCHY_LOADED,this,onLoadComplete);
scene.addChild(this.role3D);
this.scene.addChild(this.role3D);
/** 模型与材质加载完成后回调***/
function onLoadComplete()
{
//获取模型
var meshSprite3D = this.role3D.getChildAt(0).getChildAt(0);
//从模型上获取共享材质
var sharedMaterial = meshSprite3D.meshRender.sharedMaterial;
//修改材质的高光颜色,让高光处偏红
sharedMaterial.specularColor = new Laya.Vector4(1,0,0,1);
//加载高光贴图(与漫反射一致,也可单独制作高光贴图)
sharedMaterial.specularTexture = sharedMaterial.diffuseTexture;
//sharedMaterial.specularTexture = Laya.Texture2D.load("LayaScene_truck/Assets/texture/t0200.png");
}
-环境 ambient
//添加方向光(灯光色会与材质色融合,因此改灯光色为黑白灰色,且不能曝光过度)
var directionLight = scene.addChild(new Laya.DirectionLight());
directionLight.ambientColor = new Laya.Vector3(0.5, 0.5, 0.5);
directionLight.specularColor = new Laya.Vector3(0, 0, 0);
directionLight.diffuseColor = new Laya.Vector3(1, 1, 1);
directionLight.direction = new Laya.Vector3(0.5, -1, 0);
//创建标准材质
var material = new Laya.StandardMaterial();
//创建漫反射二维纹理贴图
material.diffuseTexture = Laya.Texture2D.load("res/layabox.png");
//设置环境色,提亮模型
material.ambientColor =new Laya.Vector3(2,2,2);
//为box模型赋材质
box.meshRender.material = material;
-反射 reflect
//添加方向光
var directionLight = scene.addChild(new Laya.DirectionLight());
directionLight.ambientColor = new Laya.Vector3(0.5, 0.5, 0.5);
directionLight.specularColor = new Laya.Vector3(0.5, 0.5, 0.5);//为球体增加高光
directionLight.diffuseColor = new Laya.Vector3(1, 1, 1);
directionLight.direction = new Laya.Vector3(0.5, -1, 0);
//添加自定义模型
var sphere = scene.addChild(new Laya.MeshSprite3D(new Laya.SphereMesh()));
sphere.transform.rotate(new Laya.Vector3(0,45,0),false,false);
//创建标准材质
var material = new Laya.StandardMaterial();
//创建漫反射二维纹理贴图
material.diffuseTexture = Laya.Texture2D.load("res/layabox.png");
//降低反射率,加强反射贴图反射
material.albedo = new Laya.Vector4(0.2,0.2,0.2,0);
//设置渲染模式为双面不透明(否者无法显示反射贴图)
material.renderMode = Laya.StandardMaterial.RENDERMODE_OPAQUEDOUBLEFACE;
//创建反射贴图,用立方体全视角贴图进行赋值(类似于360全景包裹)
material.reflectTexture = Laya.TextureCube.load("skyBox/skyCube.ltc");
//为球型模型赋材质
sphere.meshRender.material = material;
- 法线凹凸贴图
法线贴图对模型数据有一定的要求,如果模型上没有切线信息将无法产生法线凹凸的效果。例如LayaAir 3D引擎中自带的各种Mesh网格类型BoxMesh、SphereMesh、CylinderMesh等是没有切线信息的,即使使用了法线贴图也不会在视图中显示出凹凸。
如果需要使用法线贴图,且模型是通过LayaAir的unity插件中导出,在Mesh Setting网格设置时需要注意不能勾选“忽略切线”选项
如果需要使用法线贴图,游戏场景中必须使用灯光,否则模型上也不会产生凹凸效果
//添加方向光
var directionLight = scene.addChild(new Laya.DirectionLight());
directionLight.ambientColor = new Laya.Vector3(0.5, 0.5, 0.5);
directionLight.specularColor = new Laya.Vector3(0.5, 0.5, 0.5);//为球体增加高光
directionLight.diffuseColor = new Laya.Vector3(1, 1, 1);
directionLight.direction = new Laya.Vector3(0.5, -1, 0);
//创建unity中导出的模型
this.box = Laya.Sprite3D.load("layaScene_box/box.lh");
//模型与材质加载完成事件监听
box.on(Laya.Event.HIERARCHY_LOADED,this,onLoadComplete);
//也可以代码加载法线贴图
//加载到场景中
scene.addChild(this.box);
/** 模型与材质加载完成后回调***/
function onLoadComplete()
{
//也可以代码加载法线贴图
//从模型中获取meshSprite3D对像
//var meshSprite3D = this.box.getChildAt(0);
//获取模型的材质实例
//var material = meshSprite3D.meshRender.material;
//为材质添加法线贴图
//material.normalTexture = Laya.Texture2D.load("layaScene_box/Assets/texture/layabox_normal.png");
}