4.three.js的几何体、纹理、光源、材质、uv属性 讲义

1.如何手动创建几何体?

markdown 复制代码
/**
 * step1.新建空几何体 BufferGeometry:
 *    1.Three.js 底层几何体容器,直接对应 WebGL 顶点缓冲区;
 *    2.刚创建时是空的,没有顶点、UV、法线等任何数据,需要手动挂载顶点属性;
 **/
const geometry = new THREE.BufferGeometry();

/**
 * step2.生成浮点顶点数组 Float32Array:
 *   1.32位浮点型数组,WebGL标准顶点数据格式,GPU只能读取这种二进制数组,不能用普通[]数组;
 **/
const vertices = new Float32Array([
   -1.0, -1.0, 1.0, 
    1.0, -1.0, 1.0, 
    1.0, 1.0, 1.0, 
    
    1.0, 1.0, 1.0, 
   -1.0, 1.0, 1.0,
   -1.0, -1.0, 1.0,
]);

/**
 * step3.将顶点数据挂载到几何体的 position 属性:
 *   1.setAttribute:给几何体绑定顶点属性,GPU渲染时读取对应属性;
 *   2.position:固定关键字,代表顶点坐标属性,着色器内置识别;
 *   3.THREE.BufferAttribute(数组, 每个顶点占用3个浮点数);
 **/
geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));

2.随机生成50个三角形

ini 复制代码
for (let i = 0; i < 50; i++) {
    // step1.每一个三角形,需要3个顶点,每个顶点需要3个值
    const geometry = new THREE.BufferGeometry();
    const positionArray = new Float32Array(9);
    for (let j = 0; j < 9; j++) {
        positionArray[j] = Math.random() * 10 - 5;
    }
    geometry.setAttribute(
        "position",
        new THREE.BufferAttribute(positionArray, 3)
    );
    
    // step2.生成随机颜色
    let color = new THREE.Color(Math.random(), Math.random(), Math.random());
    const material = new THREE.MeshBasicMaterial({
        color: color,
        transparent: true,
        opacity: 0.5,
    });
    
    // step3.根据几何体和材质创建物体
    const mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);
}

3.基础材质如何添加纹理?

arduino 复制代码
/**
 * step1.导入纹理
 *     TextureLoader:纹理加载器,专用图片加载工具,加载图片生成 纹理对象Texture;
 *     .load(图片路径):异步加载本地图片,加载完成后返回 纹理对象;
 *
 **/
const textureLoader = new THREE.TextureLoader();
const doorColorTexture = textureLoader.load("./textures/door/color.jpg");

// step2.添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);

// step3.材质
/**
 *  重要点:
 *      MeshBasicMaterial:基础材质,不受光照影响,永远亮;
 *      MeshLambert/MeshStandard:需要光源,否则模型全黑;
 **/
const basicMaterial = new THREE.MeshBasicMaterial({
   // 基础色是黄色:如果门把手是透明的,门把手就是黄色的门把手
   color: "#ffff00",
   // 纹理贴图通道,图片会贴在模型表面
   map: doorColorTexture,
});
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
scene.add(cube);
相关推荐
Data analyse4561 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai2 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记2 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁3 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu3 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!3 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格3 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人3 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid3 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
IT_陈寒3 小时前
Python多进程共享变量这个坑,差点让我加班到凌晨
前端·人工智能·后端