目录

1.光线投射Raycaster

1.1 构造器

1.2 属性

1.3 方法

2. 示例:点击变换颜色


1.光线投射Raycaster

这个类用于进行raycasting(光线投射)。 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。

1.1 构造器

 Raycaster( origin : Vector3, direction : Vector3, near : Float, far : Float )

origin —— 光线投射的原点向量。
direction —— 向射线提供方向的方向向量,应当被标准化。
near —— 返回的所有结果比near远。near不能为负值,其默认值为0。
far —— 返回的所有结果都比far近。far不能小于near,其默认值为Infinity(正无穷。)

1.2 属性

.far : Float

raycaster的远距离因数(投射远点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。 这个值不应当为负,并且应当比near属性大。

.near : Float

raycaster的近距离因数(投射近点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。 这个值不应当为负,并且应当比far属性小。

.camera : Camera

对依赖于视图的对象(例如Sprites等广告牌对象)进行光线投射时使用的相机。该字段可以手动设置,也可以在调用“setFromCamera”时设置。默认为空。

.layers : Layers

Raycaster 在执行相交测试时使用它来选择性地忽略 3D 对象。以下代码示例确保Raycaster 实例 仅支持第1层上的 3D 对象。

raycaster.layers.set( 1 );
object.layers.enable( 1 );

.params : Object

具有以下属性的对象:

{Mesh: {},Line: { threshold: 1 },LOD: {},Points: { threshold: 1 },Sprite: {}
}

其中threshold是光线投射器在与对象相交时的精度,以世界单位为单位。

.ray : Ray

用于进行光线投射的Ray(射线)。

1.3 方法

.set ( origin : Vector3, direction : Vector3 ) : undefined

origin —— 光线投射的原点向量。
direction —— 为光线提供方向的标准化方向向量。

使用一个新的原点和方向来更新射线。

.setFromCamera ( coords : Vector2, camera : Camera ) : undefined

coords —— 在标准化设备坐标中鼠标的二维坐标 —— X分量与Y分量应当在-1到1之间。
camera —— 射线所来源的摄像机。

使用一个新的原点和方向来更新射线。

.intersectObject ( object : Object3D, recursive : Boolean, optionalTarget : Array ) : Array

object —— 检查与射线相交的物体。
recursive —— 若为true,则同时也会检查所有的后代。否则将只会检查对象本身。默认值为true。
optionalTarget — (可选)设置结果的目标数组。如果不设置这个值,则一个新的Array会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。

检测所有在射线与物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个。
该方法返回一个包含有交叉部分的数组:

[ { distance, point, face, faceIndex, object }, ... ]

distance —— 射线投射原点和相交部分之间的距离。
point —— 相交部分的点(世界坐标)
face —— 相交的面
faceIndex —— 相交的面的索引
object —— 相交的物体
uv —— 相交部分的点的UV坐标。
uv2 —— Second set of U,V coordinates at point of intersection
instanceId – The index number of the instance where the ray intersects the InstancedMesh

当计算这条射线是否和物体相交的时候,Raycaster将传入的对象委托给raycast方法。 这将可以让mesh对于光线投射的响应不同于lines和pointclouds。

请注意:对于网格来说,面必须朝向射线的原点,以便其能够被检测到。 用于交互的射线穿过面的背侧时,将不会被检测到。如果需要对物体中面的两侧进行光线投射, 你需要将material中的side属性设置为THREE.DoubleSide

.intersectObjects ( objects : Array, recursive : Boolean, optionalTarget : Array ) : Array

objects —— 检测和射线相交的一组物体。
recursive —— 若为true,则同时也会检测所有物体的后代。否则将只会检测对象本身的相交部分。默认值为true。
optionalTarget —— (可选)设置结果的目标数组。如果不设置这个值,则一个新的Array会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。

检测所有在射线与这些物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个),相交部分和.intersectObject所返回的格式是相同的。

2. 示例:点击变换颜色

import * as THREE from "three";
// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";// 目标:raycaster
// 1、创建场景
const scene = new THREE.Scene();// 2、创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,300
);const textureLoader = new THREE.TextureLoader();
const particlesTexture = textureLoader.load("./textures/particles/1.png");
// 设置相机位置
camera.position.set(0, 0, 20);
scene.add(camera);const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({wireframe: true,
});
const redMaterial = new THREE.MeshBasicMaterial({color: "#ff0000",
});// 1000立方体
let cubeArr = [];
for (let i = -5; i < 5; i++) {for (let j = -5; j < 5; j++) {for (let z = -5; z < 5; z++) {const cube = new THREE.Mesh(cubeGeometry, material);cube.position.set(i, j, z);scene.add(cube);cubeArr.push(cube);}}
}// 创建投射光线对象
const raycaster = new THREE.Raycaster();// 鼠标的位置对象
const mouse = new THREE.Vector2();// 监听鼠标的点击位置
window.addEventListener("click", (event) => {//   console.log(event);mouse.x = (event.clientX / window.innerWidth) * 2 - 1;mouse.y = -((event.clientY / window.innerHeight) * 2 - 1);raycaster.setFromCamera(mouse, camera);let result = raycaster.intersectObjects(cubeArr);//   console.log(result);//   result[0].object.material = redMaterial;result.forEach((item) => {item.object.material = redMaterial;});
});// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;
renderer.physicallyCorrectLights = true;// console.log(renderer);
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);// // 使用渲染器,通过相机将场景渲染进来
// renderer.render(scene, camera);// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。
controls.enableDamping = true;// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
// 设置时钟
const clock = new THREE.Clock();function render() {let time = clock.getElapsedTime();controls.update();renderer.render(scene, camera);//   渲染下一帧的时候就会调用render函数requestAnimationFrame(render);
}render();// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {//   console.log("画面变化了");// 更新摄像头camera.aspect = window.innerWidth / window.innerHeight;//   更新摄像机的投影矩阵camera.updateProjectionMatrix();//   更新渲染器renderer.setSize(window.innerWidth, window.innerHeight);//   设置渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio);
});

实现效果:

Three.js-光线投射(raycaster)相关推荐

  1. 光线投射Raycaster

    光线投射Raycaster Three.js 中文文档链接 这个类用于进行raycasting(光线投射). 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体). 示例 var rayc ...

  2. three.js全景搭建 、锚点标注添加、 OrbitControls 轨道方向控制 、 场景切换

    背景: 公司产品预演全景参访 实现: 场景查看 锚点标注 关键点: 二维点击转换三维坐标轴. 锚点绘制.场景切换.数据格式设计 未实现: 标注点添加gif 图片 添加视屏未实践 文档中有 添加视频的材 ...

  3. 视频教程-Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程-JavaScript

    Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程 2008年开始从事C#编程工作,2013年转向Unity游戏开发领域,在谷歌市场及苹果商店陆续 发布 ...

  4. html5 vr效果,HTML5 Three.js 虚拟现实小实验(VR Experiment)

    HTML 导入代码模板: /*! Reticulum - v1.0.12 - 2015-08-17 * https://gqpbj.github.io/examples/basic.html * * ...

  5. 3D沉浸式体验开发技巧【Three.js】

    在本文中,我们将看看如何使用 Three.js 创建一个充满后期效果和微交互的迷你城市. 推荐:将 NSDT场景编辑器 加入你的3D开发工具链. 1.背景介绍 我是一个游戏爱好者. 我一直梦想创建一个 ...

  6. threejs学习网址记录

    14.thingJS:https://www.thingjs.com/guide/city2/?campaign_id=636109562&utm_campaign=ThingJS&u ...

  7. Threejs实现3d地球记录(3)

    (2).对等距点集进行三角剖分生成Mash 我将三角剖分可以简单理解为以最接近的三点形成三角形,且各线段(三角形的边)皆不相交:这里使用开源库delaunator进行点的三角剖分 // polygon ...

  8. JavaScript 监听鼠标左右同时按下/同时按下移动

    文章目录 前言 一.代码 总结 前言 基于原生JavaScript, 在使用three.js的raycaster模拟瞄准及射击时用到. 一.代码 const obj = window;let even ...

  9. three.js使用光线投射对象Raycaster在屏幕中拾取/选取对象(vue中使用three.js60)

    用鼠标在屏幕中拾取/选取对象 1.demo效果 2.知识要点 2.1 光线投射对象Raycaster 2.1.1 创建光线投射对象 2.1.2获取射线交叉对象 3.实现要点 3.1 添加鼠标点击和悬浮 ...

最新文章

  1. Python学习笔记之基本数据结构方法
  2. 利用PyMySQL模块操作数据库
  3. html5毕业作品开场白,毕业典礼主持人开场白
  4. 图解设计模式(1) Iterator 模式
  5. 关于STM32 SPI NSS的讨论
  6. [论文阅读] Learning without Memorizing
  7. 住宅卫生间水箱配件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. 设计模式(二)构建型模式
  9. vue-router路由的使用
  10. Silverlight实现文件的下载[很简单]
  11. iTerm2使用zmodem协议上传下载文件
  12. 全国计算机软件哪年开考的,全国计算机软件考试开始报名 11月8日开考
  13. 电脑重装系统后当前安全设置不允许下载该文件
  14. 《连线》杂志主编Kevin Kelly 给年轻人的99条人生建议
  15. 仿真软件proteus构建七段数码管显示数字0-9实验
  16. 移动硬盘插入笔记本会后,右下角有图标显示,但是我的电脑里面不显示,导致打不开硬盘
  17. activity任意节点动态加签
  18. GameBuilder开发游戏应用系列之60行代码实现FlappyBird
  19. 理光打印机MP 3054 SP苹果电脑MAC驱动
  20. Brother HL-2260D, HL-2560DN, HL-6180DW 选购和使用体会

热门文章

  1. jmeter---Throughput(吞吐量)系列
  2. 浅谈USB设备的VID和PID
  3. “前世青年照”又让你上套了?大数据时代,人生处处市“陷阱”...
  4. 计算机基础知识实验内容及步骤,计算机基础实验报告要点.doc
  5. python语言基础-字典
  6. 哥德尔不完全性定理 关系 谓词和代入——哥德尔读后之二十
  7. 创建fate账户密码
  8. 动态令牌主要功能是什么???
  9. vue适配PC端屏幕自适应
  10. Jenkins 基础07 凭据管理