three.js 如何选择物体 (THREE.Raycaster简介)

在three.js,可以利用THREE.Raycaster来达到点击与交互,即选择物体的操作。

那么我们先来认识一下THREE.Raycaster,它的构造函数如下:

new Raycaster( origin, direction, near, far );

参数介绍:

origin — 射线的起点向量。
direction — 射线的方向向量,应该归一标准化。
near — 投射近点,所有返回的结果应该比 near 远。Near不能为负,默认值为0。
far — 投射远点,所有返回的结果应该比 far 近。Far 不能小于 near,默认值为无穷大。

几个核心函数:

1、setFromCamera ( coords, camera ):

用一个新的原点和方向向量来更新射线(ray),用照相机的原点和点击的点构成一条直线。

参数:

coords — 鼠标的二维坐标,在归一化的设备坐标中,也就是X 和 Y 分量应该介于 -1 和 1 之间。

camera — 射线起点处的相机,即把射线起点设置在该相机位置处。

2、intersectObject ( object, recursive )

检查射线和物体之间的所有交叉点(包含或不包含后代)。交叉点返回按距离排序,最接近的为第一个。 返回一个交叉点对象数组。

参数:

object — 用来检测和射线相交的物体。

recursive — 如果为true,它还检查所有后代。否则只检查该对象本身。缺省值为false。

3、intersectObjects( objects, recursive ),和上面的函数功能一样,区别是这个是一个数组。

 

简单示例:

var raycaster = new THREE.Raycaster();

 raycaster.setFromCamera( mouse, camera );//通过鼠标点的位置和当前相机的矩阵计算出raycaster

var intersects = raycaster.intersectObjects( objects );// 获取raycaster直线和所有模型相交的数组集合

//选中第一个射线相交的物体

if (intersects.length > 0) {
        SELECTED = intersects[0].object;
        var intersected = intersects[0].object;
}

返回的intersected是一个数组,[ { distance, point, face, faceIndex, indices, object }, ... ]

distance – 射线的起点到相交点的距离

point – 在世界坐标中的交叉点

face – 相交的面

faceIndex – 相交的面的索引

indices – 组成相交面的顶点索引

object – 相交的对象

 

知识补充:

世界坐标系:在webGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角
坐标为(1,1)。


屏幕坐标系:
webGL的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。


视点坐标系:
是以视点(照相机)为原点,以视线的方向为Z+轴正方向的坐标系中的方向。webGL会将世界坐标先变换到视点坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。
 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Three.js是一个基于WebGL的JavaScript库,用于创建逼真的3D图形在浏览器中运行。如果你想在Three.js中实现鼠标经过物体时颜色变化的效果,通常你可以通过监听鼠标事件(如`raycaster.intersectObject`)和`THREE.CSS3DObject`或`THREE.Object3D`结合来实现。CSS3DObjects允许你将2D CSS样式应用于3D模型,而Object3Ds则提供了更丰富的交互。 以下是一个简单的步骤概述: 1. 创建一个`CSS3DRenderer`,它允许你在场景中使用CSS样式来渲染3D对象。 2. 添加一个`CSS3DObject`到场景中,这将是鼠标交互的对象。 3. 设置一个事件监听器(比如`raycaster拾取事件`),当鼠标移动并击中这个对象时,触发回调函数。 4. 在回调函数中,获取当前鼠标位置和选中的对象,并改变其CSS样式(如`color`属性),使物体的颜色发生变化。 示例代码片段如下: ```javascript // 初始化Three.js const scene = new THREE.Scene(); const cssRenderer = new THREE.CSS3DRenderer(); cssRenderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(cssRenderer.domElement); // 创建CSS3D对象 const object = new THREE.CSS3DObject(yourObjectDiv); // 用HTML元素替换yourObjectDiv scene.add(object); // 鼠标拾取事件 const raycaster = new THREE.Raycaster(); const mouse = new THREE.Vector2(); function onMouseMove(event) { mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(mouse, camera); const intersects = raycaster.intersectObject(object); if (intersects.length > 0) { object.style.color = 'red'; // 更改颜色 } else { object.style.color = 'initial'; // 或者恢复原始颜色 } } document.addEventListener('mousemove', onMouseMove); // 其他Three.js设置和初始化... ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值