webgl example例子学习

1 webgl_camera.html
图元在z轴 正方向上。创建的camera 默认是看向z轴负方向,所以这时需要绕Y轴选择180度,才可以看到物体。(右手坐标系)
camera.rotation.y = Math.PI;

场景中,有多个camera , camear 同一般的图元一样,可以加入到scene中,解决CameraHelper 可以看到视锥。

2 webgl_clipping_intersection
材质material ,可以设置裁剪属性

  • 定义裁剪平面数组
  • 设置裁剪属性(合集 还是 交集)

设置camera 的位置,应该考虑如何更好的关注重点。本例中,通过

camera.position.set(-1.5, 2.5, 3.0);
使得相机在物体的前面靠左上的位置,比较容易看到裁剪的效果

3 webgl_geometry_shapes
shape, 可用通过shape.getPoints 获取所有的点;而通过getSpacePoints(count) 可以获取制定个数的点。根据这些点,就可以画线以及虚线点

4 webgl_clipping_stencil
学习stencil 不错的博客: https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/02%20Stencil%20testing/

https://www.zhihu.com/question/266514298

一个裁剪的插件源码 https://github.com/makc/ThreeCSG

https://jsfiddle.net/dokev2hy/1/

基本的流程:
1 往stencil 模版缓冲中写入数据数据。在例子中,通过createPlaneStencilGroup 函数,写入的。原理是:如果背面可见,缓冲数据-1;如果正面可见,缓冲数据+1。 其中,当背面可见时,就是切开framement 。所以,在切面处,模版缓冲的数据是1;
2 绘制切面。
有三个切面,所以,根据PlaneGeometry 生成同三个切面方向一致的平台(在animate 函数中设置平面的指向),然后分别使用对应的模版缓冲数据绘制切面。

5 webgl_buffergeometry_lines
通过BufferGeometry ,分别对position 和 color 属性复制,最后通过THREE.line 实现绘制线条。
其中,比较有意思的一点是: 通过morphTarget 属性,实现一个动画。在动画回调函数中,通过控制morphTargetInfluence 实现线条的变化
关于morphTarget 的参考资料

6 webgl_materials_texture_canvas
通过在一个canvas 上绘制内容,通过THREE.CanvasTexture 将canvas 内容赋值给material 的map 即可。
注意: 如果更新了canvas 的内容,需要调用material.map.needsUpdate = true , 更新纹理

7 webgl_materials_texture_partialupdate
更新一部分纹理内容。纹理其实也是一个数据,覆盖对应位置的数据,就起到局部更新的目的

8 webgl_math_obb
使用的场景,是显示鼠标选择的立方体边框。

### 关系概述 HTML5 和 WebGL 是现代网页开发中的两个关键技术。HTML5 提供了一系列新的标签和功能来增强浏览器的功能,而 WebGL 则是一种基于 JavaScript 的 API,用于在网页上渲染高质量的图形[^1]。 ### 技术细节 HTML5 中引入了 `<canvas>` 元素,它允许通过脚本绘制图像。WebGL 正是在这个基础上工作的;具体来说,WebGL 使用该元素作为绘图表面,并提供了一套低级别的接口让开发者可以编写着色器程序并直接操作 GPU 进行硬件加速渲染。 对于希望创建复杂视觉效果的应用而言,这种组合提供了强大的工具集。例如,在游戏、数据可视化和其他需要高性能图形处理的地方尤为有用。 ### 实际应用案例 下面是一个简单的例子展示如何利用 HTML5 和 WebGL 来实现基本的三维物体旋转动画: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Simple WebGL Example</title> <style> body { margin: 0; } canvas { display: block; background-color: #eee; } </style> </head> <body> <canvas id="glCanvas"></canvas> <script type="module"> import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.147/build/three.module.js'; // Set up scene, camera, renderer... const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // Create a geometry (a cube), material, mesh... const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true }); const cube = new THREE.Mesh(geometry, material); scene.add(cube); camera.position.z = 5; function animate() { requestAnimationFrame(animate); // Rotate the cube slightly each frame to create an animation effect. cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); } animate(); window.addEventListener('resize', () => { const width = window.innerWidth; const height = window.innerHeight; renderer.setSize(width, height); camera.aspect = width / height; camera.updateProjectionMatrix(); }); </script> </body> </html> ``` 这段代码展示了怎样使用 Three.js 库简化 WebGL 编程过程,Three.js 是一个流行的库,可以帮助更方便地管理场景对象以及执行常见的几何变换等任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值