【Threejs】从零开始(十一)--3D交互事件

交互事件是通过光线投射进行实现的。接下来是一个相关案例。

1.首先准备基本环境

javascript 复制代码
// 导入three
import * as THREE from 'three'  // 导入threejs
//导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'


// 创建场景
const scene = new THREE.Scene()
scene.background = new THREE.Color(0x999999)

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.z = 10

// 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

//辅助坐标系
const axesHelper = new THREE.AxesHelper(5)
scene.add(axesHelper)

// 创建控制器
const controls = new OrbitControls(camera, renderer.domElement)

//自适应窗口
window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    renderer.setSize(window.innerWidth, window.innerHeight)
})

// 渲染循环
function animate() {
    requestAnimationFrame(animate)
    renderer.render(scene, camera)
}
animate()

2.创建三个球体

错开一点位置方便观察

javascript 复制代码
//创建3个球
const geometry = new THREE.SphereGeometry(1, 32, 32)//球体
const material1 = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
const material2 = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const material3 = new THREE.MeshBasicMaterial({ color: 0x0000ff })
const sphere1 = new THREE.Mesh(geometry, material1)
const sphere2 = new THREE.Mesh(geometry, material2)
const sphere3 = new THREE.Mesh(geometry, material3)
sphere1.position.x = -4
sphere2.position.x = 4
scene.add(sphere1, sphere2, sphere3)

3.实现交互

1.创建一个射线和二维的向量

javascript 复制代码
// 创建射线
const raycaster = new THREE.Raycaster()
const mouse = new THREE.Vector2()//创建二维向量

2.监听鼠标的点击事件

(1)先将鼠标的位置归一化到-1和1之间

(2)通过通过鼠标和摄像机位置确定射线位置

(3)计算物体和射线的交点

(4)改变交点物体的颜色

javascript 复制代码
// 监听鼠标移动
window.addEventListener('click', (event) => {
    // 将鼠标位置归一化到-1到1之间
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1
    mouse.y = -(event.clientY / window.innerHeight) * 2 + 1
    //通过鼠标和摄像机位置设置射线
    raycaster.setFromCamera(mouse, camera)
    // 计算物体和射线的交点
    const intersects = raycaster.intersectObjects([sphere1, sphere2, sphere3])
     console.log(intersects)
    for (let i = 0; i < intersects.length; i++) {
        
        intersects[i].object.material.color.set(0xffff00)

    }

})

大功告成!!!

相关推荐
daifgFuture1 天前
Android 3D球形水平圆形旋转,旋转动态更换图片
android·3d
牧子川2 天前
【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)
3d·cvpr2023·poseformerv2
资深设备全生命周期管理2 天前
优化版本,增加3D 视觉 查看前面的记录
3d
m0_748250742 天前
GPUCUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)
人工智能·3d
少林6592 天前
谷歌地图高清卫星地图2026中文版下载|谷歌地图3D卫星高清版 V7.3.6.9796 最新免费版下载 - 前端工具导航
3d·谷歌地图
LeonDL1682 天前
HALCON 深度学习训练 3D 图像的几种方式优缺点
人工智能·python·深度学习·3d·halcon·halcon训练3d图像·深度学习训练3d图像
xhload3d4 天前
图扑软件 | 带你体验 Low Poly 卡通三维世界
物联网·3d·智慧城市·html5·webgl·数字孪生·可视化·工业互联网·三维建模·工控·轻量化·中国风·卡通动画·写实风格·科技风·low poly
图扑数字孪生4 天前
基于 HT for Web 轻量化 3D 数字孪生数据中心解决方案
3d·数字孪生·三维可视化·数据中心·智慧机房
njsgcs4 天前
PolyGen:一个用于 3D 网格的自回归生成模型 论文阅读
3d
Angel Q.4 天前
PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
数码相机·算法·3d·pnp