TypeScript进阶开发——ThreeJs基础实例,从入坑到入门

  前言

  我们前面使用的是自己编写的ts,以及自己手动引入的jquery,由于第三方库采用的是直接引入js,没有d.ts声明文件,开发起来很累,所以一般情况下我们使用npm引入第三方的库,本文记录使用npm,typescript开发threejs3D项目,搭建基础实例,为以后开发具体业务做准备

  项目结构

 

  依旧是熟悉的SpringBoot项目,不同以往的是使用了npm管理工具来下载依赖js库,类似maven,同时为了解决typescript编译后引入npm库的路径有问题,导致浏览器报错的问题,我们采用的webpack打包工具来打包  PS:webpack依赖的文件真的是多,全都安装完后,好几百M

  下面简单说一下如何初始化npm、webpack,以及下载jquery、three等js库

  npm的使用

  初始化

  cmd先打开到项目的 threejs\src\main\resources\static 路径,使用npm init命令,回答一系列问题(当然也可以全部按照默认值),初始化成npm项目

  得到node_modules目录以及package.json文件

  当我们使用打包命令,会提示我们还缺少那些依赖,这时候我们按照提示去下载就可以了

  有一点要注意,package.json文件的name值不能用typescript,我们改成

  "name": "typescript-threejs",

  脚本命令

  "scripts": {
    "tsc": "tsc -w",//监控文件,有改动时实时编译ts
    "build": "webpack",//打包
    "dev": "webpack -w"//监控文件,有改动时实时打包
  },

  webpack.config.js配置

const path = require(‘path‘);
module.exports = {
    entry : {
        main : ‘./src/controller/Main.ts‘
    },
    devtool : ‘inline-source-map‘,
    mode : ‘development‘,
    module : {
        rules : [ {
            test : /\.ts$/,
            use : ‘ts-loader‘,
            exclude : /node_modules/
        } ]
    },
    resolve : {
        extensions : [ ‘.ts‘, ‘.js‘ ]
    },
    output : {
        filename : ‘[name].js‘,
        path : path.resolve(__dirname, ‘./dist/‘)
    },
    plugins : [
    ],
    optimization: {
        splitChunks: {
            chunks: "all",
            minSize: 30000,
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            automaticNameDelimiter: ‘-‘,
            name: true,
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                },
                default: {
                    minChunks: 2,
                    priority: -20,
                    reuseExistingChunk: true
                }
            }
        }
    }
};

  使用 npm install 命令就可以下载第三方插件

  下载jquery的声明文件

  在node_modules目录下面j就可以看到npm下载下来的库

  如何引入

  使用typescript编译成js,路径不正确,浏览器报错

  使用webpack编译、打包成js,路径正确

  threejs

  threejs,是一个JavaScript编写的WebGL第三方库。

  官网:https://threejs.org/

  官方文档:https://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene

  官方提供的各种例子:https://threejs.org/examples/

  官方GitHub:https://github.com/mrdoob/three.js

  这里还有一个大神的博客,有比较丰富的例子可以参考:https://www.wjceo.com/

  通过查阅官网文档、以及参考大量的例子进行学习,我们开始three.js之旅,采用的是npm引入的方式引入three

  路径结构介绍

  渲染器有三个WebGLRenderer、CSS2DRenderer、CSS3DRenderer,后面这两个是为了能够使用CSS2DObject、CSS3DObject对象作为Label,注意,使用了多个渲染器后,我们的控制器要控制的是CSS3DRenderer.domElement,控制它可以同时控制到WebGLRenderer的对象

  

  同时,3D的渲染器DOM要加绝对定位,要不然DOM的东西显示不出来(为了统一,2D的我也加了),然后webGL的canvas也加样式,position: absolute;

  

  然后在初始化场景时,不停的渲染,注意,有一个地方不停的渲染就可以了,多了影响性能

  

  封装原生发射射线的方式监听对象的鼠标事件,有个地方要注意,射线只能检测到Mesh对象,Group组对象是检测不到了

  同时还封装了一个动画效果,按屏幕刷新率调用,每次调用++一定的值,每次回调函数返回,从0到1递增,等于1的时候结束递归调用

  还有一个是镜头的巡检

  其他地方就不一一介绍了,大家自己看代码

  效果演示

  地球模仿的是:https://wa.qq.com/xplan/earth/index.html?_wv=1

  地球外部有一层漂浮的云层(大气层),效果比较逼真

  

  云层模仿的是: http://www.sucai58.com/plus/demo.php?aid=132

  云海又八千多个PlaneGeometry对象组成,推动镜头营造穿越云层的效果,作为地球场景到园区场景的过渡动画

  园区是加载了官方例子的obj模型(站立的男人)以及fbx模型(跳舞的女人),跳舞的动画是模型自带的,中间那两个是普通的BoxGeometry对象(录GIF的软件录带绿色的东西效果好难看啊,我就不放上来了...)

  更多效果自己运行查看

  补充

  1、npm install 包的时候报错

  解决:给npm降级或者升级

  降级 : npm install -g [email protected]  //@后面是具体版本号

  升级 : npm install -g npm //升级到最新版本

  如果还不行就清除缓存再次安装

  npm cache clean -f

  

 2、threejs移动的时候老是报错

  在three.module.js做一下小调整,非空才调用.call方法

  后记

  学习Three.js是因为公司的3D技术储备从原先的Twaver转用其他的库,公司大佬在考察Unity3D跟Three.js后决定用后者,Three.js是开源免费的,而Twaver跟Unity3D是要收钱的,这个例子就是我的学习Demo,主要是参考了官网的例子以及效果演示中提到的那两个列子,Demo例子大体上已经封装实现了加载OBJ、FBX、原生对象、2D、3Dlabel等,封装对象鼠标事件的监听,镜头动画封装,基本上满足业务的开发

  当然还有很多不足的地方,比如事件监听是我们直接封装的检测射线方法,经过测试发现一个bug,我们已经把地球从场景中移除,但点击地球的位置依旧能触发地球的监听事件

  TypeScript进阶开发——ThreeJs基础实例就暂时记录到这里,以后在补充

  代码开源

  注:node_modules文件夹和里面的各种库文件我就不提交了,几百M太大了,大家按照上面的步骤用npm命令初始化、下载就可以了

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/threejs

  码云:https://gitee.com/huanzi-qch/threejs

原文地址:https://www.cnblogs.com/huanzi-qch/p/11413739.html

时间: 2024-10-09 09:14:28

TypeScript进阶开发——ThreeJs基础实例,从入坑到入门的相关文章

网页设计Dreamweaver网页制作 商业网站建设案例课程 ASP.NET基础实例教程 淘宝开店教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中,HAL设备用值D3DDEVTYPE_HAL来表示.该值是一个枚举变量.REF设备用D3DDEVTYPE_REF来表示.这种类型非常重要,你需要铭记,因为在创建设备的时候,我们必须指定使用哪种设备类型. COM(组件对象模型) 创建COM接口时不可以使用c++关键字new.此外使用完接口,应调用Rel

网页设计 Dreamweaver网页制作 商业网站建设案例课程 ASP.NET基础实例教程 淘宝开店教程 更多>

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

C++开发EOS基础指南:迭代器和Lambda表达式

让我们来谈谈迭代器,它是一个非常有用的工具,在整个EOS代码库中大量使用.如果您来自JavaScript背景,您可能已经熟悉迭代器,就像它们用于循环一样.迭代器的关键概念是提供一种更好的方法来遍历项集合.额外的好处是您可以为任何自定义类实现迭代器接口,使迭代器成为遍历数据的通用方法. // @url: https://repl.it/@MrToph/CPPBasics-Iterators #include <iostream> #include <vector> using nam

iOS开发最最基础之打包Ad Hoc应用

首先,介绍下什么是Ad Hoc? Ad Hoc简单的定义是:把iOS工程打包成ipa包后,通过Ad Hoc证书签名做分发测试的行为. Ad Hoc证书可以分为两类: 1.99美元的开发者账号生成的. 2.299美元的开发者账号生成的. 由于我没有299美元的开发者账号,故本文只针对99美元的开发者账号的情况作阐述. 接下来,我将从以下5点进行操作描述: 1.AppID(如果有配置好了,可以忽略). 2.certificate 3.device 4.profile 5.Xcode打包 1.AppI

iOS开发OC基础:OC基础概念总结,OC面向对象的思想

一.什么是OOP: OOP(Object Oriented Programming):面向对象编程 二.面向对象和面向过程的区别: 面向过程编程:分析解决问题的步骤,实现函数,依次使用面向对象编程:分解问题组成的对象,协调对象间的联系和通信,解决问题. 面向过程是以事件为中心,关心的是完成这个事件的详细步骤:面向对象是以事物为中心,关心的是事物应该具备的功能,而完成一个事件只是事物所有功能里面的一个小功能(以过程为中心,以对象为中心) 三.类和对象 对象定义了解决问题的步骤中的行为,不刻意完成一

iOS开发OC基础:OC属性的一些概念和基本使用

一.属性简介 //属性是OC2.0之后新出的一种语法,能让我们快速的生成setter以及getter方法,大大简化代码 二.如何定义一个属性 //@property 属性关键字,用来定义属性 //NSString * 属性的类型 //name 属性的名字. //@property 只是生成的setter以及getter方法的声明.@property NSString *name; 三.属性的使用注意事项//如果在.m文件中我们自己实现了setter以及getter方法,则编译器就不会再帮我们生成

iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握. expression:表达式assignable:赋值variable:变量redefinition:重复定义type:类型conflicting:冲突项invalid:无效的conversion:转换specifier:说明符indent:缩进operands:运算对象.操作数binary:二

iOS开发OC基础:OC中的分类(类目)

//分类,category,(类目) //为没有源代码的类添加方法 //一定要注意,只能添加方法,不能添加实例变量 /** *  分类 类的定义也是分为接口部分和实现部分 接口部分:以@interface开头 + 类名 后跟小括号,小括号内填写的是分类名 @end结束 在@interface 与@end 之间添加方法. */ //分类为原类添加的方法,就相当于原类具有该方法,可以正常调用 因为涉及到几个分类的创建,所以就直接上传代码了,其实代码也不多,只是怕大家在建立分类的时候会混淆,所以直接把