创建一个函数,返回我们生成的数据URI,如许我们就不必在代码的中存放置一个大年夜的字符串。
function getTexture() { var data = 'data:image/jpeg;base64,/...'; // paste your data URI inside the quotation marks. return data}var textureLoader = new THREE.TextureLoader();var texture = textureLoader.load(getTexture());planeMaterial.map = texture;
如今的器械看起来很难看,因为外面的纹理像素化了。这张图片拉伸得太大年夜了,无法覆盖全部外面。你可以做的是让图像反复,而不是缩放,如许就不会像素化了。为此,您须要设置 wrapSand wrapT 属性为 THREE.RepeatWrapping 。反复包装并指定反复值。因为你也会为其他类型的地图做这个(比如凹凸或粗拙贴图),最好是为它创建一个轮回:
var repetition = 6;var textures = ['map']// we will add 'bumpMap' and 'roughnessMap'textures.forEach((mapName) => { planeMaterial[mapName].wrapS = THREE.RepeatWrapping; planeMaterial[mapName].wrapT = THREE.RepeatWrapping; planeMaterial[mapName].repeat.set(repetition, repetition);});这看起来竽暌功该更好。因为你所应用的纹理是无缝的,你不会留意到有反复产生的边沿的任何不连接。
看代码 learning-threejs-07 by Engin Arslan ( @enginarslan ) on CodePen .
其他纹理地图
正如上一章所提到的,纹理不仅被用来定义外面的色彩,并且还用来定义它的其他性质〔禊图的另一种方法是 凹凸贴图 。当被用作凹凸贴图时,纹理的亮度值会模仿一?高度的效不雅。
planeMaterial.bumpMap = texture;`
凹凸贴图也应当应用与色彩贴图雷同的反复设备,所以在 textures 数组中包含它。
var textures = ['map', 'bumpMap'];`
应用凹凸贴图,加亮一个像素的值,响应的外面看起来会更高。然则凹凸贴图并没有改变外面,它只是在把持光与外面的互相感化产生一种不平均拓扑的错觉。如今的碰撞量看起来竽暌剐点太大年夜了。凹凸贴图在应用时效不雅很好。是以,让我们将 bumpScale 参数更改为更低的值,以获得更细微的效不雅。
planeMaterial.bumpScale = 0.01;`
这将是一个漫长的教程。如不雅您是一个爱好看视频的人,或者您想懂得更多的关于Three.js,您应当看看我对这个问题培训的视频。来自 Lynda.com .
请求
创建一个名为 getMetalTexture 纹理的新函数。
留意,这种纹理在外不雅上有很大年夜的不合。反射不再完美了,但却被完美地瓜分了,就像实际生活中那样。另一种可用于标准材料的 StandardMaterial 是 roughness map 。纹理贴图是一个粗拙的贴图,你可以应用给定图像的亮度值来控制反射的锐度。
planeMaterial.roughnessMap = texture;var textures = ['map', 'bumpMap', 'roughnessMap'];
根据这three.js文档,当与 environment map 一路应用时,标准材料的工作效不雅最好。情况图模仿了一个遥远的情况,反竽暌钩了场景中的反射面。当你试图模仿物体的反射率时,这真的很有赞助。在三个情况地图。js以 立方体地图 的情势出现。多维数据集映射是一个在多维数据集内映射的场景的全景视图。一个立方体地图由6个自力的图像构成,这些图像对应一个立方体的每个面。因为在一个在线编辑器中加载6个模式图像将会有太多的工作,所以在本例中不会实际应用情况映射。然则为了使这个球面对象加倍有趣,也可以添加一个粗拙度图。你会应用这个 纹理 ,然则是320px*320px数据URI。
把它应用在球面上,比如 bumpMap 和 roughnessMap :
var sphereMaterial = sphere.material;var metalTexture = textureLoader.load(getMetalTexture());sphereMaterial.bumpMap = metalTexture;sphereMaterial.roughnessMap = metalTexture;sphereMaterial.bumpScale = 0.01;sphereMaterial.roughness = 0.75;sphereMaterial.metalness = 0.25;
看代码 learning-threejs-08 by Engin Arslan ( @enginarslan ) on CodePen .
封装起来
function getMetalTexture() { var data = 'data:image/jpeg;base64,/...'; // paste your data URI inside the quotation marks. return data}你几乎完成了!在这里,你只须要做一些小小的调剂。可以看到这个场景文件的最终版本 in this Pen .
给灯光供给一种非白色的色彩。留意,若何实际应用CSS色彩值作为字符串来指定色彩:
var spotLight_01 = getSpotlight('rgb(145, 200, 255)', 1);var spotLight_02 = getSpotlight('rgb(255, 220, 180)', 1);然后在灯光中添加一些奥妙的随灵活画,为场景添加一些生命。起首,将名称属性分派给灯光,如许您就可以应用 getObjectByName 办法在 update 函数中找到它们。
var plane = getPlane(50, 50);scene.add(plane);plane.rotation.x = Math.PI/2;
spotLight_01.name = 'spotLight_01';spotLight_02.name = 'spotLight_02';
之后,在 update 函数琅绫擎,应用 Math.random() 函数创造动画,
var spotLight_01 = scene.getObjectByName('spotLight_01');spotLight_01.intensity += (Math.random() - 0.5) * 0.15;spotLight_01.intensity = Math.abs(spotLight_01.intensity);var spotLight_02 = scene.getObjectByName('spotLight_02');spotLight_02.intensity += (Math.random() - 0.5) * 0.05;spotLight_02.intensity = Math.abs(spotLight_02.intensity);作为一个额外的嘉奖,在场景文件中,我已经包含了 OrbitControls 脚本。three.js摄像机,这意味着你可以把你的鼠标拖参预景上与摄像头互动!我也如许做了,如许场景就会跟着窗口大年夜小的变更而调剂。为了便利起见,我应用外部脚本实现了这一点。
推荐阅读
【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 微办事的重要目标是将本>>>详细阅读
地址:http://www.17bianji.com/lsqh/37523.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示