threejs 射线Ray api的使用

threejs yekong

学习Threejs中的射线Ray概念,你可以类比数学几何中提到的射线,在三维空间中,一条线把一个点作为起点,然后沿着某个方向无限延伸。

创建射线对象

// 创建射线对象
const ray = new THREE.Ray()

射线起点 .origin

射线Ray的起点.origin 在3D空间中的坐标,可以用一个三维向量 Vector3的x、 y、z分量表示。

// 创建射线对象
const ray = new THREE.Ray()
// 设置射线起点
ray.origin = new THREE.Vector3(1, 0, 3)

起点.origin 属性值是三维向量 Vector3, 也可以用.set()方法设置。


// 设置射线起点
ray.origin.set(1, 0, 3)

射线方向 .direction

射线Ray 的方向.direction 通用用一个三维向量 Vector3 表示,向量长度保证为1,也就是单位向量。


// 表示射线沿着x轴正方向
ray.direction = new THREE.Vector3(1, 0, 0);
// 表示射线沿着x轴负方向
ray.direction = new THREE.Vector3(-1, 0, 0)
// 表示射线沿着y轴正方向
ray.direction = new THREE.Vector3(0, 1, 0)

注意.direction的值需要是单位向量,不是的话可以执行.normalize()归一化或者说标准化。

ray.direction = new THREE.Vector3(5,0,0).normalize()

.intersectTriangle()方法

射线Ray 存很多关于数学计算的方法,.intersectTriangle(),简单说,就是计算一个射线和一个三角形在3D空间中是否交叉。
执行.intersectTriangle()方法,如果相交返回交点坐标,不相交返回空值null.


// 三角形3个点坐标
const p1 = new THREE.Vector3(100, 25, 0);
const p2 = new THREE.Vector3(100, -25, 25);
const p3 = new THREE.Vector3(100, -25, -25);
const point = new THREE.Vector3() //用来记录射线和三角形的交叉点
// 计算射线和三角形是否相交 相交返回交点 不想交返回null
const result = ray.intersectTriangle(p1, p2, p3, false, point)
console.log('交叉点坐标', point)
console.log('是否相交', result)

.intersectTriangle() 参数4表示是否进行背面剔除,p1,p2,p3可以理解为一个三角形,有正反两面,一面是正面,一面是反面。
在一面观察p1,p2,p3,如果沿着三个点的顺序转圈是逆时针方向,表示正面,另一面观察,p1,p2,p3就是顺时针方向,表示背面。

当前内容为观看threejs视频教程 WebGL/Three.js前端高薪3D可视化 课程-射线拾取-射线Ray-学习笔记

喜欢