three.js实现管道漫游

先看效果:

<template><div><el-container><el-main><div class="box-card-left"><div id="threejs" style="border: 1px solid red"></div><div class="box-right"><pre style="font-size: 16px"></pre><el-button type="primary" @click="start">开始漫游</el-button><el-button type="primary" @click="end">结束漫游</el-button></div></div></el-main></el-container></div>
</template>
<script>
import Drawer from "@/components/Drawer.vue";
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";export default {components: { Drawer },data() {return {name: "",cameraX: 200,cameraY: 200,cameraZ: 200,scene: null,camera: null,renderer: null,mesh: null,mesh_sun: null,geometry: null,group: null,axis: null,texture: null,loader: null,animationId: null,line: null,lineFlag: true,circleFlag: true,catmullRowCurve3: null,controls: null,request: null,r: 300,angle: 0,i: 0,points:[]};},created() {},mounted() {this.name = this.$route.query.name;this.init();},methods: {end(){window.cancelAnimationFrame(this.request)},goBack() {this.$router.go(-1);},start() {this.points = this.catmullRowCurve3.getPoints(220);this.render();},render() {if(this.i < this.points.length-1) {this.camera.position.copy(this.points[this.i]);this.camera.lookAt(this.points[this.i+1]);this.camera.updateProjectionMatrix();this.controls.target.copy(this.points[this.i+1]);this.controls.update();this.i++;} else {this.i = 0;}this.renderer.render(this.scene, this.camera);this.request = requestAnimationFrame(this.render);},// 管道漫游案例:首先创建一个管道;管道使用纹理贴图;获取管道的扫描线上的 n个点;相机固定在 i 点, lookAt i+1 点位置;init() {// 1,创建场景对象this.scene = new this.$three.Scene();// 创建缓存几何体对象this.geomery = new this.$three.BufferGeometry();// 通过 Vector3(x,y,z) 创建顶点数据var pointsArr = [new this.$three.Vector3(0, 0, 0),new this.$three.Vector3(100, 0, 0),new this.$three.Vector3(100, 0, 100),new this.$three.Vector3(0, 100, 100),new this.$three.Vector3(-50, 50, 50),new this.$three.Vector3(0, 0, 0),];// 创建三维样条曲线对象(参数是三维点数组)this.catmullRowCurve3 = new this.$three.CatmullRomCurve3(pointsArr);// 获取三维样条曲线上的100个点const points = this.catmullRowCurve3.getPoints(220);// 设置缓存点模型的点数据this.geomery.setFromPoints(points);// 创建线材质对象this.material = new this.$three.LineBasicMaterial({ color: 0xaabb11 });// 创建线模型对象this.line = new this.$three.Line(this.geomery, this.material);this.scene.add(this.line);// 创建管道缓冲几何体const tubeGeometry = new this.$three.TubeGeometry(this.catmullRowCurve3, 104, 10, 36, false);// 创建网格材质对象const meshBasicMaterial = new this.$three.PointsMaterial({color: 0xbbddff,// side: this.$three.DoubleSide});const mesh = new this.$three.Points(tubeGeometry,meshBasicMaterial);this.scene.add(mesh);// 创建透视投影相机对象this.camera = new this.$three.PerspectiveCamera(90, 1, 0.01, 3000);this.camera.position.set(200, 200, 200);this.camera.lookAt(0, 0, 0);// 创建辅助坐标轴对象const axesHelper = new this.$three.AxesHelper(150);this.scene.add(axesHelper);// 创建渲染器对象this.renderer = new this.$three.WebGLRenderer();this.renderer.setSize(1000, 800);this.renderer.render(this.scene, this.camera);document.getElementById("threejs").appendChild(this.renderer.domElement);// 创建空间轨道控制器对象this.controls = new OrbitControls(this.camera, this.renderer.domElement);this.controls.addEventListener("change", () => {this.renderer.render(this.scene, this.camera);});},},
};
</script>
//
<style lang="less" scoped>
.msg {padding: 20px;text-align: left;display: flex;justify-content: flex-start;flex-wrap: wrap;.span {margin: 0 30px 30px 0;// white-space: nowrap;}.p {text-align: left;}
}
.box-card-left {display: flex;align-items: flex-start;flex-direction: row;width: 100%;.box-right {text-align: left;padding: 10px;.xyz {width: 100px;margin-left: 20px;}.box-btn {margin-left: 20px;}}
}
</style>

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xaml自动格式化:各个属性分行放置

快捷键&#xff1a;CtrlKD 设置自己需要的属性&#xff1a;工具->选项->文本编辑器->XAML->Formatting 效果如下&#xff1a;

深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

文章目录 先看看最终效果前言随机游走算法使用随机游走算法添加地板瓦片1. 新增TilemapVisualizer&#xff0c;用于可视化地图2. 瓦片素材 不运行执行程序化生成地牢方法1. 先简单重构代码2. 新增Editor脚本RandomDungeonGeneratorEditor 将参数保存到可编辑脚本对象&#xff0…

【前端】yarn install

yarn install yarn install 用于安装项目的所有依赖。 当你刚刚签出项目的代码时&#xff0c;或者当项目中的其他开发者添加了你需要选择的新依赖时&#xff0c;最常使用此方法。 如果你习惯使用 npm&#xff0c;你可能希望使用 --save 或 --save-dev。 这些已被 yarn add 和 …

Java-final

【1】修饰变量&#xff1b; 1.public class Test { 2. //这是一个main方法&#xff0c;是程序的入口&#xff1a; 3. public static void main(String[] args) { 4. //第1种情况&#xff1a; 5. //final修饰一个变量&#xff0c;变量的值不可以改变&#…

ios + vue3 Teleport + inset 兼容性问题

目录 1&#xff0c;问题表现2&#xff0c;解决步骤1&#xff0c;teleport 的问题2&#xff0c;inset 的问题3&#xff0c;teleport 的问题之二 1&#xff0c;问题表现 使用 vue3 的 Teleport 实现的 dialog 弹窗&#xff0c;但是在 ios app 中嵌套的 h5 中无法打开。 直接在io…

【考研数学】正交变换后如果不是标准型怎么办?| 关于二次型标准化的一些思考

文章目录 引言一、回顾二次型的定义是什么&#xff1f;什么叫标准二次型&#xff1f;怎么化为标准型&#xff1f; 二、思考写在最后 引言 前阵子做了下 20 年真题&#xff0c;问题大大的&#xff0c;现在订正到矩阵的第一个大题&#xff0c;是关于二次型正交变换的。和常规不同…

当代职场人做分析,当然要用大数据分析工具

不管是从效率、分析的可用性以及灵活性来看&#xff0c;用大数据分析工具都还板上钉钉的。毕竟大数据分析工具集齐了大数据时代数据分析工具应具备的特点优势。 1、对接ERP&#xff0c;立得100BI报表 点击对接金蝶、用友ERP后&#xff0c;BI系统立即即可取数分析&#xff0c;…

JS基础

javascript基础语言与其他语言大差不差&#xff0c;看代码理解即可。复习笔记 变量与数据类型 变量名要见名知意 变量名可以是字母、下划线、$&#xff0c;还有数字&#xff1b; 但是不能以数字开头小写字母开头&#xff0c; 多个单词&#xff0c;第二个单词首字母大写&#…

控制实体小车cartographer建图

cartographer建图 跑通官方例程 下载官方bag https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag运行bag roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:${HOME}/workspace/carto_ws…

Swift-day 2

1、数据绑定&#xff0c;改变标题 State private var zoomed: Bool false 属性包装器包装的变量self.title 单向绑定 self.$textInput 双向绑定 传的是数据结构 self.title self.textInput 赋值是String self._titletitle //绑定类型加下划线2、数据绑定&#xff0c;传递结构…

webrtc 生成unpack_aecdump工具

1.下载webrtc代码 2.terminal 进入src目录下 3.构建目录&#xff1a; terminal执行&#xff1a;gn gen out/Release --argsis_component_buildfalse 4.构建可执行文件&#xff1a; terminal执行&#xff1a;ninja -C out/Release/ unpack_aecdump &#xff08;有可能报错…

数据仓库_模型设计_学习目录

前言&#xff1a; 1、问什么要写这篇博客&#xff1f; 随着自己在数仓岗位工作的年限增加&#xff0c;对数仓的理解和认知也在发生着变化 所有用这篇博客来记录工作中用到的知识点与经验 2、这篇博客主要记录了那些内容&#xff1f; 主要会记录一些数仓建设方法论和工作技巧 目…

Paging3的使用踩坑记录

一、Paging3介绍 Paging3是jetpack推出的一个分页加载库&#xff0c;用于方便开发者实现分页加载功能&#xff0c;支持显示加载状态&#xff0c;重试机制&#xff0c;支持协程与RxJava结合使用&#xff0c;相对于传统的分页加载方案&#xff0c;我们不需要关注recyclerview的滑…

铝合金钻孔铣削去毛刺加工之高速电主轴解决方案

铝合金是一种轻质、高强度的材料&#xff0c;其出色的机械性能和良好的导电性、导热性使其在工业领域广受青睐特别是在航空、航天和汽车制造中&#xff0c;铝合金的身影更是随处可见。在铝合金加工过程中&#xff0c;高速电主轴可精准而高效地完成钻孔、铣削和去毛刺等任务&…

Python大数据之linux学习总结——day09_hive调优

hive调优 hive官方配置url: https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮…

云原生周刊:Istio 1.20.0 发布 | 2023.11.20

开源项目推荐 DevPod DevPod 是一款纯客户端工具&#xff0c;可在任何后端基于 devcontainer.json 创建可重现的开发人员环境。每个开发者环境都在一个容器中运行&#xff0c;并通过 devcontainer.json 进行指定。通过 DevPod 提供商&#xff0c;这些环境可以在任何后端创建&…

SpringBoot3 Actuator使用如何以及自定义端点

参考: https://www.yuque.com/leifengyang/springboot3/wsx0br0dalot1pqn 作用: 对线上应用进行观测、监控、预警… 比如: ● 健康状况【组件状态、存活状态】Health ● 运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics ● 链路追踪 1.使用 1.场景引入 <…

拼多多官方开放平台接口app商品详情接口获取实时商品详情数据演示

拼多多开放平台提供了一种名为“商品详情接口”的API接口&#xff0c;它允许卖家从自己的系统中快速获取商品信息&#xff0c;如商品标题、描述、价格、库存等&#xff0c;并将这些信息展示在自己的店铺中。通过该接口&#xff0c;卖家可以更好地管理自己的商品库存和销售&…

投资黄金:如何选择正确的黄金品种增加收益?

黄金一直以来都是备受投资者青睐的避险资产&#xff0c;然而&#xff0c;在庞大的黄金市场中&#xff0c;选择适合自己的黄金品种成为影响收益的关键因素。黄金投资并不只有一种方式&#xff0c;而是有很多种不同的黄金品种可以选择。每种黄金品种都有其独特的特点和风险&#…