Three.js 实现点击模型改变颜色

想实现点击模型,改变模型颜色的效果。在网上看了一些代码,发现特别搞笑,很多的博客给出的计算代码都是错误的,根本无法实现点击效果,还在不同的博客相互的复制,只能感叹抄袭党太多。下面我简单的介绍一些我的方法,我是在Vue中开发的。

文章目录

  • Three.js 实现点击模型改变颜色
    • 三维空间点击事件的原理
    • 环境准备
    • 代码实现
    • 效果展示
    • 注意事项

三维空间点击事件的原理

在三维空间内判断鼠标点击的是哪个模型,核心的原理还是射线碰撞,*即从相机(camera)的中心点到屏幕上鼠标点组成一条射线,计算三维场景内哪些模型被射线穿过。*原理比较简单,计算比较复杂。主要是涉及了三个坐标系的转换:

  1. 将鼠标点从屏幕坐标系(y正向向下,x轴向右)转换到三维空间里的可视窗口的二维坐标系(正常的二维坐标系,但xy的区间是-1~1);
  2. 将三维空间里的可视窗口的二维坐标系点转换为三维空间的xyz坐标系
  3. 将2转换后的点和camera的中心点组成射线

环境准备

基于vue的环境准备,可以参考我之前的博文

代码实现

<template><div id="app" @click="clickBox"></div>
</template><script>
import {Scene,PerspectiveCamera,WebGLRenderer,Mesh,BoxGeometry, MeshBasicMaterial, Raycaster, Vector2
} from 'three';import {OrbitControls} from "@/lib/OrbitControls"export default {name: 'App',components: {},mounted() {let scene = new Scene();let camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);let renderer = new WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);let app = document.getElementById("app")app.appendChild(renderer.domElement);//加载场景控制插件let controls = new OrbitControls(camera, renderer.domElement);controls.enableDamping = true;controls.enableZoom = true;controls.autoRotate = false;controls.autoRotateSpeed = 3;controls.enablePan = true;controls.enableKeys = true;controls.keyPanSpeed = 7;controls.keys = {LEFT: 37,UP: 38,RIGHT: 39,BOTTOM: 40}this.controls = controls;this.createBox(scene);this.createBox(scene);this.createBox(scene);camera.position.z = 5;this.camera = camera;this.scene = scene;//渲染场景let animate = () => {requestAnimationFrame(animate);renderer.render(scene, camera);};animate();},methods: {//生成随机盒子模型createBox(scene) {let geometry = new BoxGeometry();let material = new MeshBasicMaterial({color: 0x00ff00});let cube = new Mesh(geometry, material);cube.position.x = Math.random() * 6-3cube.position.y = Math.random() * 6-3scene.add(cube);},clickBox(event) {console.log(Math.random().toString(16))let raycaster = new Raycaster();let mouse = new Vector2();console.log(this.scene.children)//将鼠标点击位置的屏幕坐标转换成threejs中的标准坐标mouse.x = (event.clientX / window.innerWidth) * 2 - 1mouse.y = 1-(event.clientY / window.innerHeight) * 2console.log(mouse)// 通过鼠标点的位置和当前相机的矩阵计算出raycasterraycaster.setFromCamera(mouse, this.camera);// 获取raycaster直线和所有模型相交的数组集合var intersects = raycaster.intersectObjects(this.scene.children);console.log(intersects);//将所有的相交的模型的颜色设置为红色for (var i = 0; i < intersects.length; i++) {intersects[i].object.material.color.set(0xff0000);}}}}
</script><style>
#app {}body, html {margin: 0;padding: 0;
}
</style>

效果展示

注意事项

网上很多的代码写的都是

mouse.y = (event.clientY / window.innerHeight) * 2 + 1;

可以看出来这个y一直都是大于1的

Three.js 实现点击模型改变颜色相关推荐

  1. jsp点击文字改变颜色_这样给图片添加上文字、诗词、歌词,超吸睛

    这样给图片添加上文字.诗词.歌词,超吸睛! 很多小伙伴想给自己的图片天爱上文字.诗词还有歌词,但是不知道怎么天爱才能吸引别人. 1. 直接给图片添加上文字.诗词或者歌词,可以给图片调节一个背景颜色. ...

  2. C4D卡死和运行中一点击模型填充颜色就卡退出

    之前用过C4D做一些模型,不太清楚一些其他卡住的原因,自己当初只遇到了用一会就卡退出来崩溃的原因. 这个原因在这里贴出,估计出现这个原因的人很多都放弃C4D了,现在就写一下. 这个错误是我把错误发给C ...

  3. Vue 点击文字改变文字颜色

    Vue 点击文字改变颜色,点击哪一个改变哪一个 <!DOCTYPE html> <html lang="en"> <head><meta ...

  4. Php点击更换封面,JavaScript_js实现点击图片改变页面背景图的方法,本文实例讲述了js实现点击图 - phpStudy...

    js实现点击图片改变页面背景图的方法 本文实例讲述了js实现点击图片改变页面背景图的方法.分享给大家供大家参考.具体实现方法如下: 点击图片即改变页面的背景图片 希望本文所述对大家的javascrip ...

  5. three.js改变模型局部颜色(vue)

    传入想要改变颜色的3D模型对象,选择子级mesh的名字修改模型局部颜色 object.traverse(child=>{// if(object.name==='model.glb') {// ...

  6. Three.js 点击模型,高亮发光模型外轮廓

    最近在开发一个功能,在三维场景里有很多模型,需要点击模型,高亮对应的模型,代表选中了该模型.做起来还是稍微麻烦一些的. 具体效果 实现流程 主要的流程还是, Created with Raphaël ...

  7. Vue实现点击列表切换并改变颜色

    Vue实现点击列表切换并改变颜色 实现效果图如下 通过Vue的父子组件传值实现效果,单击切换颜色会进性改变并添加下划线 父组件代码实现(Home.vue) 需要进性对子组件的导入 import Tab ...

  8. html改游戏聊天字体颜色,html点击按钮改变字体颜色怎么实现

    html点击按钮改变字体颜色的实现方法:1.创建一个html文件:2.在html文件中添加html代码架构:3.在body标签里面使用button标签实现一个按钮,并使用style给按钮添加样式以及使 ...

  9. html指定区域的背景颜色,JS实现点击颜色块切换指定区域背景颜色的方法

    本文实例讲述了JS实现点击颜色块切换指定区域背景颜色的方法..具体实现方法如下: 代码如下: JS实现点击颜色块切换指定区域的背景颜色 适时切换网页指定区域背景颜色 请选择背景: function g ...

最新文章

  1. 如何用jsp在线自动批改_推荐:5个好用的免费自动化在线营销工具
  2. UIImageView
  3. 【入门经典】创建站点地图
  4. c++ socket学习(1.3)
  5. 技术沙龙 | 图神经网络(GNN)最新研究进展分享
  6. php上传大文件500错误,PHP fastcgi模式大文件上传500错误
  7. Python——数据存储:JSON操作
  8. linux数据向量化指令,不充分SIMD向量化技术研究.PDF
  9. zTree实现树的模糊搜索功能
  10. 使用Logisim软件实现一位全加器,四位串行加法器,四位并行加法器。
  11. 风尚云网学习-Linux/宝塔面板部署禅道开源系统
  12. N卡所有旧版本驱动下载(2021年6月3日测试可用版)
  13. [HNOI 2017] bzoj4826 影魔 [单调栈+扫描线]
  14. Discuz手机视频模板 AIUI7.3.0 商业版
  15. ios绘图_使用Pencilkit轻松将绘图功能添加到ios应用
  16. 遗传算法(Genetic Algorithm)解析
  17. linux configure 的 --prefix 参数的作用
  18. php excel下载打不开了,php下载excel无法打开的解决方法_PHP教程
  19. 2023COSP深圳户外展行业高峰论坛即将召开!博洋优选也将参加
  20. 带你了解代理模式中的静态代理和动态代理以及cgilib代理^_^

热门文章

  1. 数据中台到底如何落地实现【含架构图及代码】
  2. 微软过桥问题的图论解法
  3. java虚拟机 (JVM)
  4. Java基础:this关键字可在方法参数和成员变量同名时进行区分
  5. 管理信息系统【五】之 系统分析
  6. requests接口自动化测试
  7. Lumion 9.0 建筑动画微电影:Uncaptured
  8. Ionic + Vue3 + Capacitor 配置应用信(App 包名、应用名、应用图标、启动动画、版本信息)
  9. 前端实现类似外卖订单的打印
  10. 乐行天下激光雷达数据口测试