【问题标题】:Three js facevertex uv map triangles: how to scale 1 direction only三个js facevertex uv贴图三角形:如何只缩放1个方向
【发布时间】:2018-08-05 10:10:00
【问题描述】:

我目前有一个基于 Doob 先生教程示例的城市:"How to do a procedural city in 100 lines"。在本教程中,您可以看到他创建了 100 个建筑网格,然后出于性能原因将这些网格合并到 1 个城市网格中。然后制作一种应用于城市网格的材料,为每个建筑物提供纹理。

我要停止的是建筑纹理的夹紧和拉伸。为了营造更逼真的“不同建筑物的窗户高度相同”的外观。

我认为解决方案是使用几何体的缩放值来操纵面顶点 UV。

使用以下代码,我可以将纹理缩放 2 倍。

  let faceVertexUvs = buildingMesh.geometry.faceVertexUvs[0];
  for (let k = 0; k < faceVertexUvs.length; k++) {
    const uvs = faceVertexUvs[k];
    if ( k == 4 || k == 5){
      // Make the roof blank
      uvs[0].set(0, 0);
      uvs[1].set(0, 0);
      uvs[2].set(0, 0);
    }
    else if( k % 2 == 0) {
      uvs[0].set(0, 0.5);
      uvs[1].set(0, 0);
      uvs[2].set(0.5, 0.5);
    }
    else {
      uvs[0].set(0, 0);
      uvs[1].set(0.5, 0);
      uvs[2].set(0.5, 0.5);
    }
  }

但是,我只想垂直缩放,而不要单独进行水平缩放。但我并不完全理解这两个三角形之间的关系。

【问题讨论】:

    标签: javascript three.js textures uv-mapping


    【解决方案1】:

    也许您应该修改城市模型纹理的.repeat 属性。 文档链接:https://threejs.org/docs/#api/textures/Texture.repeat

    【讨论】:

    • 好的,但是相同的纹理应用于整个城市网格。因此,400 单位(?)高的建筑物与 10 单位高的建筑物具有相同的纹理缩放(窗户数量)。因此,我需要一些可以应用于每个单独的建筑网格的东西。
    • 啊,你是对的。因此,唯一的方法是更改​​每栋建筑物的 UV。但是city demo太老了,CubeGeometry被BoxGeometry弃用了,而且源码有点复杂,或许可以设置一些顶点颜色,用checker贴图调试index和uvs信息。
    • 使用调试纹理并猜测需要更改哪些值我解决了我的问题。谢谢!
    【解决方案2】:

    使用调试图像并猜测一些值后,我使用以下代码来垂直、水平或同时缩放纹理。

      let scale_y = buildingMesh.scale.y/200;
      let scale_x = buildingMesh.scale.x/100;
    
      for (let k = 0; k < faceVertexUvs.length; k++) {
        const uvs = faceVertexUvs[k];
        else if( k % 2 == 0) {
          uvs[0].set(0, texture_scale_y);                 // 0 1
          uvs[1].set(0, 0);                               // 0 0
          uvs[2].set(texture_scale_x, texture_scale_y);   // 1 1
        }
        else {
          uvs[0].set(0, 0);                               // 0 0
          uvs[1].set(texture_scale_x, 0);                 // 1 0
          uvs[2].set(texture_scale_x, texture_scale_y);   // 1 1
        }
      }
    

    这解决了我的问题,但我仍然想知道解释。我可以看到 X 总是第一个,Y 总是第二个,但这可能是一个不好的结论。

    我无法为我的顶点着色,所以我无法分辨哪个顶点是哪个。

    【讨论】:

    • 我认为如果您避免将“uvs”重命名为“faces”,您的代码将是可以理解的。改为:let faceVertexUvs = buildingMesh.geometry.faceVertexUvs[ 0 ];uvs = faceVertexUvs[ k ]; and uvs[0].set(0, scale_y);
    • 采取和实施的观点。你知道两个三角形的 UV 之间的关系吗?例如,哪些顶点是“共享”顶点,哪些是不共享的。
    • 在线框中渲染BoxGeometry 以查看三角形。尝试做一些实验。
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多