three.js导入3D模型遇到的一些问题

442 阅读3分钟

背景

3D模型下载地址: sketchfab.com/3d-models/o…

sketchfab渲染的

image.png 我渲染的

image.png 两者还是存在很大的差异,革命尚未成功,仍需继续努力。

截止目前遇到并解决了下面这些问题。

问题1: 标准网格材质的颜色贴图map为空,导致模型成黑色

解决方式:

  • 查看下载资源textures目录下,是否有颜色贴图map需要的图片
  • 有的话,使用这些图片自己创建一个纹理贴图
const texture = new THREE.TextureLoader().load( "textures/leaf_old_tree_diffuse.png" );

问题2: 渲染的树干纹理错误

需要设置纹理贴图在水平方向/垂直方向上如何包裹

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

问题3: 渲染出来的叶子不是叶子的形状

如下图所示: 叶子是一个长方形 image.png 此时,我们可以通过设置透明性和透明度或者a测试。

  1. 设置透明度transparent为true,透明度opacity为1。

image.png

  1. 设置a测试为0.5.

image.png

问题4: 模型贴图后,颜色比原始的颜色浅

解决方式是设置颜色贴图的colorSpace如下:

colorMap.colorSpace = THREE.SRGBColorSpace  // 颜色贴图颜色浅的解决方案

知识延伸

材质贴图

  • 颜色贴图 map

    颜色贴图(Color Map)通常指的是纹理贴图(Texture Map),它用于给模型表面添加颜色和细节。颜色贴图是一种图像,其中每个像素的颜色值对应于模型表面上相应点的颜色。

  • 法线贴图 normalMap

  • 凹凸贴图

  • 法线贴图和凹凸贴图的区别

    法线贴图和凹凸贴图都是用于在三维模型表面模拟细节的技术,但它们的实现方式和效果有所不同。

    • 法线贴图(Normal Mapping)* :

      • 原理:法线贴图通过改变模型表面的光照效果来模拟细节。它使用一张纹理贴图来存储每个像素的法线向量信息,这些法线向量决定了光照如何在模型表面反射。
      • 效果:法线贴图可以在不增加模型多边形数量的情况下,为模型表面添加高频率的细节,如凹凸、划痕、皱纹等。它可以让低多边形模型看起来具有高多边形模型的细节。
      • 使用:法线贴图通常与MeshStandardMaterial或MeshPhongMaterial一起使用,以提供更真实的光照效果。
    • 凹凸贴图(Bump Mapping) :

      • 原理:凹凸贴图通过改变模型表面的法线方向来模拟细节。它使用一张灰度图像来存储每个像素的高度信息,这些高度信息用于计算表面的法线方向。
      • 效果:凹凸贴图可以为模型表面添加一些简单的凹凸效果,但它不能像法线贴图那样提供高频率的细节。
      • 使用:凹凸贴图通常与MeshBasicMaterial或MeshLambertMaterial一起使用,因为这些材质不支持法线贴图。

总的来说,法线贴图比凹凸贴图更强大,因为它可以提供更真实的细节和光照效果。但是,法线贴图的计算量也比凹凸贴图大,因此在性能受限的情况下,可能需要使用凹凸贴图来替代。

Texture 纹理

纹理重复方式

texture.wrapS 和 texture.wrapT 属性用于控制纹理在水平(S)和垂直(T)方向上的重复方式。这两个属性可以取以下几种值:

  1. THREE.ClampToEdgeWrapping:纹理在边缘处被夹紧,不会重复。这是默认值。
  2. THREE.RepeatWrapping:纹理在水平和垂直方向上重复。
  3. THREE.MirroredRepeatWrapping:纹理在水平和垂直方向上重复,但在每个重复的边界处镜像。

.flipY : Boolean

如果设置为true,纹理在上传到GPU的时候会进行纵向的翻转。默认值为true