Threejs之看房案例(下)

本文目录

  • 前言
  • 最终效果
  • 1、点精灵
    • 1.1 添加点精灵
    • 1.2 点精灵效果
  • 2、添加事件
    • 2.1 鼠标移动事件
      • 2.1.1 效果
    • 2.2 鼠标点击事件
      • 2.2.1 效果
    • 2.3 切换互通
  • 3. 完整代码

前言

在Threejs之看房案例(上)这篇博客中我们已经完成了大厅的3d观看效果,但是我们会发现如果想去其他房间观看,没有交互,接下来我们将完成交互观看的效果。本篇博客已绑定资源包,资源包一键下载后,yarn dev访问http://localhost:5174/three-3d-kanfang/index.html即能一键跑起项目,可以在此基础上依瓢画葫芦,或者修改图片完成自定义的看房项目。

最终效果

请添加图片描述

1、点精灵

点精灵Threejs之看房案例(上)本篇文章的球形模式代码为基础,在此基础上如果需要交互的话,我们使用到射线进行交互。

1.1 添加点精灵

我们首先得有点精灵图进行标识厨房与大厅,加入代码如下所示:

        // 点精灵const spriteTexture = textureLoader.load('../assets/tips/kitchen.png');const spriteMaterial = new THREE.SpriteMaterial({map: spriteTexture});const sprite = new THREE.Sprite(spriteMaterial);sprite.name = 'kitchen'; // 可以通过这个属性,与相交的射线判断进入哪个房间sprite.scale.set(15, 6, 1);scene.add(sprite);

1.2 点精灵效果

请添加图片描述
可以看到效果那就是点精灵厨房位置没对上,那我们其实可以打开坐标轴来设置点精灵位置,打开坐标轴辅助器:

        // 打开坐标轴辅助器const axesHelper = new THREE.AxesHelper( 30 );scene.add( axesHelper );

效果:
在这里插入图片描述
在这里插入图片描述
我们可看到点精灵x y z轴都要设置为负的:sprite.position.set(-70,0,-50);后效果如下:
请添加图片描述
已经贴在了我们厨房门上。


2、添加事件

2.1 鼠标移动事件

添加鼠标移动事件,我们需要做的是将鼠标移动的点坐标转换为一个位于二维空间中的点,在标准化设备坐标中鼠标的二维坐标 —— X分量与Y分量应当在-1到1之间。然后将这个二维空间中的点方向来更新射线。并且还要将将此向量(坐标)从世界空间投影到相机的标准化设备坐标 (NDC) 空间。代码如下:

        // 事件const oHover = document.querySelector('.hover');const raycaster = new THREE.Raycaster();const mouse = new THREE.Vector2();renderer.domElement.addEventListener("mousemove", (event) => {mouse.x = (event.clientX / window.innerWidth) * 2 - 1;mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;raycaster.setFromCamera(mouse, camera);const intersects = raycaster.intersectObject(sprite);console.log(intersects);if (intersects.length) {const worldVector = new THREE.Vector3(intersects[0].object.position.x,intersects[0].object.position.y,intersects[0].object.position.z,);const dncPosition = worldVector.project(camera); // 将此向量(坐标)从世界空间投影到相机的标准化设备坐标 (NDC) 空间。const halfWidth = window.innerWidth/2;const halfHeight = window.innerHeight/2;const top = -halfHeight*dncPosition.y + halfHeight - 60;const left = halfWidth*dncPosition.x + halfWidth;oHover.style.top = top + 'px';oHover.style.left = left + 'px';oHover.style.display = 'block';}else {oHover.style.top = 0 + 'px';oHover.style.left = 0 + 'px';oHover.style.display = 'none';}})

2.1.1 效果

效果如下:
请添加图片描述

2.2 鼠标点击事件

好的,我们将进行鼠标点击时进入的厨房的效果。
加入代码:

        renderer.domElement.addEventListener("mousedown", (event) => {mouse.x = (event.clientX / window.innerWidth) * 2 - 1;mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;raycaster.setFromCamera(mouse, camera);const intersects = raycaster.intersectObject(sprite);if (intersects.length && intersects[0].object.name == 'kitchen') {const kitchenTexture = textureLoader.load('../assets/kitchen.png');const kitchenMaterial = new THREE.MeshBasicMaterial({map: kitchenTexture});sphere.material = kitchenMaterial; // 更改贴图为厨房贴图}})

2.2.1 效果

效果如下:

请添加图片描述
可以看到我们切换到了厨房里,但是会发现我们切换不回去了,并且点精灵位置和描述都不对,接下来我们将实现这一步。

2.3 切换互通

也是在鼠标点击下去的时候判断是不是跳转到客厅,代码如下:

 else if (intersects.length && intersects[0].object.name == 'living') {const livingTexture = textureLoader.load('../assets/livingRoom.jpg');const livingMaterial = new THREE.MeshBasicMaterial({map: livingTexture});sphere.material = livingMaterial; // 更改贴图为厨房贴图const kitchenSprite = textureLoader.load("../assets/tips/kitchen.png"); // 加载大厅精灵图 const kitchenSpriteMaterial = new THREE.SpriteMaterial({map: kitchenSprite}); // 精灵图sprite.name = 'kitchen'; // 厨房sprite.material = kitchenSpriteMaterial; // 更改精灵图sprite.position.set(-70,0,-50); // 更改位置}

效果:
请添加图片描述


3. 完整代码

最后给出完整代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1538163.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用SQL递归查询树状结构,又可以跟同事吹牛了!

前言 在关系型数据库中&#xff0c;数据通常存储为二维表格&#xff08;rows 和 columns&#xff09;。然而&#xff0c;在实际业务中&#xff0c;很多场景下我们需要处理树状结构的数据&#xff0c;例如&#xff1a; 公司组织架构&#xff1a;从某个部门开始&#xff0c;查询…

Python异常处理:自定义异常②

文章目录 1. 什么是自定义异常&#xff1f;2. 为什么需要自定义异常&#xff1f;3. 如何定义自定义异常&#xff1f;3.1 基本自定义异常3.2 带详细信息的自定义异常3.3 自定义异常的继承层次 4. 使用自定义异常4.1 抛出自定义异常4.2 捕获自定义异常 5. 自定义异常的应用场景5.…

二叉树——数据结构

这次我们来学习一下数据结构中的二叉树 1. 二叉树的概念及结构 1.1 二叉树的定义 定义&#xff1a;所有结点的度小于等于2的树。 上图中可以看出 二叉树不存在度大于2的结点二叉树的子树有左右之分&#xff0c;次序不能颠倒&#xff0c;因此二叉树是有序树。 任意二叉树都…

2024年适合培训服务企业的7款CRM盘点

培训服务行业在线索管理、客户管理、数据分析、项目管理、师资管理和课程管理等方面&#xff0c;使用CRM可以事半功倍&#xff0c;最重要的是&#xff0c;可以用数据说话&#xff0c;找到降本增效的方向。 下面对培训服务行业常用测CRM做个盘点&#xff0c;包括国内比较头部的…

米壳AI:跨境电商必备:不损失原图的图片翻译工具!

嘿&#xff0c;跨境电商的小伙伴们&#xff01; 今天来聊聊如何突破语言壁垒&#xff0c;让你的商品在国际市场上大放异彩。 随着 “一带一路” 战略的不断推进&#xff0c;跨境电商的发展势头愈发强劲。然而&#xff0c;语言障碍却成为了跨境交易中的一大难题。别担心&#x…

ppt组织结构图怎么增加分支?

在使用ppt里边的SmartArt来制作组织结构图的时候&#xff0c;我们发现里边的图形不够用&#xff0c;需要增加分支&#xff0c;这也就是大家近期问的ppt组织结构图怎么增加分支。今天设计学徒自学网小编就把具体的操作步骤分享给大家了&#xff0c;希望能帮助你们&#xff01; …

RFID技术实现消防物资消防车无感化智能管理设计方案

在消防工作中&#xff0c;物资管理的高效性与准确性直接关系到救援行动的成败&#xff0c;传统的消防物资管理方式主要依赖人工记录和定期盘点&#xff0c;这种方式存在着诸多弊端。首先&#xff0c;人工记录容易出现错误&#xff0c;数据的准确性难以保证。例如&#xff0c;在…

制作U盘安装操作系统(启动盘、系统盘、Windows、Linux)

第一种&#xff08;Windows&#xff09; 官网windows制作启动盘 1. 打开Win11下载官网 下载 Windows 11https://www.microsoft.com/zh-cn/software-download/windows11 2. 下载制作操作系统工具 这里不要下载错了 3. 启动工具 选择U盘&#xff0c;选择你的U盘即可&#xf…

TASK-CUSTOMIZEDMASKED AUTOENCODERVIA MIXTURE OF CLUSTER-CONDITIONAL EXPERTS

发表于&#xff1a;ICLR 2023 notable top 25%&#xff08;相当于spotlight) 推荐指数: #paper/⭐⭐⭐ 论文链接: Task-customized Masked Autoencoder via Mixture of Cluster-conditional Experts | OpenReview poster链接&#xff1a;ICLR 2023 Task-customized Masked Auto…

人类行为识别系统源码分享

人类行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用streaming-json-py插件处理JSON数据流:详细指南

目录 一、streaming-json-py简介 二、安装与配置 三、基本使用 示例1:处理不完整的JSON对象 示例2:处理不完整的JSON数组 四、高级用法 实时数据流分析 日志处理 五、性能优化与错误处理 六、总结与展望 在数据驱动的现代社会,实时处理数据流已成为许多应用和服务…

Linux·权限与工具-git与gdb

1. git工具 git是一款软件&#xff0c;发明它的人同时发明了Linux操作系统&#xff0c;也就是大名鼎鼎的Linus Torvalds 林纳斯托瓦兹。后来人们把git软件包装&#xff0c;产生了github、gitee等平台。 git产生的初衷就是便于进行多人协同管理&#xff0c;同时它还可以用来将本…

GB/T28181-2022相对老版本有哪些变动?

GB/T28181-2022新版概述 GB/T28181-2022是《公共安全视频监控联网系统信息传输、交换、控制技术要求》的国家标准&#xff0c;该标准在2022年12月30日发布&#xff0c;并于2023年7月1日正式实施。以下是关于GB/T28181-2022的详细解析&#xff1a; 一、标准概述 GB/T28181-20…

2024/9/18 模型的存储与读取

一、模型的存储与读取 主要涉及到torch.save和torch.load函数 新建两个python文件&#xff1a; 1.在model_save文件中保存模型(方式一)和模型参数(方式二) 2.在model_load文件中读取模型(方式一)和模型参数并装载模型(方式二)

海外绿色农业果蔬投资系统可以二开多语言

食品安全已经是全球非常重视&#xff0c;关于农业方面的基础建设投资都在大力推进&#xff0c;做一个绿色农业果蔬投资是一个非常不错的。希望这个系统能对你有很大的帮助&#xff01;

三菱变频器变更电流最大输入(20mA 初始值)时的频率(60Hz初始值)

变更最高频率。变更示例 在4~ 20mA 输入频率设定器中&#xff0c;将 20mA 时的频率从 60Hz(初始值)变更为 50Hz。 输入 20mA 电流时调整为输出 50Hz。 将Pr.126 设定为“50Hz” NOTE 4mV 时的频率设定可通过校正参数 C5 设定。 其他的频率设定电流增益的调整方法&#xff0c;还…

泛微E-Mobile client/cdnfile 任意文件读取漏洞复现

0x01 产品简介 泛微E-Mobile是一款由泛微网络科技股份有限公司开发的移动办公产品,该产品专门为手机、平板电脑等移动终端用户设计,旨在提供便捷、高效的移动办公体验。适用于企业高管和有移动办公需求的业务部相关员工使用,特别适合于已有内部OA系统的大中型企业机构,尤其…

HBuilder无法打开微信开发者工具

配置微信开发工具路径之后&#xff0c;HBuilder无法打开微信开发者工具 使用HBuilder打开微信开发者工具的配置&#xff0c;官网有 运行至微信模拟器控制台报错 这个时候就需要打开微信开发者工具进行安全设置了

国外问卷调查怎么做的,新手怎么开始?

既然你准备进入这个行业&#xff0c;就应该明白一件事&#xff1a;这个项目&#xff0c;本质就是网络搬砖。 也就是你搬的越多、越快&#xff0c;就赚得越多。 做一份问卷&#xff0c;比如2美元&#xff0c;做50份&#xff0c;就是100美元&#xff0c;也就是700元左右。 月入…

好用的超声波清洗机有哪些?精选四大爆款品牌汇总

随着时代的发展及生活水平的提升&#xff0c;珠宝饰品、眼镜等个人物品日益普及至千家万户。然而&#xff0c;这些贵重小物在日常存放中难免会积累微尘与隐形细菌&#xff0c;无形中可能对我们的健康产生潜在影响。鉴于细菌的微小难察&#xff0c;超声波清洗机应运而生&#xf…