Threejs 展示——fbx 格式模型导入

文章目录

    • 需求
    • 分析

需求

导入fbx 格式的模型数据

分析

  • 需要准备 fbx 格式的数据,如下所示
    在这里插入图片描述
<template><div id="three-canvas" />
</template>
<script>
// import { Color, MOUSE, PerspectiveCamera, Scene, WebGLRenderer } from "three";
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { DRACOLoader, AmbientLight, Color, MOUSE, PerspectiveCamera, Scene, Vector3, WebGLRenderer, MeshLambertMaterial, sRGBEncoding } from 'three'
import * as Three from 'three' // 引入Threejs
import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader'
export default {name: 'LoadFBX',data () {return {camera: null, // 相机对象scene: null, // 场景对象renderer: null, // 渲染器对象mesh: null // 网格模型对象Mesh}},mounted () {this.init()this.$nextTick(() => {this.createModel()})},methods: {onClick (event) {// 创建 Raycaster 对象var raycaster = new Three.Raycaster()const mouse = new Three.Vector2()// 计算鼠标或触摸点的位置mouse.x = (event.clientX / window.innerWidth) * 2 - 1mouse.y = -(event.clientY / window.innerHeight) * 2 + 1// 更新射线   注意——> this.camera 是相机   定义到data里的raycaster.setFromCamera(mouse, this.camera)// 计算与所有对象的交点const intersects = raycaster.intersectObjects(this.scene.children, true)if (intersects.length > 0) {// 处理点击事件// intersects[0] 包含了第一个交点const clickedObject = intersects[0].objectconsole.log(clickedObject.geometry.uuid)// 通过点击到该模型用名字匹配if (clickedObject.name === clickedObject.name) {// console.log("获取的当前模型信息:", clickedObject, clickedObject.name);}}},// 模型点击onMouseClick (event) {var raycaster = new Three.Raycaster()var mouse = new Three.Vector2()// 将鼠标点击位置的屏幕坐标转换成threejs中的标准坐标mouse.x = (event.clientX / window.innerWidth) * 2 - 1mouse.y = (event.clientY / window.innerHeight) * 2 + 1// 通过鼠标点的位置和当前相机的矩阵计算出raycasterraycaster.setFromCamera(mouse, this.camera)// 获取raycaster直线和所有模型相交的数组集合var intersects = raycaster.intersectObjects(this.scene.children)console.log(raycaster)console.log(this.scene.children)// 将所有的相交的模型的颜色设置为红色for (var i = 0; i < intersects.length; i++) {intersects[i].object.material.color.set(0xff0000)}},// 模型加载loadGltf () {const loader = new FBXLoader()loader.load('/static/obj/daba1.fbx', (gltf) => {gltf.rotateY(Math.PI / 2)this.scene.add(gltf)this.renderer.render(this.scene, this.camera)window.addEventListener('click', this.onClick, false)}, (xhr) => {console.log((xhr.loaded / xhr.total) * 100 + '% loaded')this.scene.traverse(function (object) {console.log(101, object.name, object.type)})}, (error) => {console.error(error)})},createModel () {const that = this// 渲染进度const onProgress = function (xhr) {if (xhr.lengthComputable) {const percentComplete = xhr.loaded / xhr.total * 100console.log(Math.round(percentComplete, 2) + '% downloaded')}}this.loadGltf()},init () {const container = document.getElementById('three-canvas')this.renderer = new WebGLRenderer({// 开启抗锯齿antialias: true})// 将渲染器挂载到domcontainer.appendChild(this.renderer.domElement)this.renderer.outputEncoding = sRGBEncodingthis.renderer.setSize(container.offsetWidth, 355, true)// 实例化场景this.scene = new Scene()this.scene.background = new Color('rgba(189, 189, 189, 0.6)')// 实例化相机this.camera = new PerspectiveCamera(75, container.offsetWidth / 355, 1, 1000)// 设置相机位置this.camera.position.set(50, 250, 50)// 设置相机看先中心点this.camera.lookAt(new Vector3(0, 0, 0))// 设置相机自身方向this.camera.up = new Vector3(0, 1, 0)// 初始化轨道控制器const orbitControls = new OrbitControls(this.camera, this.renderer.domElement)// 设置鼠标功能键orbitControls.mouseButtons = {// 左键无功能LEFT: MOUSE.ROTATE,// 中键缩放MIDDLE: MOUSE.DOLLY// 右键旋转// RIGHT: MOUSE.ROTATE}// 添加环境光const ambientLight = new AmbientLight('rgb(255,255,255)', 0.8)this.scene.add(ambientLight)const animate = () => {this.renderer.render(this.scene, this.camera)requestAnimationFrame(animate)}animate()}}
}
</script>
<style scoped>
#three-canvas {/* width: 100%; *//* height: 600px; *//* overflow: hidden; *//* background-color: #88B9DD; */
}
</style>

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

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

相关文章

Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例 题目438&#xff1a;找到字符串中所有字母异位词 说明&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字…

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…

MySQL数据查询语言DQL

MySQL数据查询语言DQL 目录 MySQL数据查询语言DQLDQL关键字数据查询语言DQL1.查询表2.子查询3.联表查询4.GROUP BY5.HAVING6.分页查询7.排序查询 DQL关键字 DQL关键字含义SELECTSELECT 字段列表&#xff0c;查询检索的列或表达式&#xff0c;它指定了最终结果包含的列FROMFROM…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本&#xff0c;其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

opencv学习笔记

学习OpenCV3 文章目录 学习OpenCV3openCV模块介绍 图片处理滤波/卷积核高斯滤波 算子索贝尔(sobel)算子沙尔(Scharr)算子拉普拉斯算子Canny边缘检测 **实际使用** 形态学获取形态学卷积核全局二值化自适应阈值二值化腐蚀操作膨胀操作开运算、闭运算形态学梯度顶帽操作黑帽操作 …

Redis 学习笔记 2:Java 客户端

Redis 学习笔记 2&#xff1a;Java 客户端 常见的 Redis Java 客户端有三种&#xff1a; Jedis&#xff0c;优点是API 风格与 Redis 命令命名保持一致&#xff0c;容易上手&#xff0c;缺点是连接实例是线程不安全的&#xff0c;多线程场景需要用线程池来管理连接。Redisson&…

Flink的SQL开发

概叙 Flink有关FlinkSQL的官网: https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/overview/ 阿里云有关FlinkSQL的官网: https://help.aliyun.com/zh/flink/developer-reference/overview-5?spma2c4g.11186623.0.0.3f55bbc6H3LVyo Ta…

谷歌seo内容营销怎么做?

谷歌SEO内容营销就像是在为两个观众准备一场表演&#xff0c;一边是用户&#xff0c;一边则是谷歌搜索引擎&#xff0c;那么所谓的内容营销&#xff0c;你自然需要知道你的观众想看什么&#xff0c;这就是关键词研究&#xff0c;帮你了解用户在搜索什么&#xff0c;然后&#x…

表单常用正则表达式(手机,邮箱,身份证,数字,空格...)

#表单常用正式表达式 为了后面项目的拿来即用以便不时之需&#xff0c;特意整理一文&#xff0c;把常用的表单验证的正则表达式整理如下。 不能为空 pattern: /^[^\s]$/ 验证手机号 pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

阿里云购买云服务部署小记

1.先购买云服务器 阿里云网址 阿里云云服务器购买 我这是前端时间出活动买的 点击购买 注: 3M的带宽&#xff0c;可以支持同一秒访问30-35个人不卡(其他依次类似类推) 购买前配置的话 选的也没那么多 一般开发人员根据自己喜好顺手的来 跟我一样是刚接触小白的话 听客服…