当前位置: 首页 > news >正文

Three.js 中国旗帜教程

中国旗帜 ·China Flag· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • RawShaderMaterial手写完整 GLSL(含 projectionMatrix 等)
  • 高细分BoxGeometry当旗面
  • 多频率sin叠加 Z 向波浪 + 杆边xFactor衰减
  • vDark传递位移量做片元明暗

效果说明

本案例演示中国旗帜效果:基于 WebGL 实现「中国旗帜」可视化效果,附完整可运行源码;核心用到 RawShaderMaterial、OrbitControls。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

顶点波浪

float xFactor = clamp((modelPosition.x + 1.25) / 2.0, 0.0, 2.0);

float vWave = sin(modelPosition.xuFrequency.x - uTime)xFactor * uStrength; vWave += sin(modelPosition.yuFrequency.y - uTime)xFactoruStrength0.5; modelPosition.z += vWave;

xFactor让靠近旗杆(x 较小)顶点几乎不动。

片元明暗

textColor.rgb *= vDark + 0.85;

波浪隆起处vDark较大,颜色略亮/略暗形成褶皱感。

RawShaderMaterial

需自行声明attribute/uniform mat4 projectionMatrix等;不自动注入 Three chunk。

实现步骤

  • TextureLoader 加载国旗 JPG
  • BoxGeometry(3, 2, 0.025, 64, 64) 高细分
  • uniforms:uTimeuFrequencyuStrengthuTexture
  • animate 里uTime += 0.06
  • 代码要点

    import * as THREE from 'three'

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

    const box = document.getElementById('box')

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)

    camera.position.set(0.5, -0.5, 3)

    const renderer = new THREE.WebGLRenderer()

    renderer.setSize(box.clientWidth, box.clientHeight)

    box.appendChild(renderer.domElement)

    new OrbitControls(camera, renderer.domElement)

    window.onresize = () => {

    renderer.setSize(box.clientWidth, box.clientHeight)

    camera.aspect = box.clientWidth / box.clientHeight

    camera.updateProjectionMatrix()

    }

    const flagTexture = new THREE.TextureLoader().load(GLOBAL_CONFIG.getFileUrl("images/chinaFlag.jpg"))

    const flagMaterial = new THREE.RawShaderMaterial({

    vertexShader:uniform mat4 projectionMatrix; uniform mat4 modelMatrix; uniform mat4 viewMatrix; uniform vec2 uFrequency; uniform float uTime; uniform float uStrength; attribute vec3 position; attribute vec2 uv; varying float vDark; varying vec2 vUv; void main() { vec4 modelPosition = modelMatrix * vec4(position, 1.0); float xFactor = clamp((modelPosition.x + 1.25) / 2.0, 0.0, 2.0); float vWave = sin(modelPosition.xuFrequency.x - uTime )xFactor * uStrength ; vWave += sin(modelPosition.yuFrequency.y - uTime)xFactoruStrength0.5; modelPosition.y += sin(modelPosition.x2.0 + uTime0.5)0.05xFactor; modelPosition.z += vWave; vec4 viewPosition = viewMatrix * modelPosition; vec4 projectedPosition = projectionMatrix * viewPosition; gl_Position = projectedPosition; vUv = uv; vDark = vWave; },

    fragmentShader:precision mediump float; varying float vDark; uniform sampler2D uTexture; varying vec2 vUv; void main(){ vec4 textColor = texture2D(uTexture, vUv); textColor.rgb *= vDark + 0.85; gl_FragColor = textColor; },

    side: THREE.DoubleSide,

    uniforms: { uFrequency: { value: new THREE.Vector2(3, 3) }, uTime: { value: 0 }, uTexture: { value: flagTexture }, uStrength: { value: 0.2 } }

    })

    const flagGeometry = new THREE.BoxGeometry(3, 2, 0.025, 64, 64)

    const flagMesh = new THREE.Mesh(flagGeometry, flagMaterial)

    scene.add(flagMesh)

    animate()

    function animate() {

    flagMaterial.uniforms.uTime.value += 0.06

    renderer.render(scene, camera)

    requestAnimationFrame(animate)

    }

    完整源码:GitHub

    小结

    • 本文提供中国旗帜完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1130939/

相关文章:

  • 完整教程:如何用N_m3u8DL-CLI-SimpleG轻松下载M3U8视频流
  • STM32L031K6与25CSM04实现高速EEPROM数据检索方案
  • ResNet双重注意力机制解析与工程实践
  • Mythos Preview:AI驱动的网络安全范式重置
  • STM32与AHP-COT降压转换器的嵌入式电源设计
  • DeepSeek、豆包、龙虾:AI工具链的脑、嘴、手分工解析
  • 基于AVOA优化的非完全beta函数图像增强方法
  • 六自由度工业机器人设计与运动控制关键技术解析
  • Apache .htaccess文件上传漏洞:原理、利用与防御实战
  • MC6470六轴IMU与PIC18F2515的嵌入式运动控制方案
  • Spring Boot自动化配置安全陷阱与纵深防御实战指南
  • YOLOv1目标检测原理解析与实现细节
  • MySQL快速入门:从零掌握核心操作与高效查询实战
  • GPT-5.5不存在?拆解AI时代版本幻觉与能力误判风险
  • YOLOv3目标检测算法解析与工程实践
  • 大公司AI部署为何慢?解析工程化、合规与系统集成的挑战
  • 工业级恶意软件补丁工具架构设计:从证书管理到UI工作流的全链路解析
  • OpenCV图像轮廓特征查找技术详解与应用
  • iOS图片异步加载与缓存优化:FAImageView核心功能与实战指南
  • 写作者如何选对LLM:不比参数,只看写作卡点
  • 魔兽争霸III地图编辑器终极指南:如何使用HiveWE快速创建高质量游戏地图
  • 数字图像处理中的亮度调整原理与实践
  • DMS与OMS系统:法规驱动的汽车安全技术解析
  • LENA-R8与STM32L442KC实现低功耗全球连接与高精度定位
  • Halcon XLD 轮廓拟合对比:直线/圆/椭圆/矩形4种算法精度与速度实测
  • PCF8591与PIC18F85J50的信号转换系统设计与实现
  • Jadx深度解析:如何用这个高效工具解锁安卓应用的源代码
  • Hugging Face与Flair默认情感分析管道深度对比
  • 如何用统一API快速整合网易云、QQ音乐等六大平台音乐资源?
  • 私域电商支付接入实战:银盛开放平台与YSEPAYSHOP集成方案解析