threejs纹理

摘要:
可以使用TextureLoader类的load方法加载纹理。FunctionloadImgTexture(){varloader=newTHREE.TextureLoader();loader.load}请注意,加载图像是异步的,因此这里我们使用渲染循环来渲染:functionrender(){requestAnimationFrame;render.render;}凹凸贴图凹凸贴图可以使纹理也具有厚度,看起来更坚实。也就是说,使用一个图像保存另一个图像的法向量信息,然后将这两个图像的信息组合在Threejs中,以形成详细的三维纹理。创建法线贴图,如下所示。请注意,MeshBasicMaterial:functionloadImgTexture(){varloader=newTHREE.TextureLoader();loader.load}法线贴图可以生成详细的纹理,而不会影响渲染性能。
纹理

纹理用来表现物体的细节。理论上可以将物体的每个细节建模出来,但是这样时间成本和性能成本都太高,因此,将物体的一些细节用纹理来表示。

图片纹理

图片纹理直接在物体表面应用图片。可以使用TextureLoader类的load方法来加载纹理。

function loadImgTexture(){
    var loader = new THREE.TextureLoader();
    loader.load("metal-rust.jpg",function(texture){
        var geometry = new THREE.BoxGeometry(10,10,10);
        var material = new THREE.MeshBasicMaterial({color:0x739783,map:texture});
        mesh = new THREE.Mesh(geometry,material);
        scene.add(mesh);
    })
}

注意加载图片是异步的,所以这里我们使用render循环来渲染:

function render(){
    requestAnimationFrame(render);
    renderer.render(scene,camera);
}
凹凸贴图

凹凸贴图可以使纹理也有厚度,看起来更立体。凹凸贴图一般使用一张灰度图,设置成材料的bumpMap属性

function loadImgTexture(){
    var loader = new THREE.TextureLoader();
    loader.load("stone.jpg",function(texture){
        loader.load("stone-bump.jpg",function(bumpTexture){
            var geometry = new THREE.BoxGeometry(10,10,10);
            var material = new THREE.MeshPhongMaterial({map:texture,bumpMap:bumpTexture,bumpScale:0.2});
            mesh = new THREE.Mesh(geometry,material);
            mesh.rotation.x = 30/180Math.PI;
            scene.add(mesh);
        })
    })
}

凹凸贴图虽然看起来更立体,但是其只是有深度,没有方向,所以只有在某个方向看是很立体,在其它方向看又不好。如果贴图的对象不怎么转动,光线也不怎么变化,倒可以使用凹凸贴图。

法向贴图

法向贴图使用一张法向图来表示纹理图片某个点的法向量。即用一张图片保存另一张图片的法向量信息,然后再在threejs中将这两个图片的信息合在一起,就形成了一个细节丰富的立体纹理。创建法向贴图如下,注意这里不要再使用MeshBasicMaterial:

function loadImgTexture(){
    var loader = new THREE.TextureLoader();
    loader.load("plaster.jpg",function(texture){
        loader.load("plaster-normal.jpg",function(normalTexture){
            var geometry = new THREE.BoxGeometry(10,10,10);
            var material = new THREE.MeshPhongMaterial({map:texture,normalMap:normalTexture,bumpScale:0.2});
            mesh = new THREE.Mesh(geometry,material);
            mesh.rotation.x = 30/180Math.PI;
            scene.add(mesh);
        })
    })
}

法向贴图可以生成细节丰富的纹理,同时不损害渲染性能。但是法向图这张图片创建起来稍有困难,使用Blender或Photo创建。

光照贴图 环境贴图

环境贴图是使用上下左右前后六张图或者一张全景图来模拟真实的环境,threejs会将这些图片渲染成无缝的环境盒子,例子可看【threejs-cubeMap例子】,其中貌似真实的环境,球的反光效果,都是用这张全景图渲染出来的: 
threejs纹理第1张
球的反光看起来非常逼真,但其实是假的,也就四并没有使用光线追踪来表现出反光效果。光线追踪是很耗cpu的,所以,使用环境贴图即节约性能,又能表现出很逼真的效果。

UV贴图

关于uv贴图,【blender wiki】里面说得很好:


UV贴图是将2D纹理映射到3D物体最灵活的一种方式.在这个过程中三维曲面网络("mesh")的X Y Z被展平到一副二维(X Y 或者说 我们将要看到的 U V)图片中,这样图片中的颜色就被映射到曲面网络("mesh")中。
有助于理解UV贴图的最形象的比喻是切开一个硬纸盒.盒子是一个三维物体,正如同加到场景中的一个曲面网络("mesh")方块.
如果沿着边缝或折痕剪开盒子,可以把盒子摊开在一个桌面上.当我们从上往下俯视桌子时,我们可以认为U是左右方向,V是上下方向.盒子上的图片就在一个二维坐标中.我们使用U V代表"纹理坐标系"来代替通常在三维空间使用的 X Y.

如果给模型的每个面都用一张图片去贴纹理,这将要加载很多纹理图片,如果可以只将图片的某个部分映射到模型,那就只需要一张图片就够了。uv贴图就能够将图片的某部分映射到模型的某个面,如果还不好理解,类比一下CSS Sprite技术。比如,上一篇【加载3D模型例子】例子中,我们用到了一张图片: 
threejs纹理第2张
这张图里面凌乱的放着摊开的人皮、衣服、手、眼睛等图片元素。而我们加载出来的模型是这样的: 
threejs纹理第3张

在这张图中,脸是脸,衣服是衣服,都在它们应该出现的位置。这便是使用了uv映射,将图中的某部分作为纹理,贴到模型中的对应部分。

但是,图中的各个部分,是怎么和模型对应起来的呢?一个人的模型有那么多个面,纯手工编码一个个去对应,感觉会出人命。其实,uv贴图一般是做模型的时候就做好了,图和模型的对应关系也包含在模型文件(就是那个.dae文件)中了,编程的时候一般是不用关心这个。

虽说如此,我们加载模型之后,也可以通过Geometry对象的faceVertexUvs属性看看具体是怎么映射的。简单起见,创建一个BoxGometry,查看一个其内置的uv映射:

var geom = new THREE.BoxGeometry(24, 24, 24);
console.log(geom.faceVertexUvs);

打印出:

threejs纹理第4张

是一个有12个元素的数组,12代表的就是立方体的12个三角面。再看数组的具体某一个元素:

threejs纹理第5张

又是一个长度为3的Vector2数组,代表纹理图片中的三个位置,这三个点围成的部分就是这个三角面的纹理。上面的(0,0),(1,0),(1,1)都是比例,0代表0%,1代表100%。点是从右下角开始按逆时针排列的,比如A(0,0),B(1,0),C(1,1)三点,在图片中围成的区域如下: 
threejs纹理第6张

将这张图加载到立方体,能更清晰立方体是如何通过uv映射来处理纹理的,【例子】。


持续更新看这里

免责声明:文章转载自《threejs纹理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用VsCode的Rest Client进行请求测试powerDesigner根据sql脚本来逆向生成pdm等模型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【BIM】BIMFACE中创建矢量文本[上篇]

背景 在三维模型产品的设计中,针对空间的管理存在这样一个普遍的需求,那就是在三维模型中,将模型所代表的空间通过附加文本的方式来展示其所代表的实际位置或功能,之前尝试过若干方式,比如直接在建模的时候,将文本以构件的方式建在模型里,其优点是展示效果好、位置可控、放大后不失真,但是缺少灵活性,一旦加入到模型中,相当于焊死在上面;另一种方式则是通过Canvas绘制...

在Unity中实现画图/字帖功能

转载:https://blog.csdn.net/Patrick_Boom/article/details/107180717 前段时间总是加班,也没啥心情和精力去研究新东西,总结一下自己之前做的字帖的功能 先上效果图: 文章分为几部分: (一) 画图板实现原理 (二) 画图具体实现过程中的核心点 (三) 在画图板的基础上 演变为字帖的思路 · 画...

m3u8编码视频webgl、threejs渲染视频纹理demo

<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title>fz-live</title> <link href="http://t.zoukankan.com/css/video.css" rel="stylesh...

Cesium深入浅出之阴影贴图【转】

引子 又偷懒了,说好的周更的,又拖了一个月咯。前面两篇写了可视域分析和视频投影,无一例外的都用到了ShadowMap也就是阴影贴图,因此觉得又必要单独写一篇阴影贴图的文章。当然了,还有另外一个原因,文章中视频投影是利用Cesium自带的Entity方式实现的,毫无技术性可言,在文章结尾我说了可以使用ShadowMap方式来做,原理类似于可视域分析,那么今天...

统计 PV、uv、独立ip

一、对pv、uv、独立访问ip的了解。   1、UV(Unique Visitor):独立访客,将每个独立上网电脑(cookie)视为一个独立访客,一天24小时之内,访问自己网站的访客数量。(相同cookie一天只被统计一次)   2、PV(Page View):访问量,即页面浏览量或者点击量,用户每次对网站的访问均被记录1次。用户对同一页面的多次访问,统...

WebGL的3D框架比较 ThingJS 和 Three.js

随着flash的没落,浏览器的原生能力的兴起。在3D方面WebGL不管从功能还是性能方面都在逐渐加强。2D应用变为3D应用的需求也越来越强烈。 win10的画图板支持3D图片,2d工具photoshop也开始逐步集成了3D工具。 下面就基于WebGL技术探讨一下现在的两款3D框架。Threejs(http://threejs.org/) 目前最流行的开源3...