Three.js学习07

提示:本系列文章参考http://www.webgl3d.cn/Three.js/的three.js教程。


前言

本篇主要介绍精灵模型Sprite,模拟了森林和下雨场景。


一、精灵模型Sprite

精灵模型Sprite的基类是Object3D,Object3D类里可以使用的属性方法精灵模型都可以使用。以雨滴为例。
效果如下:
在这里插入图片描述

1.设置纹理贴图

给精灵模型Sprite加载纹理贴图的图片(以雨滴为例)。

var texture = new THREE.TextureLoader().load("rain.png");

2.精灵材质对象SpriteMaterial

精灵材质对象 SpriteMaterial 的基类是材质Material,Material 里的属性方法 SpriteMaterial 里都可以使用。SpriteMaterial 不需要创建几何体,直接使用就行。

// 创建精灵材质对象SpriteMaterial
    var spriteMaterial = new THREE.SpriteMaterial({
        color:0xffffff,//设置精灵矩形区域颜色
        rotation:Math.PI/4,//旋转精灵对象45度,弧度值
        map: texture,//设置精灵纹理贴图
    });

3.创建精灵模型对象

创建精灵模型对象加入到场景中,和以前的几何体一样。

// 创建精灵模型对象,不需要几何体geometry参数
    var sprite = new THREE.Sprite(spriteMaterial);
    scene.add(sprite);

4.scale.set() 方法设置精灵大小

使用 精灵模型对象名.scale.set() 方法设置精灵大小。

// 控制精灵大小,比如可视化中精灵大小表征数据大小
    sprite.scale.set(20, 20, 1);  只需要设置x、y两个分量就可以

二、精灵模型模拟森林场景

效果如下:
在这里插入图片描述

1.创建草坪

先创建一个草坪地面,在矩形平面上利用阵列将纹理贴图草的图片进行重复。

/**
     * 创建一个地面
     */
    var geometry = new THREE.PlaneGeometry(300, 300); //矩形平面
    // 加载树纹理贴图
    var texture = new THREE.TextureLoader().load("grass.jpg");
    // 设置阵列
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;

    /*// 偏移效果
    texture.offset = new THREE.Vector2(0.5, 0.5)*/

    // uv两个方向纹理重复数量
    texture.repeat.set(30, 30);
    var material = new THREE.MeshLambertMaterial({
        map: texture,
    });
    var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    scene.add(mesh); //网格模型添加到场景中
    mesh.rotateX(-Math.PI / 2);

2.利用for循环设置一定数量的雨滴精灵模型

将纹理贴图利用for循环设置一定数量的雨滴精灵模型,设置大小后利用 random() 函数在xoz平面上随机分布。

/**
     * 精灵创建树林效果
     */
    // 加载树纹理贴图
    var textureTree = new THREE.TextureLoader().load("tree.png");
    // 批量创建表示一个树的精灵模型
    for (let i = 0; i < 100; i++) {
        var spriteMaterial = new THREE.SpriteMaterial({
            map:textureTree,//设置精灵纹理贴图
        });
        // 创建精灵模型对象
        var sprite = new THREE.Sprite(spriteMaterial);
        scene.add(sprite);
        // 控制精灵大小,
        sprite.scale.set(30, 30, 1);  只需要设置x、y两个分量就可以
        var k1 = Math.random() - 0.5;
        var k2 = Math.random() - 0.5;
        // 设置精灵模型位置,在xoz平面上随机分布
        sprite.position.set(300 * k1, 30, 300 * k2)
    }

三、精灵模型模拟下雨场景

效果如下:
请添加图片描述

1.创建草坪

先创建一个草坪地面,在矩形平面上利用阵列将纹理贴图草的图片进行重复。

/**
     * 创建一个地面
     */
    var geometry = new THREE.PlaneGeometry(300, 300); //矩形平面
    // 加载树纹理贴图
    var texture = new THREE.TextureLoader().load("grass.jpg");
    // 设置阵列
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;

    /*// 偏移效果
    texture.offset = new THREE.Vector2(0.5, 0.5)*/

    // uv两个方向纹理重复数量
    texture.repeat.set(30, 30);
    var material = new THREE.MeshLambertMaterial({
        map: texture,
    });
    var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    scene.add(mesh); //网格模型添加到场景中
    mesh.rotateX(-Math.PI / 2);

2.创建group群组里放入一定数量的雨滴

// 创建一个组表示所有的雨滴
    var group = new THREE.Group();
    // 加载雨滴理贴图
    var texture = new THREE.TextureLoader().load("rain2.png");
    // 创建精灵材质对象SpriteMaterial

    for(let i=0;i<3000;i++){
        var spriteMaterial = new THREE.SpriteMaterial({
            color:0xffffff,//设置精灵矩形区域颜色
            /*rotation:Math.PI/4,//旋转精灵对象45度,弧度值*/
            map: texture,//设置精灵纹理贴图
        });
        // 创建精灵模型对象,不需要几何体geometry参数
        var sprite = new THREE.Sprite(spriteMaterial);
        scene.add(sprite);
        group.add(sprite);
        // 控制精灵大小,比如可视化中精灵大小表征数据大小
        sprite.scale.set(6, 6, 1);  只需要设置x、y两个分量就可以
        var k1 = Math.random() - 0.5;
        var k2 = Math.random() - 0.5;
        var k3 = Math.random() - 0.5;
        // 设置精灵模型位置,在整个空间上上随机分布
        sprite.position.set(300 * k1, 300*k3, 300 * k2);


    }
    scene.add(group);

3.利用函数让渲染器渲染遍历雨滴群组,控制刷新频率产生动画效果,然后执行渲染操作。

在设置渲染对象和执行渲染操作间加入函数,每次渲染遍历雨滴群组。

function render() {
        // 每次渲染遍历雨滴群组,刷新频率30~60FPS,两帧时间间隔16.67ms~33.33ms
        // 每次渲染都会更新雨滴的位置,进而产生动画效果
        group.children.forEach(sprite => {
            // 雨滴的y坐标每次减1
            sprite.position.y -= 1;
        if (sprite.position.y < 0) {
            // 如果雨滴落到地面,重置y,从新下落
            sprite.position.y = 200;
        }
        });

你想学习关于 three.js 的内容吗?我可以为你提供一些相关的信息和资源。首先,three.js 是一个用于创建 3D 图形的 JavaScript 库,它可以在 Web 浏览器中渲染复杂的三维场景和动画效果。如果你想学习如何使用 three.js,以下是一些步骤和资源供你参考: 1. 了解基础知识:在开始学习 three.js 之前,建议你先掌握 HTML、CSS 和 JavaScript 的基础知识。 2. 安装和设置:你可以通过下载 three.js 的最新版本文件或使用 CDN 来引入 three.js 库。确保在你的 HTML 文件中正确地链接和配置 three.js。 3. 学习文档和示例:three.js 官方网站提供了详细的文档和示例,你可以通过阅读文档和尝试示例来了解 three.js 的各种功能和用法。官方文档地址是:https://threejs.org/docs/index.html 4. 学习基本概念:熟悉 three.js 中的基本概念,如场景(Scene)、相机(Camera)、渲染器(Renderer)、几何体(Geometry)、材质(Material)等。理解这些概念对于构建三维场景至关重要。 5. 创建简单场景:从简单的场景开始,逐步添加和调整对象、光照和材质等。通过实践来熟悉 three.js 的基本用法和 API。 6. 学习进阶技术:一旦你掌握了基本的用法,你可以学习更高级的技术,如动画、纹理映射、阴影、粒子效果等。three.js 提供了丰富的功能和扩展库,你可以根据自己的需求进一步探索。 除了官方文档外,还有一些优秀的教程和资源可供参考,例如: - three.js Fundamentals:https://threejsfundamentals.org/ ***
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值