Threejs进阶之十:让模型移动到鼠标点击的指定位置

这篇具有很好参考价值的文章主要介绍了Threejs进阶之十:让模型移动到鼠标点击的指定位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节中我们实现了物体沿指定轨迹移动的动画效果,这一节我们来实现让模型移动到鼠标点击的制定位置的动画效果。
先看下实现后的最终效果
Threejs进阶之十:让模型移动到鼠标点击的指定位置
要实现上面的动画效果,我们需要通过以下步骤来实现

第一步,监听鼠标事件

我们需要监听鼠标的点击事件,获取鼠标点击点相对浏览器可视区域左上角的距离,通过监听“pointerdown”事件,获取点击点的clientX和clientY;clientX/Y获取到的是点击点相对浏览器可视区域左上角距离。

renderer.domElement.addEventListener('pointerdown',function(event) {
   
    event = event || window.event
    initPos = {
   
      x:event.clientX,
      y:event.clientY
    } 
})

第二步:获取鼠标点击点的屏幕坐标

通过Element.getBoundingClientRect()中的 top属性获取元素上边距离页面上边的距离,
通过left属性获取元素左边距离页面左边的距离,
通过计算 clientX 与domElement.getBoundingClientRect().left的差值,获取x点坐标;
通过计算 clientY 与domElement.getBoundingClientRect().top的差值,获取y点坐标;

  let x = event.clientX - renderer.domElement.getBoundingClientRect().left
  let y = event.clientY - renderer.domElement.getBoundingClientRect().top

第三步:获取画布的宽度和高度并归一化

通过坐标转换,将x和y的坐标归一化,即将屏幕坐标转换为threejs的世界坐标

 let canvasWidth = renderer.domElement.clientWidth 
 // clientWidth 返回元素的可视宽度,包括内边距,但不包括边框、滚动条或外边距,以像素计
 // canvas画布高度
 // clientHeight 返回元素的可视高度,包括内边距,但不包括边框、滚动条或外边距,以像素计。
 let canvasHeight = renderer.domElement.clientHeight
 // offsetHeight 属性返回元素的可视高度(以像素为单位),包括内边距、边框和滚动条,但不包括外边距。
 // offsetWidth 属性返回元素的可视宽度(以像素为单位),包括内边距、边框和滚动条,但不包括外边距。
 // 坐标转换(归一化的值) 
 const sx = -1 + (x / canvasWidth) * 2 
 const sy = 1 - (y / canvasHeight) * 2

第四步:创建光线投射器,并通过摄像机和鼠标点击的位置更新射线

// 光线投射器
const rayCaster = new THREE.Raycaster()
// 通过摄像机和鼠标位置更新射线
rayCaster.setFromCamera(new THREE.Vector2(sx,sy),camera) 

第五步:通过rayCaster.intersectObjects()方法检测射线与物体的交集

这里我们是点击在水面上,因此,将water作为参数传入,检测射线与水面的交集,将结果返回给intersects

const intersects = rayCaster.intersectObjects([water]) 

第六步:判断射线与物体是否有交集,如果有,获取坐标并处理逻辑

通过if语句判断intersects.length是否大于零,如果大于零,说明有交集,在if语句中处理如下逻辑:
1、通过intersects[0].point获取鼠标点击时射线与water相交点的坐标(新位置)存入newPos变量,
2、通过yacht.position.clone() 获取模型当前位置坐标(老位置)存入originPos变量
3、通过camera.position.clone() 获取相机当前位置坐标(老位置)存入cameraOriginPos 变量
4、通过向量减法获取鼠标点击点的向量和向量长度 存入vector 变量
5、创建一个四元数对象,通过.setFromUnitVectors将该四元数设置为从方向向量new THREE.Vector3(0,0,-1)旋转到方向向量 vector 单位向量 所需的旋转角度。
6、创建一个Threejs的Clock()对象
7、创建一个speed常量为100,设置移动速度
8、通过setInterval()方法启动定时器,通过speed和clock.getElapsedTime()失去时间的乘积,得到每次时间间隔移动的长度
9、通过每次时间间隔移动的长度除以向量总长度,获取每次间隔移动的比值,将该比值与重点向量相乘,得到每次间隔移动的向量坐标
10、将上面得到的每次间隔移动的向量坐标与模型原始位置向量坐标相加,得到模型每次时间间隔移动的重点向量坐标
11、将每次间隔移动的终点坐标复制给模型的position属性
12、将每次间隔移动的向量坐标与相机原始坐标相加得到每次时间间隔移动的终点坐标,并将给坐标复制给相机的position属性
13、将每次时间间隔的终点坐标movePos复制给控制器的target属性,使其始终朝向movePos位置
14、执行完成后清除定时器文章来源地址https://www.toymoban.com/news/detail-484904.html

                    

到了这里,关于Threejs进阶之十:让模型移动到鼠标点击的指定位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Threejs进阶之十五:在Thereejs 使用自定义shader

    先看下这次代码最终要实现的效果, 效果分析: 要实现上述效果,我们需要两张图片,作为纹理贴图,使其图案产生明暗效果;然后通过定义ShaderMaterial对象通过自定义Shader实现上述效果;后面代码中会进行详细分析; 这里我们先介绍下基础知识 Shader(着色器)是一种在图

    2024年02月05日
    浏览(42)
  • Threejs进阶之十一:使用FontLoader和TextGeometry创建三维文字

    在Threejs中我们可以通过FontLoader和TextGeometry结合使用来创建三维文字,FontLoader用于加载JSON格式的字体,FontLoader返回值是表示字体的Shape类型的数组;TextGeometry用于将文本生成为单一的几何体。下面我们先来了解下这两个类 用于加载JSON格式的字体的类。返回font, 返回值是表示

    2024年02月06日
    浏览(45)
  • CesiumForUnity详解二(加载自定义建筑模型,移动到指定位置)

    1.脚本介绍 2.导入官网模型数据 3.通过url获取自定义模型数据 一.脚本介绍 创建一个地球后,你在unity面板上会有两个父子级得对象,如图 CesiumGeoreference:这个脚本主要是管理经纬度得地理坐标 提供核心方方法设置经纬度,修改坐标值可直接定位到指定地点:注意该经纬度坐

    2024年02月12日
    浏览(43)
  • 【VTK】基于读取出来的 STL 模型,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 基于读取出来的 STL 模型,实现当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点。 详细流程为:点击 Select 按钮,鼠标具备选择的功能

    2024年02月14日
    浏览(46)
  • Threejs进阶之十三:CSS3DRenderer与Tween.js实现粒子小球按规律变化

    今天我们使用CSS3DRenderer+Tween.js实现Threejs官方示例中的粒子小球按规律变化的效果,先看下最终实现的效果 先来分析下,这个页面的动画效果是由512个小球组合起来的四种不同变化,分别是曲面、立方体、随机和圆球四种变化;下面我们来实现下这个效果 老套路,要实现上面

    2024年02月03日
    浏览(54)
  • threejs点击获取三维坐标(Three.js获取鼠标点击的三维坐标)

    绑定点击事件,通过 THREE.Raycaster 光线投射,用于确定鼠标点击位置上有哪些物体, raycaster.intersectObjects(scene.children) 返回点击位置上所有的物体的数组;我们用 var selected = intersects[0] 取第一个,也就是最前面的那个物体;在通过 selected.point 取点坐标

    2024年02月11日
    浏览(127)
  • threejs平滑地移动相机的位置,将其逐渐接近目标点位置(tweemjs)

    一、npm安装tweemjs 二、引入tweemjs 三、使用 注:这里需要在requestAnimationFrame内调用TWEEN.update();不然动画不生效。

    2024年02月12日
    浏览(51)
  • Qt鼠标点击事件处理:显示鼠标点击位置(完整示例)

    Qt 入门实战教程(目录) 前驱文章: Qt Creator 创建 Qt 默认窗口程序(推荐) 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。 例如点击鼠标,按下按键。 在Qt中使用一个对象来表示一个事件,它继承自QEvent类。 如鼠标事件(例如点击

    2024年02月10日
    浏览(56)
  • powershell 获取鼠标位置 与 鼠标点击

    2024年02月11日
    浏览(53)
  • Python模拟鼠标点击与实时获取鼠标位置

    鼠标点击会用到pymouse库。 在cmd中运行,使用镜像下载 编译器在运行时可能会报错,会出现No module named win32api问题,这是由于Python是没有自带访问windows系统API的库的,需要下载。 在cmd中运行,使用镜像下载pywin32。 time.sleep(num),num值可以自己进行设置,单位为秒。 程序运行

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包