为了可以或许显示你衬着的结不雅,你须要将衬着器的 domelement 属性追加到HTML内容琅绫擎。你会应用空的div元素,为词攀来创造id为 WebGL 的元素。
经由过程这段代码,这个球的X和Z轴在缩放。尽管我们的意图不是创造一个缩放的球。我们正在设置 update 函数,以便我们今后可以应用不合的动画。如今你已经看到了它是若何工作的,你可以删除这个缩放动画。
看代码 learning-threejs-05 by Engin Arslan ( @enginarslan ) on CodePen .
第二部分 - 在场景中添加实际
今朝,我们正在应用 MeshBasicMaterial ,即使在场景中没有灯光时,它也挥菰示出给定的色彩,这会导致一?异常扁平的外不雅。尽管真实世界的材料不会以这种方法进行工作。真实世界可见的外面,取决于大年夜外面反射回我们眼睛的光有若干。three.js有几个不合的材料,供给更好的接近实际外面的行动,个一一个是 meshstandardmaterial 。 meshstandardmaterial 是一个基于物理的衬着材料,可以赞助你达到逼真的效不雅。这是现代游戏引擎的一种材料,如 Unreal or Unity,是游戏和视觉效不雅的行业标准。
纹理的加载实际上是一个异步操作。这意味着您的3D场景是在加载图像文件之前生成的。然则因为您一向在应用 requestAnimationFrame 赓续地出现场景,是以在本例中不会造成任何问题。如不雅不如许做,则须要应用回调或其他异步办法来治理加载次序。
让我们开端在我们对象中应用 MeshStandardMaterial ,改变其色彩变为白色。
var material = new THREE.MeshStandardMaterial({ color: 0xffffff,});function getSpotLight(color, intensity) { var light = new THREE.SpotLight(color, intensity); return light;}var spotLight_01 = getSpotlight(0xffffff, 1);scene.add(spotLight_01);你也许在这个点上可以看到些工作。为了更好的取景和暗影,光线和相机的地位有点不合。同时创造一个帮助光。
你将会在这个点上再次获得黑色衬着。这是正常的。对象在场景中须要光才能显示。这对于 meshbasicmaterial 不是必须的,因为它是一个简单的材料,在所有前提下,显示给定的色彩,但其他材料须要与光的互相感化才可见。让我们创造一个 SpotLight 函数,你将会用这个函数创造两个聚光灯。
var spotLight_02 = getSpotlight(0xffffff, 1);scene.add(spotLight_02);camera.position.x = 0;camera.position.y = 6;camera.position.z = 6;spotLight_01.position.x = 6;spotLight_01.position.y = 8;spotLight_01.position.z = -20;spotLight_02.position.x = -12;spotLight_02.position.y = 6;spotLight_02.position.z = -10;
做完这些,你场景中将有两个光源,大年夜两个不合的地位照射球体。灯光有助于懂得场景的维度。但在这一点上,工作仍然异常不真实,因为照明缺乏一个关键的构成部分:暗影!
不幸地是,在three.js中衬着暗影不是很简单。这是因为暗影计算上很费成本,我们须要在多个处所激活暗影衬着。起首,你须要告诉衬着器开端衬着暗影:
var renderer = new THREE.WebGLRenderer();renderer.shadowMap.enabled = true;
light.castShadow = true;`
你应当告诉对象投射或者接收暗影。在这种情况下,你将会让球体投射暗影并且用这个平面来接收暗影。
mesh.castShadow = true;mesh.receiveShadow = true;
在设置了这些之后,我们应当开端看场景中的暗影。起首,他们可能效不雅不是很好。您可以经由过程设置光影贴图大年夜小来进步暗影的分辨率。
light.shadow.mapSize.x = 4096;light.shadow.mapSize.y = 4096;
MeshStandardMaterial 有很多属性,例如 roughness 和 metalness 控制外面与光的互相感化。这些属性取值袈溱0到1之间,它们控制着响应的外面行动。增长瞥ゆ材料的粗拙度值到1,使外面看起来更像一个橡胶,作为反射而使其变得模糊。
// material adjustmentsvar planeMaterial = plane.material;planeMaterial.roughness = 1;
renderer.render( scene, camera);
尽管如斯,在本教程中我们不会将其值设为 1 。您可以自由实验值,但可以将其设置为0.65,用于粗拙度和0.75的金属。
planeMaterial.roughness = 0.65;planeMaterial.metalness = 0.75;
尽管如今的场景看起来更有欲望,但仍然很难称之为实际。事实是,在不应用纹理贴图的情况下,很难在三维中建立光致主义。
看代码 learning-threejs-06 by Engin Arslan ( @enginarslan ) on CodePen .
纹理映射
材质贴图是二维图像,可以在材质长进行映射,以供给外面细节。到今朝为止,你只能在外面上获得纯色,但应用纹理贴图,你可以在一个外面上绘制任何你想要的图像。纹理贴图不仅被用来把持外面的色彩信息,并且还可以用来把持外面的其他特点,如反射性、亮度、粗拙度等。
纹理可以大年夜照片来源获得,也可以大年夜草稿中绘制。对于一个在3D情况中有效的纹理,它应当以某种方法被捕获。图像中有反射或暗影,或图像过于扭曲的图像,不会产生很好的纹理贴图。有几个专门的网站在网上寻找纹理。个一一个是 textures.com ,它有一个很好的存档。他们有一些免费的下载选项,但你须要注册才能做到这一点。另一个3D材质的网站是 Megascans ,它的高分辨率,高质量的情况扫描,高质量的产品德量。
我应用了一个名为 mb3d.co.uk 的网站上的例子。这个网站供给了无缝的、免费的纹理。无缝纹理意味着一种纹理,可以在外面上多次反复,而不会在边沿碰到任何不持续性的情况下产生. 这是链接 我用的纹理文件。我已经将图片文件的大年夜小缩小到512px,并应用一个名为 ezgif 的在线办事将图像文件转换为数据URI,以将其作为JavaScript代码的一部分,而不是将其作为零丁的资产加载。(提示:如不雅要应用该办事,不要将标记包含在数据中)
推荐阅读
【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 微办事的重要目标是将本>>>详细阅读
地址:http://www.17bianji.com/lsqh/37523.html
1/2 1

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