针对threejs 自带例子,学习一些典型例子
camera.html
学习了
单个容器,多个camera 在不同区域,显示不同内容。通过camera 的 setViewport 设置绘制区域。
camera_logarithmicdepthbuffer.html
学习了
多容器分屏显示scene 的不同部分的效果。通过camera 的 setViewOffset 实现。
通过设置renderer 属性logarithmicDepthBuffer ,解决z-fighting 问题
materials.html
展示了16中材质
materials_car.html
展示了一个车辆模型在空间中跑动的效果。通过在场景中设置fog ,有一个远近的感觉;通过加载一个车辆的底图,模拟阴影的效果;加载车辆模型,根据getObjectName 获取到特定的mesh ,替换对应的material,实现自定义效果;通过grid 的移动,模拟车辆在路上行驶的效果。
materials_standard.html
场景背景纹理,通过background 指定。scene 的enviroment 可以指定场景中默认的envMap。场景中加载了一把枪,通过material.map 指定纹理;通过material.normalMap 指定法向量纹理,从而有不同光照强度的效果;通过roughnessMap 指定粗糙度;
materails_stanard_nodes.html
TODO
materials_normalmap.html
介绍了normalMap 法线贴图,以及specularMap 高光贴图,如果过亮,可以通过specularMap 来调整。
materials_blending.html
介绍mesh 同背景的混合方式 ,通过material 属性,transparent = true ,以及 blending 的不同属性来实现。
materials_blending_custom.html
介绍了几种纹理混合的方式,比如add 、subtract 等
materials_bumpmap.html
凹凸贴图,人物有了高低起伏的表面
materials_channels.html
介绍了nomalMap ,法向量纹理,displacement 发现偏移纹理,以及aoMap 环境遮挡纹理。介绍了这么多纹理,其实主要是解决用更少的面更逼真的还原的问题
buffergeometry.html
分别设置geometry 的属性,position 、normal 、color , 完成geometry 的设置,完成属性设置后,需要geometry.computeBoundingSphere(),这样可以及时计算bounding** 属性。其中,看到的物体item, 通过位置,独立计算三角形的三个顶点,然后存入position 中。
例子是通过THREE.Mesh 绘制,从而绘制的是三角形
通过normal ,设置点的法线,从而在有光照下,呈现亮、暗的效果
buffergeometry_points.html
通过THREE.Points 绘制点
buffergeometry_points_interleaved.html
将position 以及color 存放在一个ArrayBuffer 中,通过 THREE.InterleavedBufferAttribute 设置偏移等属性,读取对应的字段。
buffergeometry_lines.html
通过THREE.Line 绘制线
通过morphTarget 以及morphTargetInfluences 来设置动画
buffergeometry_lines_indexed.html
通过THREE.LineSegments 绘制线。lineSegment 与line 的区别是,lineSegment 用两个独立的点连成直线;而line 会用前一个点,连接下一个点,形成直线。
buffergeometry_indexed.html
index 是共享vertex 的方式
buffergeometry_instancing.html
巨多的相同物体(可以复用position) ,通过这种方式,提高渲染性能
buffergeometry_instancing_billboards.html
通过设置translate 属性,从而不同物体有不同的位置。
buffergeometry_glbufferattribute.html
通过webgl 原生方法设置geometry 属性。可以了解背后原理
buffergeometry_drawrange.html
通过坐标判断是否超出边界;对于x,y,z 直接取负值,实现碰撞后的反弹效果;
buffergeometry_compression.html
通过调整position normal 以及uv 数据的字节数,达到压缩的目的
buffergeometry_selective_draw.html
通过自定义material , 通过传递属性visible 到顶点着色器,接着在顶点着色器中,传递给片元着色器。这种方式的好处是:所有的线都是通过一个mesh 实现。而常规途径,想实现部分显示隐藏的效果,需要创建N个mesh
buffergeometry_rawshader.html
主要使用raw shader 实现颜色的周期变化
buffergeometry_custom_attributes.html
实现点的变大、变小的效果
-helpers.html
介绍了切线helper 、法线helper 、geometry 的包围盒boxHelper、点广源PointLightHelper,还有geometry 边缘线的helper , WireframeGeometry 以及 EdegsGeometry
instancing_dynamic.html
通过mesh = THREE.InstancedMesh(geometry, materail, count) 构建包含count 个geometry 的几何体。每个单独的geometry ,可以通过mesh.setMatrixAt(i, maxtrix) 修改几何位置等信息
instancing_modified.html
接着上面的例子,构建的count 个单独geometry,他们的颜色不一样。
第一步,geometry 设置属性,如:instanceColor , 值为count 个rgb 值
第二步,修改material ,这样可以识别上述设置的属性。
在material.onBeforeCompile 中,利用在material 中提前存在的钩子文本,做替换操作,从而达到修改material 的功能
通过查看instancing_raycast.html 也可以看到,修改颜色的第二种方式是mesh.setColorAt
instancing_performance.html
从渲染次数以及内存占用,两个维度,评判三种渲染方法的性能。instanced, merged 以及navie , 从对比可以看到instanced 从上述指标看,都是最优的
instancing_raycast.html.html
通过intersection[0].instanceId 可以获取到鼠标选中的单独的geometry
instancing_scatter.html
利用 MeshSurfaceSampler 取样geometry 的surface。
利用两个instancedMesh 分别渲染花以及根茎,用相同的matrix 赋值给单独的geometry ,实现看起来像整体的效果
interactive_buffergeometry.html
buffergeometry 的mesh 如何交互的例子。通过intersect 的face 属性,可以获取到鼠标交互到的面。在例子中,通过获取这个面的点信息,传递给一个bufferGeometry 的三角图形,从而实现线性展示鼠标选中的面。
interactive_cubes.html
高亮显示选中的cube . 通过intersection[0].object 获取选中的mesh ,然后在mesh 中保存当前材质的颜色,mesh.material.emissinve.getHex(), 用于在鼠标移出后还原颜色,接着给mesh 的material 重新赋予新的颜色
interactive_cubes_ortho.html
这个例子使用的正交相机,上一个例子使用的是透视相机
interactive_cubes_gpu.html
在gpu 层面,获取到用户鼠标选中的物体。首先构建n个geometry , 然后通过帮助函数BufferGeometryUtils.mergeBufferGeometries 将n个geometry 合并成一个大的geometry ,这样在渲染的时候,仅仅渲染一次就够。
同时,为了利用gpu 选中的功能,在另一个场景中,也构建一个同上一样的geometry , 这个每个独立的geometry 有跟id 一致的color ,从而可以依据某个位置上的color ,获取用户选中物体的id .
最后,通过这个id , 修改高亮box 的position , rotation 以及scale 属性
interactive_lines.html
绘制了50条线,每条线有50个点。高亮鼠标选中的点,是通过intersects[0].point 获取点,然后将点信息传递给高亮元素。sphereInter.position.copy(intersects[0].point)
interactive_points.html
选中点,修改大小的方式。本方案采用自定义material 来实现
interacive_raycasting_points.html
interactive_voxelpainter.html
实现在棋盘上堆放正方块的效果。分为两个步骤,第一步,获取鼠标焦点的intersect 信息。第二步,根据上述获取到的intersect , 通过获取intersect 的position ,以及法向量,新堆放物体的位置计算公式是: position.copy(intersect.point).add(intersect.face.normal。里面还有一个小效果,鼠标移动时,物体并没有随着鼠标移动而移动,而只在格子里移动,主要是对position 又做了处理,position.divideScalar(50).floor().multiplyScalar(50) , 50是格子的宽度,这样就能保证新增的物体在格子里
lines_colors.html
通过CatmullRomCurve3 生成一条曲线,可以将曲线分成很多份,(比如按照控制点的个数乘以n, n 越大,通过line 绘制就越平滑)
lines_dashed.html
介绍了绘制虚线的两种方案。第一种,使用Line 构建线条,然后使用LineDashedMaterial 设置颜色、dashSize 以及gapSize。第二种,使用LineSegments 构建线条段,然后也是使用LineDashedMaterial 设置虚线属性。思考:什么情况下使用line 和 lineSegments ?如果一笔能画完的,用line ,如果需要分段画,就用lineSegment
line_fat
宽线条效果。在LineBasicMaterial 中,属性lineWidth 一般没有效果,所有才需要其他解决方案。本方案利用three 的扩展库Line2 以及 扩展material ,实现线宽设置。
其中,还学习了如何在一个canvas 显示多个区域的方法,通过renderer.setScissorTest(true),开启裁剪,然后通过renderer.setScissor 设置裁剪范围,最后通过renderer.setViewport 同上一致的范围,保证在裁剪范围中,能完整显示整个scene
lines_fat_wireframe.html
一个体的线宽设置。THREE.WireframeGeometry 能生成一个像素宽的线宽。使用three的扩展库WireframeGeometry2 以及 LineMaterail 生成一个体的线宽效果
lines_sphere.html
生成球面镜像的线。主要是通过xyz 在[-1,1]范围内,生成随机点,然后通过vertex.multiplyScalar 生成另一个随机值,这样通过lineSegment 就可以得到线段。
math_obb.html
obb 有方向的包围盒,相对于aabb,更紧凑。用于碰撞检测以及射线拾取物体
math_orientation_transform.html
目标物体位置发生变化,时刻指向他的物体,也同时发生变化。主要利用通过lookat 获取旋转矩阵,进而获取四元数。四元数更合适做插值运算,能实现动画慢慢指向物体的效果
lensflares.html
镜头光晕效果。
lightningstrike.html
放电效果