Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Three.js 手写跳一跳小游戏(上)

Three.js 手写跳一跳小游戏(上)

作者头像
神说要有光zxg
发布于 2023-08-28 11:46:32
发布于 2023-08-28 11:46:32
70907
代码可运行
举报
运行总次数:7
代码可运行

前几年,跳一跳小游戏火过一段时间。

玩家从一个方块跳到下一个方块,如果没跳过去就算失败,跳过去了就会再出现下一个方块。

游戏逻辑和这个 3D 场景都挺简单的。

那我们能不能用 Three.js 自己实现一个呢?

我们来写写看。

新建一个 html,引入 threejs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跳一跳</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
    <script src="https://www.unpkg.com/three@0.154.0/build/three.js"></script>
</head>
<body>
<script>
    console.log(THREE);
</script>
</body>
</html>

跑个静态服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx http-server .

浏览器访问下:

three.js 引入成功了。

three.js 涉及到这些概念:

Mesh 是物体,它要指定是什么几何体 Geometry,什么材质 Material。

Light 是光源,有了光源才能看到东西,并且有的材质还会反光。

Scene 是场景,把上面所有的东西管理起来,然后让渲染器 Renderer 渲染出来。

Camera 是摄像机,也就是从什么角度去观察场景,我们能看到的就是摄像机的位置看到的东西。

了解了这些概念,我们在 script 部分写下 three.js 的初始化代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const width = window.innerWidth;
const height = window.innerHeight;
const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000);

const scene = new THREE.Scene();
const renderer = new THREE.WebGLRenderer();

renderer.setSize(width, height);
camera.position.set(0, 0, 500);
camera.lookAt(scene.position);

const pointLight = new THREE.PointLight( 0xffffff );
pointLight.position.set(0, 0, 500);
scene.add(pointLight);

document.body.appendChild(renderer.domElement)

function create() {
    const geometry = new THREE.BoxGeometry( 100, 100, 100 ); 
    const material = new THREE.MeshPhongMaterial( {color: 0x00ff00} ); 
    const cube = new THREE.Mesh( geometry, material ); 
    cube.rotation.y = 0.5;
    cube.rotation.x = 0.5;
    scene.add( cube );
}

function render() {
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

create();
render();

先看效果:

回过头来再解释:

这段代码是创建摄像机的:

PerspectiveCamera 是透视相机,也就是近大远小的效果。

它指定了 4 个参数,都是什么意思呢?

就是这个:

从一个位置去看,是不是得指定你看的角度是多大,也就是图里的 fov,上面指定的 45 度。

然后就是你看的这个范围的宽高比是多少,我们用的是窗口的宽高比。

再就是你要看从哪里到哪里的范围,我们是看从 0.1 到距离 1000 的范围。

这就创建好了透视相机。

然后是光源:

创建个白色的点光源,放在 0,0,500 的位置,添加到场景中。

摄像机也在 0,0, 500 的位置来看场景 scene 的位置:

然后我们创建个立方体,旋转一下:

默认是在 0,0,0 的位置,我们从 0,0,500 的位置去观察看到的就是个平面,所以要旋转下。

我们加个 AxesHelper 把坐标轴显示出来,长度指定 1000

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const axesHelper = new THREE.AxesHelper( 1000 );
axesHelper.position.set(0,0,0);
scene.add( axesHelper );

向右为 x,向上为 y,向前为 z。

因为摄像机在 0,0,500 的位置,所以看不到 z 轴。

我们改下摄像机位置:

把摄像机移动到 500,500,500 的位置,物体就不用旋转了。

这样看到的是这样的:

为什么 2 个面是黑的呢?

因为点光源在 0,0,500 的位置啊,另外两个面照不到。

调整下光源位置到 0,500, 500 呢?

这样就能看到 2 个面了:

当然,这里能反光,因为我们创建立方体用的是 MeshPhongMaterial,它是反光材质:

如果你把它换成 MeshBasicMaterial,其他代码不变:

那就是均匀的颜色,不受光照影响:

最后用 renderer 把 scene 渲染出来,当然,是从 camera 角度能看到的 scene:

所以 render 的时候要传 scene 和 camera 两个参数:

用 requestAnimationFrame 一帧帧的渲染。

基础过了一遍 three.js 基础,接下来正式来写跳一跳小游戏。

我们先创建底下这些平台:

很显然,也是 BoxGeometry。

我们把之前的立方体去掉,给 renderer 设置个背景颜色,并把摄像机移动到 100,100,100 的位置:

然后添加两个立方体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function create() {
    const geometry = new THREE.BoxGeometry( 30, 20, 30 );
    const material = new THREE.MeshPhongMaterial( {color: 0xffffff} );
    const cube = new THREE.Mesh( geometry, material ); 
    scene.add( cube );


    const geometry2 = new THREE.BoxGeometry( 30, 20, 30 );
    const material2 = new THREE.MeshPhongMaterial( {color: 0xffffff} );
    const cube2 = new THREE.Mesh( geometry, material ); 
    cube2.position.z = -50;
    scene.add( cube2 );    
}

x、z 轴的尺寸为 30,y 轴的尺寸为 20.

渲染出来是这样的:

我们调整下点光源位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const pointLight = new THREE.PointLight( 0xffffff );
pointLight.position.set(40, 100, 60);

scene.add( pointLight );

调整到 40,100,60 的位置。

光照射到的部分越多,颜色越浅,照射到的越少,颜色越深。

我们希望上面的面(y 轴)照射到的多一些,前面那个面(z 轴)其次,右边那个面(x 轴)最深。

所以要按照 y > z > x 的关系来设置点光源位置。

确实,渲染出来的效果是我们想要的。

只不过每个立方体的反光不同,我们想让每个立方体都一样,怎么办呢?

那就不能用点光源 PointLight 了,要换成平行光 DirectionalLight。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const directionalLight = new THREE.DirectionalLight( 0xffffff );
directionalLight.position.set(40, 100, 60);

scene.add( directionalLight );

参数不变,还是在同样的位置。

换成平行光光源之后,每个立方体的反光就都一样了。

不过现在背景颜色太浅了,对比不明显,我们调深一点:

好多了:

但不知道大家有没有发现,现在是有锯齿的:

这个的解决很简单,给 WebGLRenderer 传个参数就好了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const renderer = new THREE.WebGLRenderer({ antialias: true });

平滑多了。

然后我们把创建立方体的逻辑封装成函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function createCube(x, z) {
    const geometry = new THREE.BoxGeometry( 30, 20, 30 );
    const material = new THREE.MeshPhongMaterial( {color: 0xffffff} );
    const cube = new THREE.Mesh( geometry, material ); 
    cube.position.x = x;
    cube.position.z = z;
    scene.add( cube );
}

调用几次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
createCube(0, 0);
createCube(0, -100);
createCube(0, -200);
createCube(0, -300);
createCube(-100, 0);
createCube(-200, 0);
createCube(-300, 0);

创建了 7 个立方体:

玩家就是在这些立方体上跳来跳去。

那么问题来了:现在同一方向只能显示 4 个立方体,那如果玩家跳到第 5 个、第 6 个立方体,不就看不到了?

怎么办呢?

移动摄像机!

大家见过这种摄像方式没有:

想拍一个运动的人,可以踩在平衡车上,手拿着摄像机跟着拍,这样能保证人物一直在镜头中央。

在 threejs 世界里也是一样,玩家跳过去之后,摄像机跟着移动过去。

玩家移动多少,摄像机移动多少,这样是不是就相对不变了?也就是玩家一直在镜头中央了?

我们放一个黑色的立方体在上面,代表玩家:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function createPlayer() {
    const geometry = new THREE.BoxGeometry( 5, 20, 5 );
    const material = new THREE.MeshPhongMaterial( {color: 0x000000} );
    const player = new THREE.Mesh( geometry, material ); 
    player.position.x = 0;
    player.position.y = 17.5;
    player.position.z = 0;
    scene.add( player )
    return player;
}

const player = createPlayer();

为什么 y 是 17.5 呢?

因为两个立方体都是 0、0、0 的位置,一个高度是 20,一个高度是 15:

黑色立方体往上移动 7.5 的时候,刚好底部到了原点。

再往上移动 10,就到了白色立方体的上面了:

我们调整下摄像机位置到 100,20,100

这样,刚好可以看到两者的接触面,确实严丝合缝的:

把 y 设置为 20,就有缝隙了:

所以计算出的 17.5 刚刚好。

然后我们做下玩家的移动,先做的简单点,点击的时候就移动到下一个位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.body.addEventListener('click', () => {
    player.position.z -= 100;
});

效果是这样的:

不移动摄像机的情况下,玩家跳几次就看不到了。

我们同步移动下摄像机试试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let focusPos = { x: 0, y: 0, z: 0 };
document.body.addEventListener('click', () => {
    player.position.z -= 100;

    camera.position.z -= 100;

    focusPos.z -= 100;
    camera.lookAt(focusPos.x, focusPos.y, focusPos.z);
});

玩家的 position.z 减 100,那摄像机的 position.z 就减 100,这样就是跟着拍。

当然 lookAt 的焦点位置得移动到下一个方块。

相机位置和聚焦的位置都得变,不能相机跟着移动了,但焦点还是在第一个方块那。

效果是这样的:

能感觉到玩家一直在镜头中央么?

这就是摄像机跟拍的效果。

当然,现在的位置是直接变到下一个方块,太突兀了,得有个动画的过程。

我们新建这几个全局变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const targetCameraPos = { x: 100, y: 100, z: 100 };

const cameraFocus = { x: 0, y: 0, z: 0 };
const targetCameraFocus = { x: 0, y: 0, z: 0 };

从一个位置到另一个位置,显然需要起点和终点坐标。

摄像机的当前位置可以从 camera.position 来取,而目标位置我们通过 targetCameraPos 变量保存。

焦点的起始位置是 cameraFocus,结束位置是 targetCameraFocus。

知道了从什么位置到什么位置,就可以开始移动了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function moveCamera() {

    const { x, z } = camera.position;
    if(x > targetCameraPos.x) {
        camera.position.x -= 3;
    }
    if(z > targetCameraPos.z) {
        camera.position.z -= 3;
    }

    if(cameraFocus.x > targetCameraFocus.x) {
        cameraFocus.x -= 3;
    }
    if(cameraFocus.z > targetCameraFocus.z) {
        cameraFocus.z -= 3;
    }

    camera.lookAt(cameraFocus.x, cameraFocus.y, cameraFocus.z);  
}

function render() {
    moveCamera();

    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

如果摄像机没有达到目标位置,就每次渲染移动 3.

焦点位置也是同步移动。

每次 render 的时候调用下,这样每帧都会移动摄像机。

然后当点击的时候,玩家移动,并且设置摄像机的位置和焦点的目标位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.body.addEventListener('click', () => {
    player.position.z -= 100;

    targetCameraPos.z = camera.position.z - 100

    targetCameraFocus.z -= 100
});

效果是这样的:

这就是我们想要的效果,每次玩家跳到下一个方块,就同步移动摄像机并调整焦点位置,这样玩家就是始终在屏幕中央了。

只不过现在玩家是直接移动过去的,没有一个跳的过程。

我们补充上跳的过程:

同样是要把起始位置和结束位置记录下来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const playerPos = { x: 0, y: 17.5, z: 0};
const targetPlayerPos = { x: 0, y: 17.5, z: 0};

let player;
let speed = 0;

不过这里还需要个 spped,因为有个向上跳的速度。

同时把 player 提取成全局变量。

同样的方式写个 movePlayer 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function movePlayer() {
    if(player.position.x > targetPlayerPos.x) {
        player.position.x -= 3;
    }
    if(player.position.z > targetPlayerPos.z) {
        player.position.z -= 3;
    }
    player.position.y += speed;
    speed -= 0.3;
    if(player.position.y < 17.5) {
        player.position.y = 17.5;
    }
}

function render() {
    moveCamera();
    movePlayer();

    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

如果 player 的位置没有到目标位置就移动,并且这里在 y 方向还有个 speed,只不过每次渲染 speed 减 0.3。

然后在点击的时候不再直接改变 player 位置,而是设置 targetPlayerPos 并且设置一个 speed:

这样每帧渲染的时候都会调用 movePlayer 改变玩家位置。

这样就有了跳的感觉。

只不过现在方块数量是有限的,并且跳的速度也是固定的,这个我们后面再继续完善。

现阶段全部代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跳一跳</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
    <script src="https://www.unpkg.com/three@0.154.0/build/three.js"></script>
</head>
<body>
<script>
const width = window.innerWidth;
const height = window.innerHeight;
const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000);

const scene = new THREE.Scene();
const renderer = new THREE.WebGLRenderer({ antialias: true });

renderer.setSize(width, height);
renderer.setClearColor(0x333333);

camera.position.set(100, 100, 100);
let p1 = scene.position;
camera.lookAt(p1);

const directionalLight = new THREE.DirectionalLight( 0xffffff );
directionalLight.position.set(40, 100, 60);

scene.add( directionalLight );

document.body.appendChild(renderer.domElement)

const axesHelper = new THREE.AxesHelper( 1000 );
axesHelper.position.set(0,0,0);
scene.add( axesHelper );

const targetCameraPos = { x: 100, y: 100, z: 100 };

const cameraFocus = { x: 0, y: 0, z: 0 };
const targetCameraFocus = { x: 0, y: 0, z: 0 };

const playerPos = { x: 0, y: 17.5, z: 0};
const targetPlayerPos = { x: 0, y: 17.5, z: 0};

let player;
let speed = 0;

function create() {

    function createCube(x, z) {
        const geometry = new THREE.BoxGeometry( 30, 20, 30 );
        const material = new THREE.MeshPhongMaterial( {color: 0xffffff} );
        const cube = new THREE.Mesh( geometry, material ); 
        cube.position.x = x;
        cube.position.z = z;
        scene.add( cube );
    }

    function createPlayer() {
        const geometry = new THREE.BoxGeometry( 5, 15, 5 );
        const material = new THREE.MeshPhongMaterial( {color: 0x000000} );
        const player = new THREE.Mesh( geometry, material ); 
        player.position.x = 0;
        player.position.y = 17.5;
        player.position.z = 0;
        scene.add( player )
        return player;
    }

    player = createPlayer();

    createCube(0, 0);

    createCube(0, -100);

    createCube(0, -200);

    createCube(0, -300);

    createCube(-100, 0);

    createCube(-200, 0);

    createCube(-300, 0);

    document.body.addEventListener('click', () => {
        targetCameraPos.z = camera.position.z - 100

        targetCameraFocus.z -= 100
        
        targetPlayerPos.z -=100;
        speed = 5;
    });
}

function moveCamera() {

    const { x, z } = camera.position;
    if(x > targetCameraPos.x) {
        camera.position.x -= 3;
    }
    if(z > targetCameraPos.z) {
        camera.position.z -= 3;
    }

    if(cameraFocus.x > targetCameraFocus.x) {
        cameraFocus.x -= 3;
    }
    if(cameraFocus.z > targetCameraFocus.z) {
        cameraFocus.z -= 3;
    }

    camera.lookAt(cameraFocus.x, cameraFocus.y, cameraFocus.z);  
}

function movePlayer() {
    if(player.position.x > targetPlayerPos.x) {
        player.position.x -= 3;
    }
    if(player.position.z > targetPlayerPos.z) {
        player.position.z -= 3;
    }
    player.position.y += speed;
    speed -= 0.3;
    if(player.position.y < 17.5) {
        player.position.y = 17.5;
    }
}

function render() {
    moveCamera();
    movePlayer();

    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

create();
render();
</script>
</body>
</html>

总结

我们想用 Three.js 写一个跳一跳小游戏。

先过了一下 Three.js 的基础,也就是场景 Scene、物体 Mesh、几何体 Geometry、材质 Material、摄像机 Camera、灯光 Light、渲染器 Renderer 这些概念。

这些概念的关系看这张图就好了:

在 three.js 里,向右为 x 轴,向上为 y 轴,向前为 z 轴,可以用 AxesHelper 来画出坐标系。

我们用 BoxGeometry 创建了一些方块,并且添加了平行光 DirectionalLight,这样每个方块的明暗度都是一样的。

然后又添加了一个 BoxGeometry 作为玩家,跳一跳就是移动玩家的位置。

但是摄像机要跟随玩家的移动而同步移动,就像现实中拍运动的人要跟着拍,这样才能保证它始终在屏幕中央。

我们通过动画的方式改变玩家位置和相机位置,并且玩家还有一个向上的速度,只不过逐步递减,这样就实现了跳的效果。

现在还有很多地方没做完,但已经有雏形了。下篇文章我们继续搞。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神光的编程秘籍 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年08月 Three.js专题-光源
光源是能够发出光的物体或设备,它能够发出光线,使我们看到周围的环境和物体。常见的光源包括太阳、灯泡、蜡烛、火把、手电筒等。根据发光方式不同,光源可以分为自发光源和非自发光源。自发光源是指能够自行发出光线的物体,如太阳等;而非自发光源是指需要外部能量刺激才能发出光线的物体,如灯泡、荧光棒等。
愚公搬代码
2025/05/28
590
【愚公系列】2023年08月 Three.js专题-光源
Three.js 手写跳一跳小游戏(下)
现在是 click 的时候就跳,实际上应该是 mousedown 的时候蓄力,mouseup 的时候跳。
神说要有光zxg
2023/08/28
5360
Three.js 手写跳一跳小游戏(下)
用 Three.js 画一个哆啦A梦的时光机
在 three.js 里以向右的方向为 x 轴,向上的方向为 y 轴,向前的方向为 z 轴:
神说要有光zxg
2023/08/28
6010
用 Three.js 画一个哆啦A梦的时光机
【愚公系列】2023年08月 Three.js专题-相机
相机是一种用来记录图像或视频的设备。现代相机通常由镜头、图像传感器、取景器、快门和图像处理器等部件组成。相机可以拍摄各种类型的照片,包括家庭照片、肖像照片、风景照片、动物照片和艺术照片等。现在,许多相机还具有额外的功能,例如视频录制、自动对焦和无线连接等。随着技术的发展,相机变得更加便携和高质量,已成为记录和分享生活的重要工具。
愚公搬代码
2025/05/28
830
【愚公系列】2023年08月 Three.js专题-相机
【愚公系列】2023年08月 Three.js专题-纹理
纹理是指由于物体内部或表面的微观结构、形态、组成、排列等因素所形成的外观或质感特征。它可以是线性的、非线性的、均匀的或不均匀的,可以在物体的表面或内部出现。纹理可以是自然界中的,也可以是人工制造的,是视觉艺术和设计中一个非常重要的元素。在数字图像处理中,纹理是图像分析和识别的一个重要因素。
愚公搬代码
2025/05/28
770
【愚公系列】2023年08月 Three.js专题-纹理
Three.js光照效果实战案例解析
在当今数字化的时代,3D图形在网页、游戏、虚拟和增强现实等多个领域发挥着重要作用。Three.js作为一款强大且流行的JavaScript 3D库,极大地简化了在网页上创建和展示3D内容的难度。而光照效果在3D图形中犹如灵魂一般的存在,它能够赋予场景真实的质感和立体感,让虚拟的世界栩栩如生。本文将通过一系列实战案例深入解析Three.js光照效果的实现与应用,带您领略Three.js在光照处理方面的独特魅力。
Front_Yue
2025/03/15
1600
Three.js光照效果实战案例解析
three.js中的重要基础概念
Three.js 是一个功能强大的 JavaScript 库,用于创建和展示基于 WebGL 的三维图形。在学习使用Three.js来构建3D世界之前,有一些基本概念是需要牢记的,否则,在你绘制3D世界时,思绪会是杂乱无章的:
fastmock
2025/04/26
1280
『Three.js』辅助坐标轴
在日常开发和学习中,坐标轴能粗略的帮我们定位元素位置和关系。所以我使用 Three.js 学习和开发时基本都会打开坐标轴。
德育处主任
2022/09/23
2.5K0
『Three.js』辅助坐标轴
『Three.js』几个简单的入门动画(新手篇)
如果对上面的代码还不太理解,可以先看看 《『Three.js』起飞!》 ,坐标轴方面可以看看 《『Three.js』辅助坐标轴》 。
德育处主任
2022/09/09
2.7K0
『Three.js』几个简单的入门动画(新手篇)
用 Three.js 和 AudioContext 实现音乐频谱的 3D 可视化
最近听了一首很好听的歌《一路生花》,于是就想用 Three.js 做个音乐频谱的可视化,最终效果是这样的:
神说要有光zxg
2021/12/04
2.9K0
用 Three.js 和 AudioContext 实现音乐频谱的 3D 可视化
Three.js 基础纹理贴图
尽管 Three.js 文档已经比较详细了,但对于刚接触 Three.js 的工友来说,最麻烦的还是不懂如何组合。Three.js 的功能实在太多了,初学者很容易被大量的新概念冲晕。
德育处主任
2023/02/26
5.8K0
Three.js 基础纹理贴图
【愚公系列】2023年08月 Three.js专题-材质
材质是指制造物品所使用的原料或物质的种类,常见的材质包括金属、塑料、木材、玻璃、石头等。材质的选择取决于所制造物品的用途、设计和预算等因素。不同的材质有不同的特点和优缺点,如金属通常较为坚固,但较重且易锈蚀;塑料轻便且不易损坏,但耐久性较差。材质也会影响制造物品的外观和质感,如木材可以赋予物品自然美感,而玻璃则可以营造现代感。
愚公搬代码
2025/05/28
640
【愚公系列】2023年08月 Three.js专题-材质
Three.js可视化企业实战WEBGL网-2024入门指南
Three.js 是一个功能强大的 JavaScript 库,用于在 Web 浏览器中创建和显示动画 3D 图形。它的丰富 API 和模块化设计使得开发者可以轻松构建复杂的 3D 场景和动画效果。本文将详细介绍 Three.js 中的一些重要组件和模块,包括场景、相机、几何体、材质、光源、渲染器和控制器等。
用户11130883
2024/05/31
3550
Three.js教程(4):相机
相机这部分的内容并不是很多,Three.js主要支持两种相机,一种是PerspectiveCamera即透视投影摄像机,另一种是OrthographicCamera即正交投影摄像机。两种相机都是继承自Camera对象,Camera对象又是继承自Object3D。
kai666666
2020/10/17
2.4K0
『Three.js』起飞!
我习惯使用 vs code 编写前端代码,如果是用原生三件套学习,我还会使用 Live Server 插件辅助开发。
德育处主任
2022/09/23
11K0
『Three.js』起飞!
ThreeJs 基础学习
如果你要实现一个机器人在跑步,那么机器人的头、四肢、躯干等都是要整体移动的,group可以将一系列的mesh模型组成一个整体,这样就可以实现整体移动了。
心安事随
2024/07/29
2830
使用Three.js渲染器创建炫酷3D场景
在当今数字化的时代,3D图形技术正以其独特的魅力在各个领域掀起波澜。从影视制作到游戏开发,从虚拟现实到网页交互,3D场景以其强烈的视觉冲击力和沉浸式的体验,成为了吸引用户、传达信息的重要手段。而Three.js,作为一款功能强大且广受欢迎的JavaScript 3D库,为我们提供了便捷、高效的途径来创建令人炫目的3D场景。本文将深入探讨使用Three.js渲染器创建炫酷3D场景的方方面面,带领读者领略这一领域的无限可能。
Front_Yue
2025/03/14
3270
使用Three.js渲染器创建炫酷3D场景
Three.js 场景创建基础
在当今数字化的时代,Web 开发已经不再局限于传统的二维界面。随着技术的不断进步,越来越多的开发者开始探索将 3D 图形引入到网页中,为用户带来更加沉浸式和交互性的体验。而 Three.js 作为一款广受欢迎的 JavaScript 3D 库,为开发者提供了强大而便捷的工具,使得在网页上创建和展示复杂的 3D 场景变得不再困难。本文将深入探讨 Three.js 场景创建的基础知识,包括其简介、引入方式,以及场景构建的关键要素。
Front_Yue
2025/03/12
2940
Three.js 场景创建基础
Three.JS的第一个三弟(3D)案例
Three.js 是基于 WebGL 技术,用于浏览器中开发 3D 交互场景的 JS 引擎。
不惑
2024/04/23
4300
Three.JS的第一个三弟(3D)案例
【Three.js基础】创建场景、渲染场景、创建轨道控制器
WebGL(Web Graphics Library)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,不需要插件,即专门处理计算或处理3D图像的JS API。
不叫猫先生
2023/11/14
5750
【Three.js基础】创建场景、渲染场景、创建轨道控制器
相关推荐
【愚公系列】2023年08月 Three.js专题-光源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验