作家
登录

基于web创建逼真的3D图形 | CSS技巧

作者: 来源: 2017-09-19 15:04:17 阅读 我要评论

为了可以或许显示你衬着的结不雅,你须要将衬着器的 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的优化之路,抓紧时光哦! 微办事的重要目标是将本>>>详细阅读


本文标题:基于web创建逼真的3D图形 | CSS技巧

地址:http://www.17bianji.com/lsqh/37523.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)