基于three.js的室内全景3D展馆案例分享

  • 先看效果图
    • 实现了第一人称行走,WASD
    • 点击目标画册进行预览查看
    • 位置音乐播放环绕
    • 地面镜面反光
    • 碰撞检测等等.

地址在gitee上gallery: 数字展馆概念的demo项目,本项目中使用的技术栈为three.js

 有兴趣的伙伴可以去下载看看,有这方面的项目应该能受很大启发。

import Core from "../core";

import Environment from "../environment";

import Character from "../character";

import Css3DRenderer from "../css3DRenderer";

import Audio from "../audio";

import RayCasterControls from "../rayCasterControls";

import {ON_CLICK_RAY_CAST, ON_HIDE_TOOLTIP, ON_LOAD_MODEL_FINISH, ON_LOAD_PROGRESS, ON_ENTER_APP, ON_SHOW_TOOLTIP} from "../Constants";

import {Object3D} from "three";

export default class World {

    private core: Core;

    private environment: Environment;

    private character: Character;

    private css_3d_renderer: Css3DRenderer;

    private audio: Audio;

    private ray_caster_controls: RayCasterControls;

    constructor() {

        this.core = new Core();

        this.core.$on(ON_LOAD_PROGRESS, this._handleLoadProgress.bind(this));

        this.core.$on(ON_LOAD_MODEL_FINISH, this._onLoadModelFinish.bind(this));

        this.core.$on(ON_CLICK_RAY_CAST, this._onClickRayCast.bind(this));

        this.core.$on(ON_SHOW_TOOLTIP, this._onShowTooltip.bind(this));

        this.core.$on(ON_HIDE_TOOLTIP, this._onHideTooltip.bind(this));

        this.core.$on(ON_ENTER_APP, this._onEnterApp.bind(this));

        this.environment = new Environment();

        this.character = new Character({speed: 12});

        this.css_3d_renderer = new Css3DRenderer();

        this.audio = new Audio();

        this.ray_caster_controls = new RayCasterControls();

    }

    update(delta: number) {

        if (this.environment.collider && this.environment.is_load_finished) {

            this.css_3d_renderer.update();

            this.character.update(delta, this.environment.collider);

            this.ray_caster_controls.updateTooltipRayCast(this.environment.raycast_objects);

        }

    }

    /*

    * 点击进入展馆后的回调

    * */

    private _onEnterApp() {

        this.audio.playAudio();

        // 进入后才允许控制键盘

        this.core.control_manage.enabled();

    }

    private async _onLoadModelFinish() {

        // 场景模型加载完毕后开始加载音频

        await this.audio.createAudio();

        // 音频加载完毕后移除加载进度UI,显示进入确认UI

        this.core.ui.removeLoading();

        this.core.ui.showLoadingConfirm();

        // 场景模型加载完毕后将场景中需要光线投射检测的物体传入给rayCasterControls

        this.ray_caster_controls.bindClickRayCastObj(this.environment.raycast_objects);

    }

    private _handleLoadProgress([{url, loaded, total}]: [{url: string, loaded: number, total: number}]) {

        const percentage = ((loaded / total) * 100).toFixed(2);

        if (/.*\.(blob|glb)$/i.test(url)) {

            this.core.ui.updateLoadingProgress(`${url.includes("collision") ? "加载碰撞场景模型" : "加载其他场景模型"}:${percentage}%`);

        }

        if (/.*\.(jpg|png|jpeg)$/i.test(url)) {

            this.core.ui.updateLoadingProgress("加载图片素材中...");

        }

        if (/.*\.(m4a|mp3)$/i.test(url)) {

            this.core.ui.updateLoadingProgress("加载声音资源中...");

        }

    }

    private _onClickRayCast([object]: [object: Object3D]) {

        this.core.ui.showBoardsBox(

            object.userData.title,

            object.userData.author,

            object.userData.describe,

            object.userData.src,

        );

    }

    private _onShowTooltip([{msg, show_preview_tips}]: [{ msg: string, show_preview_tips: boolean }]) {

        this.core.ui.showPreviewTooltip(msg, show_preview_tips);

    }

    private _onHideTooltip() {

        this.core.ui.hidePreviewTooltip();

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python FastApi连接oracle进行查询

这边技术选型是cx_oracle进行连接查询,cx_oracle的使用首先要有官方的客户端才能连接到数据库,python并不自带客户端。我用是Python3.9 安装客户端 可以到官网在选择最新版进行下载。 Instant Client for Microsoft Windows (x64) 64-bit 或者直接从我…

maven命令行安装依赖测试

mvn dependency:get -DgroupIdorg.springframework -DartifactIdspring-core -Dversion5.3.9作用:可用于测试配置环境变量后,能否下载依赖到本地仓库

【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码

文章目录 前言1.EnableEurekaServer2.初始化缓存3.jersey应用程序构建3.1注册jeseryFilter3.2构建JerseyApplication 4.处理注册请求5.registry() 前言 前段时间遇到了一个业务问题就是k8s滚动发布Eureka微服务的过程中接口会有很多告警,当时…

nacos入门篇001-安装与启动

1、下载zip包 我这里下载的是版本2.2.0 Nacos 快速开始 2、修改配置文件 2.1集群模式修改成单例模式 vi startup.sh 2.2 修改数据库配置信息 3、初始化数据库 3.1 创建db名称:db_nacos 3.2 执行mysql-schema.sql 3.3 执行完截图: 4、运行脚本启动 …

实现区域地图散点图效果,vue+echart地图+散点图

1.效果图 2.准备工作,在main.js和index.js文件中添加以下内容 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL,// v:3.0, // 默认使用3.0// type: WebGL // ||API…

【Kubernetes】kubectl 常用命令

kubectl 常用命令 1.基础命令2.部署命令3.集群管理命令4.故障诊断与调试命令5.高级命令6.设置命令7.其他命令 1.基础命令 命令 说明 create通过文件名或标准输入创建 Kubernetes 的资源expose将 Kubernetes 的资源展露为一个服务run在集群中运行一个特定的镜像set修改对象的特…

初识Java并发,一问读懂Java并发知识文集(3)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Windows环境检验NodeJs安装是否成功

Windows环境检验NodeJs安装是否成功 检验方法 1、winR 打开运行窗口,在此窗口输入cmd命令 2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功 node -v:显示安装的nodejs版本npm -v:显示安装…

GOM转996视频教程(急速转换)新手小白必看

GOM转996视频教程(急速转换)新手小白必看 GOM转996视频教程(急速转换)视频内容详细有声音,并且附件中包含了视频中所用到的工具,可以说是新手小白的理解教程。 1.GOM版本的介绍以及996单机搭建.wmv 2.地图资源分类与打包.wmv 3.NPC资源分类与打包.wmv 4…

MIT线性代数笔记-第33讲-复习三

目录 33.复习三打赏 33.复习三 已知 d u ⃗ d t A u ⃗ [ 0 − 1 0 1 0 − 1 0 1 0 ] u ⃗ \dfrac{d \vec{u}}{dt} A \vec{u} \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & -1 \\ 0 & 1 & 0 \end{bmatrix} \vec{u} dtdu ​Au ​010​−101​0−10​ ​…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中,管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例,帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(16)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(15) 1.3 PCI总线的存储器读写总线事务 1.3.5 Delayed传送方式 如前文所述,当处理器使用Non-Posted总线周期对PCI设备进行操作、或者PCI设备使…

C#/Net调用阿里云的短信服务

在C#代码里调用阿里云的短信服务,用于推送消息 以下介绍具体的步骤主要分为配置和代码调用 服务管理和配置 在控制台首页进入短信服务 使用流程 跟随快速学习和测试 1.申请签名 签名必须为企业名字或者对应网站、应用的名称,其他名称则无法通过校验 …

直方图与均衡化

直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。 channels:同样用中括号括起来&#xff…

座舱音频系统的架构设计和音频体验

编者按 近年来,智能座舱体验日益成为汽车竞争力的核心,智能座舱的多样体验正在成为用户购车时考虑的重要因素。 LiveVideoStack2023深圳站邀请到蔚来汽车座舱音频系统软件负责人高林,从主流音频架构设计、算法集成方案及体验影响、音频体验与…

Unity UnityWebRequest 在Mac上使用报CommectionError

今天是想把前两天写的Demo拿到Mac上打个IPA的完事我发现 在运行时释放游戏资源的时候UnityWebRequest返回的结果不是Success 查看Log发现是 req.result 是CommectionError error是 Cannot connect to destination host 代码如下: UnityWebRequest req UnityWebRequ…

【HBuilder + IDEA + XFtp + XShell】打包部署上线

简述 前后端分离:需要将前后端的程序包打包发送至应用Linux服务器上Linux服务器 (1)需要启用SSHD服务,该服务会监听22号端口(一般是开启的) (2)搭建:MYSQL、Nginx、jdk、…

python三 pycharrm安装

一、PyCharm下载安装 1)访问官网 https://www.jetbrains.com/pycharm/download/#sectionwindows 下载「社区版 Community」 安装包 跟新 官网页面变动,找不到社区版 2)下载完成后,「双击」运行安装包,开始安装。 …

【Week-P3】CNN天气识别

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结6.1 不改变学习率的前提下,将训练epoch分别增加到50、60、70、80、90(1)epoch 50 的训练情况如下:(2)epoch 60 …

Android studio CMakeLists.txt 打印的内容位置

最近在学习 cmake 就是在安卓中 , 麻烦的要死 , 看了很多的教程 , 发现没有 多少说对打印位置在哪里 , 先说一下版本信息 , 可能你们也不一样 gradle 配置 apply plugin: com.android.applicationandroid {compileSdkVersion 29buildToolsVersion "29.0.3"defau…