three.js车辆可视化教程-完整0到1

news2024/12/23 16:29:47

概述

如有不明白的可以加QQ:2354528292;wx: aichitudousien
更多教学视频请访问:https://space.bilibili.com/236087412
详细教学请到上方视频链接访问,总共3个多小时的教学~

Three.js车展系统

搭建开发环境

使用的开发框架是vue-cli3.0,报表使用echarts, webgl使用three.js,开发工具为vscode
搭建完成后的目录为
在这里插入图片描述

搭建three场景

  1. 创建一个class,用来初始化场景,渲染器,相机,灯光,控制器
import * as THREE from 'three'
import {
  OrbitControls
} from 'three/examples/jsm/controls/OrbitControls.js';
import {
  OBJLoader
} from 'three/examples/jsm/loaders/OBJLoader';
import {
  MTLLoader
} from 'three/examples/jsm/loaders/MTLLoader';

export default class ZThree {
  constructor(id) {
    this.id = id;
    this.el = document.getElementById(id);
  }

  // 初始化场景
  initThree() {
    let _this = this;
    let width = this.el.offsetWidth;
    let height = this.el.offsetHeight;
    this.scene = new THREE.Scene();
    this.camera = new THREE.PerspectiveCamera(45, width / height, 1, 3000)
    this.renderer = new THREE.WebGLRenderer({
      antialias: true,
      alpha: true
    })
    this.renderer.setPixelRatio(window.devicePixelRatio)
    this.renderer.setSize(width, height)
    this.el.append(this.renderer.domElement)
    this.renderer.setClearColor('#000')

    window.addEventListener('resize', function () {
      _this.camera.aspect = _this.el.offsetWidth / _this.el.offsetWidth;
      _this.camera.updateProjectionMatrix();
      _this.renderer.setSize(_this.el.offsetWidth, _this.el.offsetWidth);
    }, false)
  }

  // 初始化helper
  initHelper() {
    this.scene.add(new THREE.AxesHelper(100))
  }

  // 初始化控制器
  initOrbitControls() {
    let controls = new OrbitControls(this.camera, this.renderer.domElement)
    controls.enableDamping = true
    controls.enableZoom = true
    controls.autoRotate = false
    controls.autoRotateSpeed = 0.3
    controls.enablePan = true
    this.controls = controls
  }

  initLight() {
    let directionalLight = new THREE.DirectionalLight('#fff')
    directionalLight.position.set(30, 30, 30).normalize()
    this.scene.add(directionalLight)
    let ambientLight = new THREE.AmbientLight('#fff', 0.3)
    this.scene.add(ambientLight)
    return {
      directionalLight,
      ambientLight
    }
  }
}
  1. 在vue文件中调用此类初始化three
<template>
  <div id="box" class="container"></div>
</template>

<script>
import ZThree from "@/three/ZThree";
import * as THREE from "three";

let app, camera, scene, renderer, controls, clock, cityModel;

export default {
  name: "Home",
  components: {},
  methods: {
    async initZThree() {
      app = new ZThree("box");
      app.initThree();
      app.initHelper();
      app.initOrbitControls();
      app.initLight();
      window.app = app;
      camera = app.camera;
      scene = app.scene;
      renderer = app.renderer;
      controls = app.controls;
      clock = new THREE.Clock();
      camera.position.set(30, 30, 30);
    },
  },
  mounted() {
    this.initZThree();
  },
};
</script>

<style lang='less' scoped>
.container {
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: #000;
}
</style>

此时我们可以看到的场景是,如果能够看到坐标轴辅助线,代表我们的场景已经加载成功
在这里插入图片描述
此时我们已经成功创建了three的场景,接下来我们开始加载模型,天空盒等更加好玩的东西~

加载模型

  1. 在ZThree类中加入loaderObjModel方法用来加载模型
// 加载obj模型
  loaderObjModel(path, objName, mtlName) {
    return new Promise(resolve => {
      new MTLLoader()
        .setPath(path)
        .load(mtlName + '.mtl', function (materials) {
          console.log(materials)
          materials.preload();

          // 加载obj
          new OBJLoader()
            .setPath(path)
            .setMaterials(materials)
            .load(objName + '.obj', function (object) {
              resolve(object)
            });
        });
    })
  }
  1. 在vue文件中调用此方法
    模型是我随便在网上找的,各位可以随意在网上找一个obj模型来测试即可
	cityModel = await app.loaderObjModel(
        "model/city/",
        "CityIslands",
        "City_Islands"
      );

      scene.add(cityModel);

此时有些小伙伴可能会比较奇怪的是为什么初始化进来时看不到模型或是只能看到模型的一小部分,那是你的相机设置的位置不对,教给大家一个小技巧,我们把app对象给挂载到window对象上,然后我们在调整控制器到视角最好的位置,此时打开控制台,输入app.camera.position和app.controls.target
在这里插入图片描述
此时我们就可以看到对应的参数,然后我们在设置一下就ok了

camera.position.set(18, 364, 397);
controls.target = new THREE.Vector3(2, 44, -32);

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

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

相关文章

计算机程序安装及使用须知_kaic

安装及使用须知 1 数据库建模程序的使用 本文件夹中的“PowerDesigner建模”目录下包含三个可运行文件TMS1.cdm&#xff0c;TMS.cdm&#xff0c;TMS.pdm分别为TMS系统的实体关系简图、实体关系图和数据库模型&#xff0c;使用PowerDesigner集成开发环境打开任意一个文件即可运…

第二节 ogre sdk 配置使用

上一节&#xff0c;我们介绍过了ogre源码的编译学习&#xff0c;在实际项目中&#xff0c;我们并不需要如此复杂的编译安装过程&#xff0c;可以直接使用官网提供的sdk库进行项目环境配置。下面简单介绍下配置过程。 一 OgreSDK下载 https://dl.cloudsmith.io/public/ogrecav…

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs Rakshit Trivedi 1 Hanjun Dai 1 Yichen Wang 1 Le Song 1 知识背景 Temporal Knowledge Graph : facts occur,recur or evolve over time in these graphs,and each edge in the graphs have temporal …

FPGA基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证9、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PC…

【翻译一下官方文档】之uniapp的数据缓存

uni.setStorage(OBJECT) setstorage | uni-app官网 uni.setStorage(OBJECT) 将数据存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个异步接口。 参数名类型必填说明keyString是本地缓存中的指定的 keydataAny是需要存储的内容&am…

git workflow

git workflow 讲一下常用的 workflow&#xff0c;这个主要是根据自己个人工作经验&#xff0c;每个项目在实践上总会有些许的不同&#xff0c;求同存异。 单分支工作 最糟糕的 workflow 是所有人全都在 main/master 上干活&#xff0c;如果只是两三个人的 team 可能还能存活…

忆暖行动|“四方食事,不过人间一碗烟火”

四方食事,不过人间一碗烟火 外婆&#xff0c;如果要您选择一个乡村很有代表的食物&#xff0c;您会选择什么&#xff1f; 当然是米饭&#xff0c;人要吃饭&#xff0c;没有米饭就没有力气劳作&#xff0c;而且大米还能做很多美食&#xff0c;比如米饼&#xff0c;米糕&#x…

亚马逊测评有哪些误解?

亚马逊平台是全球性的互联网电商网络平台&#xff0c;成立至今&#xff0c;平台站点覆盖了全球多个国家&#xff0c;各个地区之间的商品交易也变得更加频繁&#xff0c;随着平台商家增多&#xff0c;为了提高自身排名&#xff0c;越来越多的商家开始找人为他们的店铺和产品进行…

Git比较好用的一些操作

git stash 可以缓存一些修改&#xff0c;不用做提交。例如当前分支做了修改&#xff0c;不想提交&#xff0c;有需要切换分支时候。 常用命令&#xff1a; git stash list&#xff1a;查看缓存列表 git stash list git stash save “备注信息”: 缓存当前分支所有修改 git …

快乐数链表篇

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1&#xff…

【数据库数据恢复】ORACLE常见数据灾难的数据恢复可能性分析

Oracle数据库常见数据灾难&#xff1a; 1、ORACLE数据库无法启动或无法正常运行。 2、ORACLE ASM存储破坏。 3、ORACLE数据库数据文件丢失。 4、ORACLE数据库数据文件损坏。 5、ORACLE DUMP文件损坏。 Oracle数据库常见数据灾难的数据恢复可能性分析&#xff1a; 1、O…

正则表达式 - 简单模式匹配

目录 一、测试数据 二、简单模式匹配 1. 匹配字面值 2. 匹配数字和非数字字符 3. 匹配单词与非单词字符 4. 匹配空白字符 5. 匹配任意字符 6. 匹配单词边界 7. 匹配零个或多个字符 8. 单行模式与多行模式 一、测试数据 这里所用文本是《学习正则表达式》这本书带的&a…

统计学习方法第二章——感知机

x.1 前言 perceptron感知机是二分类的线性分类模型&#xff0c;输入为实例的特征向量&#xff0c;输出为实例类别(取-1&#xff0c;1)。perceptron旨在求出将训练数据进行线性划分的分离超平面&#xff0c;属于classification判别模型&#xff0c;策略为基于误分类的损失函数&…

MCU短按长按的功能

.外设&#xff1a;一个io口、一个定时器。 为了降低上手的门槛&#xff0c;本文仅使用一个IO口作演示。 实现思路 使用定时器&#xff0c;定时20ms来读取简化的按键状态机。 这里简化了状态机&#xff0c;大家只需明白三个概念。 状态&#xff1a;数量为有限个&#xff0c;记…

css初入门:网页布局之网格布局-grid

文章目录 网格布局-grid1、设置网格布局2、网格布局介绍3、网格容器grid-template-columns属性grid-template-rows 属性justify-content 属性justify-items属性align-content 属性 4、网格项目grid-column-start、grid-column-start、grid-column属性grid-row-start、grid-row-…

ChatGPT来了,必须紧跟时代潮流!

大家好&#xff0c;我是瓜叔。 正如标题所示&#xff0c;最近几周令人难以置信的兴奋。几乎每天都有surprise的新AI产品发布&#xff0c;特别是ChatGPT-4和AI绘画。这是一种科幻即将成为现实的感觉。例如&#xff0c;看看下面的网络图像&#xff0c;它是由AI生成的。当我看到它…

我的HackerOne漏洞赏金平台漏洞挖掘流程

简介 高强度在hackerone平台挖了一周的漏洞&#xff0c;在这里分享一下经验 选定目标 hackerone有两种src&#xff0c;一种是给钱的&#xff0c;一种是免费的&#xff0c;我一般都是选的有钱的去挖 假如我选择了这个作为今天的挖洞目标 首先需要往下滑&#xff0c;看他不收…

银行系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 ​​​​​​​ 本系统源码地址&#xff1a;​​​​​​​https://download.csdn.net/download/qq_50…

科大讯飞的2022:夯实“根据地”业务,以技术创新点燃大模型产业落地的“星星之火”...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 4月20日晚&#xff0c;科大讯飞正式公布2022年度及2023年度第一季度业绩报告。财报数据显示&#xff0c;公司2022年度实现营业收入188.20亿元&#xff0c;同比增长2.77%&#xff0c;实现毛利76.84亿元&#xff0c;较上年增长…

局域网 - CSMA/CD

文章目录 1 概述1.1 局域网的拓扑结构 2 CSMA/CD2.1 三种监听算法2.2 冲突检测原理2.3 二进制指数后退算法 3 扩展3.1 网工软考真题 1 概述 1.1 局域网的拓扑结构 2 CSMA/CD 对 总线型、星型 和 树型 拓扑访问控制协议是 CSMA/CD&#xff08;Carrier Sense Multiple Access/ …