Three.js纹理贴图

这篇具有很好参考价值的文章主要介绍了Three.js纹理贴图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Three.js入门

Three.js光源

Three.js阴影

Three.js纹理贴图

纹理是一种图像或图像数据,用于为物体的材质提供颜色、纹理、法线、位移等信息,从而实现更加逼真的渲染结果。
纹理可以应用于Three.js中的材质类型,如MeshBasicMaterialMeshLambertMaterialMeshPhongMaterialMeshStandardMaterial等。

UV映射

UV映射是2D图像投影到3D模型的表面以进行纹理映射的3D建模过程(也即把位图贴到3D几何形状的过程或者方法)。在这个过程中,3D模型上的每个顶点都会被赋予一个二维坐标(U, V)。

由于X,Y,Z已经表示模型空间中的3D图形的轴了。所以用U和V分别表示纹理坐标的水平和垂直方向。

顶点UV坐标可以在0~1.0之间任意取值,纹理贴图左下角对应的UV坐标是(0,0),右上角对应的坐标(1,1)

UV映射公式如下:

(u,v) -> (x,y,z)

(u,v)代表纹理上的坐标,(x,y,z)代表几何图形上的点(向量)。

以立方缓冲几何体的一个面为例:
Three.js纹理贴图,three.js,javascript,贴图,开发语言

贴图的左下角(0,0) 映射到几何体的(-1,-1,1);
贴图的左下角(1,0) 映射到几何体的(1,-1,1);
贴图的左下角(0,1) 映射到几何体的(-1,1,1);
贴图的左下角(1,1) 映射到几何体的(1,1,1);

three.js的所有内置的几何体都内置了UV映射,所以开发者不需要担心这个问题。

纹理的使用方法
加载纹理
// 1.
const textureLoader = new THREE.TextureLoader();
// 2.
const texture = textureLoader.load(uv);

const boxGeometry = new THREE.BoxGeometry(2, 2, 2);
const boxMaterial = new THREE.MeshStandardMaterial({
  color: 0xffffff,
  map: texture, // 2.重点位置
});
const boxMesh = new THREE.Mesh(boxGeometry, boxMaterial);
scene.add(boxMesh);

  1. 使用TextureLoader进行加载纹理;
  2. 加载图像并在纹理准备就绪后更新纹理,然后设置给MeshStandardMaterial的map

Three.js纹理贴图,three.js,javascript,贴图,开发语言

纹理变换
  • repeat

我们可以使用 repeat 属性对纹理进行重复显示,repeat 是一个 Vector2 实例,所以可以指定 x y 属性。

texture.repeat.x = 2;
texture.repeat.y = 2;

Three.js纹理贴图,three.js,javascript,贴图,开发语言

默认情况下纹理不会重复(THREE.ClampToEdgeWrapping),最后一个像素被拉伸了,我们需要设置 wrapS 和 wrapT可重复。

texture.wrapS = THREE.RepeatWrapping
texture.wrapT = THREE.RepeatWrapping

Three.js纹理贴图,three.js,javascript,贴图,开发语言

  • wrapSwrapT

上面重复的纹理方向是相同的,可以设置为镜像方向。

texture.wrapS = THREE.MirroredRepeatWrapping
texture.wrapT = THREE.MirroredRepeatWrapping`

Three.js纹理贴图,three.js,javascript,贴图,开发语言

  • offset

我们可以使用 offset 属性对纹理进行重复偏移,repeat 是一个 Vector2 实例,所以可以指定 x y 属性。

texture.offset.x = 0.1;
texture.offset.y = 0.1;
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;

Three.js纹理贴图,three.js,javascript,贴图,开发语言

如果不设置THREE.RepeatWrapping重复,则会出现纹理空白区域。

  • rotation
texture.rotation = Math.PI / 4;

Three.js纹理贴图,three.js,javascript,贴图,开发语言

旋转是弧度,逆时针方向旋转。旋转的点默认是(0,0)这个点

  • center

如果要按照纹理的中心进行旋转,需要修改center

texture.center = new THREE.Vector2(0.5, 0.5);

Three.js纹理贴图,three.js,javascript,贴图,开发语言

  • minFiltermagFilter

可以使用 minFilter 属性来设置纹理图的 minification 缩小过滤器,使用magFilter 属性来设置纹理图的 minification 放大过滤器。

当纹理的像素小于渲染像素时,我们需要将纹理放大;当纹理的像素大于渲染像素时,我们需要将纹理缩小

以放大过滤器为例:

Three.js纹理贴图,three.js,javascript,贴图,开发语言

  • Nearest就是找最近的一个像素点的颜色;
  • Linear 就是根据附近的四个像素点的平均颜色值️;
纹理类型

纹理有很多种类型,接下来我们就来介绍这些不同的纹理。

如果只是测试效果,可以在一些免费的纹理图片网站上去下载。譬如 www.3dtextures.me 等。

本文使用的纹理图片如下:
Three.js纹理贴图,three.js,javascript,贴图,开发语言

颜色纹理

颜色纹理只会将纹理的像素应用在几何体上。它等同于直接在 material 上设置 color 属性,但是 color 属性只能设置一种颜色,而颜色纹理可以为每一个位置设置颜色。

const textureLoader = new THREE.TextureLoader();
const colorTexture = textureLoader.load('path/to/color_texture.jpg');

const material = new THREE.MeshBasicMaterial({
  map: colorTexture // 增加颜色纹理
});

Three.js纹理贴图,three.js,javascript,贴图,开发语言

法线纹理

法线纹理它不会移动顶点,但是它会让光线认为面的朝向不同。所以看起来会有凹凸立体感。

const normalTexture = textureLoader.load('./images/door/normal.jpg');

const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture, // 增加法线纹理
});

Three.js纹理贴图,three.js,javascript,贴图,开发语言

立体视觉效果还是比较明显的

位移纹理

位移纹理是灰度图像,它将移动顶点以创造一些高度。使用高度纹理,你要添加更多的细分网格才能看到效果。

const displacementTexture = textureLoader.load("./images/door/height.jpg");

const planeGeometry = new THREE.PlaneGeometry(3, 3, 16, 16); // 增加网格
const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  displacementMap: displacementTexture,// 增加高度纹理
});

Three.js纹理贴图,three.js,javascript,贴图,开发语言

可以通过displacementScale控制位移的距离。

金属纹理

金属纹理(metalness texture)是灰度图像,将指定哪个部分是金属(白色)和非金属(黑色)。此信息将有助于创造反射,给 material 增加金属质感。

const metalTexture = textureLoader.load("./images/door/metalness.jpg");


const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, // 增加金属纹理
});

Three.js纹理贴图,three.js,javascript,贴图,开发语言

增加金属感,是否有感觉?我没看出来。

粗糙度纹理

粗糙度(rougness texture)经常和金属度纹理一起使用,它也是灰度图,它将指定哪个部分是粗糙的(白色),哪一部分是光滑的(黑色)。

const roughTexture = textureLoader.load("./images/door/roughness.jpg");


const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, 
  roughnessMap: roughTexture, // 增加粗糙度纹理
});

这个例子看不出效果,就不截图了。

环境光遮蔽纹理

环境遮挡纹理(ambient occlusion texture)是灰度图像,它将在表面缝隙中添加假的阴影。虽然它在物理上不准确,但它有助于创建对比度。

const aoTexture = textureLoader.load("./images/door/ambientOcclusion.jpg");

const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, 
  roughnessMap: roughTexture, 
  aoMap: aoTexture, // 增加环境光遮蔽纹理
});

Three.js纹理贴图,three.js,javascript,贴图,开发语言

环境纹理

环境纹理来模拟物体周围的环境光照和反射。环境纹理通常用于创建反射镜面效果或提供全局光照。

  const sphere = new THREE.Mesh(
    new THREE.SphereGeometry(2, 50, 50),
    new THREE.MeshPhysicalMaterial({
      roughness: 0,
      metalness: 0,
      color: 0xffea00,
      envMap: texture, // 设置环境纹理
      transmission: 1,
      ior: 2.3,
    })
  );

Three.js纹理贴图,three.js,javascript,贴图,开发语言

看看这个玻璃球上的效果

重要参考资料:
three.js - Textures & Texture Mapping
Three.js Texture Mapping Tutorial
Texture文章来源地址https://www.toymoban.com/news/detail-646099.html

到了这里,关于Three.js纹理贴图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向Three.js开发者的3D自动纹理化开发包

    DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包,可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词: city, Realistic , cinematic , Front view ,Game scene graph DreamTexture.js 基于 Three.js 和稳定扩散(stable dif

    2024年02月06日
    浏览(53)
  • 【Three.js】Three.js中的纹理—图像应用和属性调整

      Three.js是一种强大的JavaScript库,用于创建基于Web的交互式3D图形和动画。在Three.js中,纹理是一项重要的功能,它允许我们将图像应用到几何体对象上,并通过调整纹理的属性来实现更丰富的视觉效果。 本文将介绍Three.js中的纹理功能,并演示如何将图片作为纹理应用到几何

    2024年02月15日
    浏览(56)
  • HDRI贴图下载及Three.js利用

    最令人兴奋的项目之一是在 Three js 中添加HDRI背景。 HDRI图像是从房间内部或花园、丛林或山脉等开放环境等场景中以 360 度捕获的。 你可以自己创建任何这些图像,但这不是本教程的主题。 相反,我们将从网站获取这些图像之一,并使用轨道控件,让用户能够转动物体并以

    2024年02月06日
    浏览(60)
  • Three.js Tri-panner (三面贴图) 材质 两种实现方式

    介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两种实现方式 自定义shader NodeMaterial 这是threejs新系统充满未来 目前还没有一个完善的文档 并且不太稳定 r132的时候支持这个材质

    2024年01月18日
    浏览(46)
  • 除了three.js,还有许多其他前端开发语言和库可以用于创建3D可视化大屏

    hello老铁们...本人熟悉html5,vue对bootsrap,uniapp,layui,element,vite,antd,echarts,jq响应式尤其擅长,ui设计等技能,如果ui前端工作中有遇到烦恼可私信关注评论我们共同交流进步!谢谢       随着前端技术的飞速发展,3D可视化已经成为许多应用场景中不可或缺的一部分。在

    2024年03月15日
    浏览(72)
  • Three.js 实战【1】—— 3D全景视图开发

    在现代开发过程当中,3D开发是越来越不可或缺的一部门,在前面的文章当中简单的说明了一些threeJs的基础,从这里开始,我们将对ThreeJs整体进行一定的应用。 我们先看一下这篇文章主要要实现的一个demo效果,现如今在第三方租房、买房App、或者百度、高德地图上会出现这

    2024年02月12日
    浏览(50)
  • 3D沉浸式旅游网站开发案例复盘【Three.js】

    Plongez dans Lyon网站终于上线了。 我们与 Danka 团队和 Nico Icecream 共同努力,打造了一个令我们特别自豪的流畅的沉浸式网站。 这个网站是专为 ONLYON Tourism 和会议而建,旨在展示里昂最具标志性的活动场所。观看简短的介绍视频后,用户可以进入城市的交互式风景如画的地图,

    2024年02月12日
    浏览(45)
  • Three.js开发神器-结合3DTiles插件加载倾斜摄影模型

    首先我们通过链接和图片来看看效果 演示Demo链接地址:https://n3gis.github.io/exportToThree(3.0).html?scene=Demo_4 使用到的软件(软件大家到Unity商城上搜索,Unity商城地址:https://assetstore.unity.com) Unity3D 3DTiles(Unity3D插件,用于加载OSGB格式的倾斜摄影数据) Export To Three.js(Unity3D插件,

    2023年04月20日
    浏览(41)
  • Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

            这十年来 web 得到了快速的发展,随着 webgl 的普及,网页的表现能力越来越强大,网页上已经开始可以做出很多复杂的动画和精美的效果,还可以通过 webgl 在网页中绘制高性能的3d图形,别的不说,凡是入门程序员都离不开github这个网站,细心的人都会发现,gi

    2024年02月01日
    浏览(66)
  • THREE.JS使用详细(three.js创建3d物体,three.js的使用方式)

    简述:three.js封装了WebGL的底层细节,是一款运行在浏览器中的 3D 引擎,可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象,目前在Git上已经拥有90k+的star,今天用three.js来构建一个三维模型; 1、首先,在项目中需要下载threejs的相关依赖; 2、在js页面引入使

    2024年01月23日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包