核心要点:3D物体碰撞是靠射线检测,射线与碰撞器相撞获取对应的碰撞点信息。

class RayPicking03 {
private ray: Laya.Ray;
private point: Laya.Vector2 = new Laya.Vector2();
private _outHitInfo: Laya.RaycastHit;
private _position: Laya.Vector3;
private _upVector3: Laya.Vector3;
private _vector3: Laya.Vector3;
private _offsetVector3: Laya.Vector3;
private box: Laya.MeshSprite3D;
private _rotateV3:Laya.Vector3;
private camera: Laya.Camera;
private label: Laya.Label;
constructor() {
Laya3D.init(0, 0, true);//初始化3D
Laya.stage.scaleMode = "full";//屏幕缩放方式
Laya.stage.screenMode = "none";
Laya.Stat.show(); var scene: Laya.Scene = Laya.stage.addChild(new Laya.Scene()) as Laya.Scene;//添加场景 this.point = new Laya.Vector2();//位置信息
this.ray = new Laya.Ray(new Laya.Vector3(0, 0, 0), new Laya.Vector3(0, 0, 0));//初始化射线
this._outHitInfo = new Laya.RaycastHit();//初始化射线信息
this._position = new Laya.Vector3(0, 0.25, 0);//位置
this._upVector3 = new Laya.Vector3(0, 1, 0);
this._rotateV3 = new Laya.Vector3(1, 0, 1);
this._vector3 = new Laya.Vector3();
this._offsetVector3 = new Laya.Vector3(0, 0.15, 0) //初始化照相机
this.camera = scene.addChild(new Laya.Camera(0, 0.1, 100)) as Laya.Camera;
this.camera.transform.translate(new Laya.Vector3(0, 2, 5));
this.camera.transform.rotate(new Laya.Vector3(-15, 0, 0), true, false);
this.camera.clearColor = null; //方向光
var directionLight: Laya.DirectionLight = scene.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
directionLight.color = new Laya.Vector3(0.6, 0.6, 0.6);
directionLight.direction = new Laya.Vector3(1, -1, -1); var plane: Laya.MeshSprite3D = scene.addChild(new Laya.MeshSprite3D(new Laya.PlaneMesh(6, 6, 10, 10))) as Laya.MeshSprite3D;//创建平面物体
var planeMat: Laya.StandardMaterial = new Laya.StandardMaterial();//标准材质
planeMat.diffuseTexture = Laya.Texture2D.load("../bin/res/layabox.png");//添加材质
planeMat.albedo = new Laya.Vector4(0.9, 0.9, 0.9, 1);
plane.meshRender.material = planeMat; var meshCollider = plane.addComponent(Laya.MeshCollider) as Laya.MeshCollider;//网格碰撞器
meshCollider.mesh = plane.meshFilter.sharedMesh;//网格过滤器,获取共享网格 this.box = scene.addChild(new Laya.MeshSprite3D(new Laya.SphereMesh(0.2, 8, 8))) as Laya.MeshSprite3D;//创建立方体
var mat: Laya.StandardMaterial = new Laya.StandardMaterial();
mat.diffuseTexture = Laya.Texture2D.load("../bin/res/layabox.png");
this.box.meshRender.material = mat; Laya.timer.frameLoop(1, this, this.checkHit); this.loadUI();
}
private checkHit(): void {
this.box.transform.position = this._position;
//this.box.transform.rotate(this._rotateV3, true, false)
//从屏幕空间生成射线
this.point.elements[0] = Laya.MouseManager.instance.mouseX;//鼠标X坐标
this.point.elements[1] = Laya.MouseManager.instance.mouseY;//鼠标Y坐标
this.camera.viewportPointToRay(this.point, this.ray);//从摄像机到鼠标点击位置生成射线
Laya.Physics.rayCast(this.ray, this._outHitInfo, 30, 0);//生成射线
} private loadUI(): void { this.label = new Laya.Label();
this.label.text = "点击移动";
this.label.pos(Laya.Browser.clientWidth / 2.5, 100);
this.label.fontSize = 50;
this.label.color = "#40FF40";
Laya.stage.addChild(this.label); //鼠标事件
Laya.stage.on(Laya.Event.MOUSE_UP, this, function (): void {
if (this._outHitInfo.distance !== -1) {
Laya.Vector3.add(this._outHitInfo.position, this._offsetVector3, this._vector3);
Laya.Tween.to(this._position, { x: this._vector3.x, y: this._vector3.y, z: this._vector3.z }, 500/**,Ease.circIn*/);
}
});
}
}

Layabox 3D游戏开发学习笔记---射线检测,鼠标控制物体运动的更多相关文章

  1. Unity 3D游戏开发学习路线(方法篇)

    Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...

  2. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  3. [游戏开发-学习笔记]菜鸟慢慢飞(四)-Camera

    游戏开发中,主相机应该是最重要的GameObject之一,毕竟游戏呈现给玩家,就是通过它. 相机的使用,在不同的游戏中,有很大的不同.这里总结一下自己学到的一些相关知识. 固定位置-游戏过程中相机的T ...

  4. 【整理】HTML5游戏开发学习笔记(5)- 猜谜游戏

    距上次学习笔记已有一个多月过去了,期间由于新项目赶进度,以致该学习计划给打断,十分惭愧.书本中的第六章的例子相对比较简单.所以很快就完成. 1.预备知识html5中video标签的熟悉 2.实现思路对 ...

  5. 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏

    <HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...

  6. cocos2d-x 3.x游戏开发学习笔记(1)--mac下配置cocos2d-x 3.x开发环境

    打开用户文件夹下.bash_profile文件,配置环境 vim ~/.bash_profile //按键i,进行插入编辑(假设输错d进行删除一行) 环境配置过程例如以下: 1.首先配置下androi ...

  7. [Android游戏开发学习笔记]View和SurfaceView

    本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...

  8. Photon + Unity3D 线上游戏开发 学习笔记(一)

    大家好. 我也是学习Photon + unity3D 的新手 有什么说错的地方大家见谅哈. 我的开发环境是 unity3D 4.1.3  ,   Visual Studio 是2010 版本号的  p ...

  9. [游戏开发-学习笔记]菜鸟慢慢飞(九)- NGUI- UIPanel(官方说明翻译)

    我自己笔记是做在OneNote上,直接复制粘贴过来变成图片了,效果好像还可以. 机器翻译,我自己看了一下,改了一部分.

随机推荐

  1. git忽略掉文件权限检查

    有时 git diff 执行显示文件内容没变化,但是有 old mode xxx new mode,原因是文件的权限,被chmod变化了,这种变化也被 diff 识别出来了,让git忽略掉文件权限检查 ...

  2. C#里面BLL、Model、DAL、UI层

    C# 三层架构分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL)再加上实体类库(Model) 1.实体类库(Model),主要存放数据库中的表字段. 操作: (1)先建立实体类库Mode ...

  3. day 46 Django 学习3 数据库单表操作以及反向解析

    前情提要: Django 已经学了不少了, 今天学习链接数据库的操作.以及相关的反向解析等 一:反向解析 1:反向解析模板层 跳转时设定url会随着前面的路由改变而改变         2:反向解析之 ...

  4. 【GDKOI2017】小队任务 莫比乌斯反演+杜教筛

    题目大意:给你n,求$\sum_{i=1}^{n}\sum_{j=i}^{n}[gcd(i,j)=1](i+1)(j+1)$ 子任务一:暴力 子任务二:$T=50000,n≤10^7$ 子任务三:$T ...

  5. 数据结构---散列表查找(哈希表)概述和简单实现(Java)

    散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...

  6. easyui combobox下拉框复制后再禁用,点击不会出现下拉框

    easyui combobox下拉框禁用,点击不会出现下拉框 需要做到,在给easyui combobox赋值后,再禁用easyui combobox 解决办法: $("#time-sele ...

  7. js05

    继续学习js,在这里我们主要讲述一下js的BOM(浏览器对象模型)以及一些js库和应用这些js库的方法. 1.浏览器对象模型(BOM):    window对象:        表示浏览器窗口,所有的 ...

  8. AsyncTask、HandlerThread、IntentService和线程池

    AsyncTask AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程用于更新UI. 可以直接继承AsyncTask,在类中实现异步操作, ...

  9. 【Tomcat】使用记录

    同时绑定ipv4和ipv6 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout=&q ...

  10. 【Ubuntu】使用记录

    Vim 设置自动折行 :set wrap Maven 安装 去官网下载maven安装包 解压maven, 在主目录下的.bashrc中添加 export PATH="$PATH:{your_ ...