Laya3d API

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");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 12,995评论 3 90
  • 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在...
    自由的天空阅读 12,375评论 0 12
  • 更新:【面试题含答案】http://bbs.9ria.com/thread-288394-1-1.html 高频问...
    好怕怕阅读 4,732评论 3 52
  • 在新一阶段的写作中,我写下了这三个目标:思考、践行、改变。 都说输出倒逼输入,写作的过程中,必然需要阅读、听书或学...
    ef0b06719d1c阅读 231评论 0 3
  • 一瞬而逝的烟火 像大海中的水滴 在星空璀璨的银河 可是它盛开时 却绽放绚丽的花 高唱嘹亮的歌
    说剑师阅读 421评论 0 4