一看就会的Three.js新手教程

782 阅读3分钟

当年第一次晕3D就是 CS半条命-经典仓库,大半个网吧都在玩这个,我在网吧玩了半小时跑出去给我整吐了。 此后对3D射击无感。

图片.png

一直觉得Three.js的贴图不够细腻,糙糙的感觉像当年的CS,最近需要做一些3D效果,还是决定试试这个传说中的框架。为了追求简单直观,能不额外装东西、 不引用、编译脚手架坚决不用。

阶段目标效果:

three方块动图.gif

第一步 中文化官方例子

第一次使用Three.js,当然是中文官方例子,让代码字自解释。

图片.png

想像自己是导演布景、摄像、实施,记住三大主体场景相机渲染器。通常在代码中是固定部分。

167e5f89cca8dd1f~tplv-t2oaga2asx-jj-mark_2268_0_0_0_q75.webp

我们会在页面中得到一个绿色的正方体。

three方块动图2.gif

注意我们才可以加载three.js的module,这里使用的网络外部文件引入。

<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>初学Three.js</title>
</head>
<body>

<script type="module">
import * as THREE from 'https://unpkg.com/three/build/three.module.js';

let 场景 =      null
let 相机 =      null
let 渲染器 =    null


//场景scene、相机camera和渲染器renderer
//第一步  创建场景scene
场景 = new THREE.Scene();

//第二步  创建相机camera  观察者的视角
let W  = window.innerWidth      //内屏的宽度
let H  = window.innerHeight     //内屏的高度
let 视野角度 = 75       //能在显示器上看到的场景的范围,单位是角度
let 长宽比 = W / H   //用一个物体的宽除以它的高的值 16:9  16:10
let 近截面 = 0.1    
let 远截面 = 1000            
            //PerspectiveCamera(透视摄像机)(视野角度,长宽比,近截面,远截面)
相机 = new THREE.PerspectiveCamera(视野角度 ,长宽比, 近截面, 远截面 );


//第三步  创建渲染器 renderer
渲染器 = new THREE.WebGLRenderer({ antialias: true });  //开启物理抗锯齿
渲染器.setSize( W, H );
document.body.appendChild( 渲染器.domElement );



//------------------------------创建 立方体--------------------------------------
const 形状 = new THREE.BoxGeometry( 1, 1, 1 );  //立方体对象(长,宽,高)
const 材质 = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );    //默认材质
const 方块 = new THREE.Mesh( 形状, 材质  );
   
场景.add( 方块 );


相机.position.z = 5;

function 动画() {
	requestAnimationFrame( 动画 );

	方块.rotation.x += 0.01;
	方块.rotation.y += 0.01;

	渲染器.render( 场景, 相机 );
}

动画();


</script>


    
</body>
</html>

第二步 增加鼠标控制器交互

就是拿鼠标按住可以 720°旋转,在three.js中异常简单!只需要增加两句代码!

const 控制器 = new OrbitControls(相机, 渲染器.domElement);

控制器.update();

但是,需要额外加载 OrbitControls.js,这个不在默认three.module.js 中。折腾了很久。

还是使用Node.js 启动pnpm install three模块。

图片.png

2.1 使用pnpm install three 安装模块

2.2 使用type="importmap"创建引入别名

<script type="importmap"> 是 HTML 中用于定义 JavaScript 模块导入映射的元素。它允许你指定一个 JSON 对象,用来重写模块 specifier 到模块 URL 的解析过程。这对于简化模块路径、使用本地缓存或 CDN 链接、以及处理不同环境下的模块加载非常有用。2019年提出的技术。

    <script type="importmap">

{
    "imports": {
        "three": "./node_modules/three/build/three.module.js",
        "目录/": "./node_modules/three/examples/jsm/controls/",
        "控制":"./node_modules/three/examples/jsm/controls/OrbitControls.js"

    }

}

</script>

<script type="module" src="./3D.js">  </script>

2.3 加载图片纹理贴图

准备一张本地图片,然后 使用加载器加载。注意创建 物体是 使用 对应的 变量!如下图

图片.png

关键代码:

const 加载器 = new THREE.TextureLoader(); //创建加载器
let 图片纹理  = 加载器.load('./img/登录页面背景图2.jpg') 

附录

Three.js中文官方文档

threejs.org/docs/#manua…

www.webgl3d.cn/pages/2a15e…