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);
相关推荐
用户921080262863 分钟前
Bubble 消息操作区改造:复制、重新生成和反馈
前端
LEE7 分钟前
AI Agent 都在疯狂加功能,它说:我全砍了
前端·后端
张清悠7 分钟前
用 TRAE Work 把 PRD + 设计稿注释,整理成 20 分钟可排期前端任务清单
前端
Brown.alexis1 小时前
es6知识点5-自备使用
前端·javascript·es6
杨利杰YJlio1 小时前
KB5121003更新详解:安全启动证书、AI组件、资源管理器与安装验证
前端·javascript·后端
紫菜猫一只2 小时前
Vue 3 与 React 常用写法对比
前端
jinggongszh2 小时前
使用AI协同开发产品条码规则功能——从“理解方案、原型、接口文档”到“落地真实前端代码”
前端·人工智能·mes系统·mes工程架构
渔夫正在掘金2 小时前
Cordis 中文教程:渐进式构建插件化应用
前端·node.js·ai编程
打呵欠的猫2 小时前
前端团队 3 个月 AI 实践复盘:哪些场景 ROI 最高,哪些是伪需求
前端·ai编程
gyx_这个杀手不太冷静2 小时前
高级前端开发职业规划(2026—2035)
前端·面试·agent