圣诞特辑 · Three.js加载圣诞树模型

news2024/11/20 9:26:56

🎄2022年圣诞节到来啦,很高兴这次我们能一起度过~🎄

文章目录

  • 🎉前言
  • 🔎预览
  • 🎁项目&资源
    • 项目源码地址
    • 打包
    • 运行
  • ✒️编码实现

🎉前言

2022圣诞节来了,让我们一起使用Three.js实现导入圣诞树模型吧。

🔎预览

请添加图片描述

🎁项目&资源

项目源码地址

GitHub: https://github.com/OrbitGW/Chirstmas-Tree.git
GitCode: https://gitcode.net/weixin_43130747/christmas-tree.git

打包

你可以去以上Git仓库下载Release,或者在Three.js圣诞树模型加载 - CSDN下载里获取已打包好的文件。

你也可以阅读项目源码中的README.md自己打包

运行

你可以在源码文件夹里使用一下命令进行预览:

npm install
npm run dev

还可以将打包好的文件部署到你的服务器上。如果你有Python3,可以启动http.server运行:

python -m http.server

✒️编码实现

引入依赖,这里我们用到了Three.js以及Three.js的GLTF加载器和控制器扩展。这些依赖直接用npm安装three就行了。然后就是导入我们要用到的背景图片:

import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

import BG from './model/bg.jpg'

创建Three场景,并将背景贴图设置为刚才导入的背景图片:

Scene:function(){
  this.Scene =  new THREE.Scene();
  this.Scene.background = new THREE.TextureLoader().load(BG);
},

设置WebGL渲染器:

Renderer:function(){
  this.Renderer = new THREE.WebGLRenderer();
  this.Renderer.setSize(window.innerWidth, window.innerHeight);
  this.Renderer.setClearColor(0xffffff);
  this.Renderer.shadowMap.enabled = true;
  this.Renderer.physicallyCorrectLights = true;
  this.Renderer.outputEncoding = THREE.sRGBEncoding;
  ThreeApp.appendChild(this.Renderer.domElement); 
},

设置一个透视照相机,及位置。摄像机的几个参数分别是:视野,渲染窗口的宽高比,近截面还有远截面:

Camera:function(){
  this.Camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight,1, 10000);
  this.Camera.position.set(0, 0, 20);
  this.Camera.lookAt(this.Scene.position);
}

加载GLTF模型并居中,Three加载不同模型细节上会有一点差别,这里以GLTF为例。我们一会会将模型文件操作一下并传入,不能直接写路径,因为Webpack打包后可能会找不到资源:

modelLoader:function(MODEL){
  this.Controls.autoRotate = true;

  let Loader = new GLTFLoader();
  Loader.load(MODEL.path, (geometry)=> {
    this.Camera.position.set(0,0,20);
    this.Model = geometry.scene;

    var box3 = new THREE.Box3();
    box3.expandByObject(this.Model);

    var center = new THREE.Vector3();
    box3.getCenter(center);

    this.Model.position.x = this.Model.position.x - center.x;
    this.Model.position.y = this.Model.position.y - center.y;
    this.Model.position.z = this.Model.position.z - center.z;

    this.Scene.add(this.Model);
  });
},

添加环境光源,这里添加了一个环境光和四个点光源:

addLight:function(){
  var ambient_light = new THREE.AmbientLight(0xFFFFFF,1);
  this.Scene.add(ambient_light);

  var l1,l2,l3,l4;
  l1 = new THREE.DirectionalLight(0xFFFFFF,3);
  l2 = new THREE.DirectionalLight(0x1B1B1B,3);
  l3 = new THREE.DirectionalLight(0xFFFFFF,1.5);
  l4 = new THREE.DirectionalLight(0xFFFFFF,1.5);

  l1.position.set(0, 15, 0);
  l2.position.set(0, -200, 0);
  l3.position.set(0, -5, 20);
  l4.position.set(0, -5, -20);

  this.Scene.add(l1);
  this.Scene.add(l2);
  this.Scene.add(l3);
  this.Scene.add(l4);
}, 

鼠标控制器,可以实现鼠标左键旋转,右键拖动,滚轮缩放:

addControls:function() {
  this.Controls = new OrbitControls(this.Camera, this.Renderer.domElement);
},

渲染动画

animation:function(){
  this.Renderer.render(this.Scene, this.Camera);
  this.Controls.update();
  requestAnimationFrame(()=>this.animation());
},

改变窗口缓冲区操作,也就是改变窗口大小以后,我们需要重新设置相机和渲染选项,不然渲染比例会出问题:

onWindowResize:function() {
  this.Camera.aspect = window.innerWidth / window.innerHeight;
  this.Camera.updateProjectionMatrix();
  this.Renderer.setSize(window.innerWidth, window.innerHeight);
  this.Renderer.render(this.Scene, this.Camera);
},

运行方法,最后调用这个即可

run:function(){
  this.init.Renderer.call(this) 
  this.init.Scene.call(this)
  this.init.Camera.call(this)

  this.addControls();

  this.addLight() 
  this.modelLoader({path:require('./model/christmas-tree.glb').default});

  this.animation(); 

  window.onresize = ()=>this.onWindowResize(); 
}

最后调用方法:

CTScene.run();

最后运行npm run dev然后在http://localhost:3000看一看效果:

Threejs实现圣诞树模型加载效果

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

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

相关文章

渗透测试-ctfshow 爆破(web入门)

大家可以关注一下我的公众号-小白渗透测试,互相学习。 web1 打开环境 先随便输入一个账号密码,使用bp进行抓包分析。 可以看到,账号密码进行了base64加密,使用工具进行解密,可以看到是账号:密码这样一个格式。 然后我…

JavaSE笔记——函数式编程(Lambda表达式)

文章目录前言一、第一个Lambda表达式二、如何辨别Lambda表达式三、引用值,而不是变量四、函数接口五、类型推断总结前言 Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式。 一、第一个Lambda表达式 Swing 是一个与平台无关的 Java 类库&a…

数组与集合有什么不同之处

这个问题其实就是一个非常基础的面试题,一般面试官想了解你基础知识方面的掌握时,基本都会问这个问题,尤其是一些,计算机学子毕业之后,如果还是想要从事计算机技术相关的行业时,那么在面试的时候就需要做好…

Faster RCNN网络源码解读(Ⅰ) --- Fast RCNN、Faster RCNN论文解读

目录 一、Fast R-CNN论文解读 二、Faster R-CNN论文解读 一、Fast R-CNN论文解读 Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66…

Win10家庭版安装Docker桌面版

文章目录1.主板BIOS中开启虚拟化2.开启Hyper-V(1)使用下列代码生成一个.cmd文件,并以管理员身份运行该文件。(2)看到运行成功即可关闭该文件。(3)勾选Hyper-V设置里的所有选项(4&…

2-2-3-10、并发设计模式

目录终止线程的设计模式Two-phase Termination(两阶段终止)模式——优雅的终止线程使用场景避免共享的设计模式Immutability模式——想破坏也破坏不了如何实现使用 Immutability 模式的注意事项Copy-on-Write模式应用场景Thread-Specific Storage 模式—…

这几个实用的微信功能,你该知道

生活中我们每天都会使用到微信,用了10年才发现,原来微信隐藏这么多神功能,真是太实用了,下面一起来看看吧!朋友圈发长视频 如果你想要在朋友圈里分享长视频,可以借助微信收藏“转发”到朋友圈。 在收藏里添…

一位普通前端开发的一年|2022总结

前言 2022年转眼快要结束,在这一年我学到了很多东西,现在就来总结一下我的2022,复盘一下过去一年的成果。 总结 在2022年2月底从上一家公司跳槽,面试了两家公司两家拿到了两个offer,当时感觉自己很厉害,…

jdk-Atomic源码学习

上文:AQS-Exchanger源码学习源码下载:https://gitee.com/hong99/jdk8Atomic了解atomic是并发框架中的一员,所属位置:java.util.concurrent.atomic 该类主要是用来解决内存可见性、有序、线程安全,当然底层也是通过cas来…

NEUQ week8 动态规划

题目 P1616 疯狂的采药 题目背景 此题为纪念 LiYuxiang 而生。 题目描述 LiYuxiang 是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个…

贪吃蛇基础·框架版(简单)结尾有原码

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发, 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我…

PSM倾向得分匹配代码和案例数据

PSM倾向得分匹配代码和案例数据 含义:倾向评分匹配(Propensity Score Matching,简称PSM)是一种统计学方法,用于处理观察研究(Observational Study)的数据。 在观察研究中,由于种种…

【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动

前言 iMX6Q 支持多种启动方式,如 emmc启动、SD 卡启动等,这里简单的记录一下 SD卡启动的流程 下载u-boot 使用 NXP 官方提供的 uboot-imx,代码地址为: https://github.com/nxp-imx/uboot-imx 使用 git 下载 uboot-imx&#xff…

自动驾驶接力赛,还在继续奔跑的Apollo带来哪些改变?

自动驾驶,被看作人工智能技术落地最快、范围最广、引发商业效应最显著的场景之一。从人人好奇的无人车,到满大街司空见惯的无人配送,自动驾驶在过去几年里快速成熟,成为城市交通系统的重要组成部分。数据显示,2020-203…

融云 CEO 董晗:国产化进程加速,助推政企数智办公平台深化发展

完整报告关注公众号,限免下载 政策催化加疫情助推下,办公线上化迅速完成着市场教育已经成为当前的主流趋势。而随着“国产化”成为各行业数字化发展道路上的关键词,政企办公领域国产替代的发展确定性更加凸显。关注【融云 RongCloud】&#x…

hnu计网实验四-网络层与链路层协议分析(PacketTracer)

一、实验目的: 通过本实验,进一步熟悉PacketTracer的使用,学习路由器与交换机的基本配置,加深对网络层与链路层协议的理解。 二、实验内容: 4.1 路由器交换机的基本配置 打开下面的实验文件,按提示完成实…

Java 集合框架

目录 1. 简介 2. 概览 3. 实现类 3.1 List 3.2 Queue 3.3 Set 3.4 Map 1. 简介 容器,就是可以容纳其他Java对象的对象。*Java Collections Framework(JCF)*为Java开发者提供了通用的容器,其始于JDK 1.2,优点是: 降低编程难度提高程序…

成为用友ISV优选伙伴,迈丹科技8个月经历了一次脱胎换骨

12月9日,用友第四届企业云服务开发者大赛鸣金收兵,第一次参赛,第一次与用友正式合作的厦门市迈丹科技开发有限公司(以下简称迈丹科技),便凭借SPC企业质量管理解决方案第一次获奖,而且还是企业赛…

Unity模型

1、Unity中使用的模型 Unity支持很多模型格式,比如:.fbx,.dae,.3ds,.dxf,.obj等等 大部分模型都不是在Unity中制作的,都是美术人员在建模软件中制作,如 3DMax、Maya等等 当他们制作…

VueJs中的ref函数

前言在Vue2.0里面,与页面相关显示的数据是挂载在data下,而在vue3.0里,想要一个数据具备响应式,那么需要引入响应式API函数,通过API函数加工处理后,才具备响应式,两者之间在底层实现数据的响应式上也存在着差异01ref可将数据变成响应式在setup里面使用let定义的变量不是响应式的…