【问题标题】:threejs - normalize UV coordinates to 0 and 1 issuethreejs - 将 UV 坐标标准化为 0 和 1 问题
【发布时间】:2018-09-30 02:19:22
【问题描述】:

我有一个 UV 坐标小于 0 且大于 1 的模型。我试图将这些坐标归一化到 0 和 1 范围内,但结果很差。 目前我正在使用此功能将任何 UV 坐标转换为我的目标范围

private convertNumberToUV(numb:number) {
    let converted = 0;

    if(numb < 0 || numb > 1) {
      if(numb < 0){ numb = -numb; }
      converted = numb - Math.floor(numb);
    }
    else if(numb > 1){
      converted = numb - Math.floor(numb)
    }
    else {
      converted = numb;
    }


    return converted;
}

结果是这样的

但预期的结果是这样的

我哪里错了?

@pailhead,我的目标是将第一个纹理移植到具有标准化 UV 点的图集上。我的问题是是否可以以这种方式工作。我将第一个 UV 坐标标准化为 0 和 1,为了避免“拉伸”效果,我还将纹理重复到第二个图集上的次数等于使用“重复”函数所做的次数

【问题讨论】:

  • 是的,原始纹理是平铺的,坐标从 -3 到 +5,但我将原始纹理粘贴到更大的图集纹理中。最后一个纹理的坐标从 0 到 1,为此我想将平铺坐标转换为新范围
  • 我不确定这是否应该像这样工作。在着色器中,您可以使用fract 来调制 uv,但取决于它们的布局方式,它是否被索引,我想这会导致奇怪的效果。我想一堵墙有 3 段,u 值为[0,1.5,3]。对此运行您的逻辑将产生[0,0.5,0],这看起来像是一个很大的延伸,然后是一个镜像回到开始。另外,你会达到第二个条件吗?

标签: javascript typescript three.js aframe uv-mapping


【解决方案1】:

想象你有一堵带窗户的墙,它是平面映射的。它被缩放,使得一个角在 UV(0,0) 处,另一个在 UV(3,1) 处。让我们只关注 U 维度,并观察窗口在哪里。一条边在 U(1.5),另一条可以在 U(2)。

|0|---|1.5|-|2|--|3| <- a slice through the wall, U axis

如果我们将砖纹理映射到此,并设置myTexture.wrapS = THREE.RepeatWrapping,砖将均匀分布在墙上并在此过程中重复 3 次。

如果你按照你的方式调制这些紫外线,你最终会得到这样的结果

|0|-[0.5]-|0||0|

这会产生毫无意义但可预测的结果。纹理的左半部分将一直延伸到窗口。然后在窗户下方和上方,它会显示相同的一半,但相反,墙的剩余部分将仅显示水平线,没有砖纹理,因为它被拉伸到无穷大。

【讨论】:

  • 那么我认为如果我想将重复的纹理粘贴到更大的图集中(没有 RepeatWrapping)我必须粘贴这个纹理重复的次数,然后我可以标准化 uv 点。例如,如果一个纹理重复了 5 次,并且此时我将此纹理复制 5 次到图集上,如果我使用 0 和 1 的 UV 坐标,我实际上将使用之前重复的所有纹理
  • 我实际上不确定你指的是什么 :) 需要详细说明吗?
  • 好的。我最后编辑了我的主要帖子。在这种情况下,threejs 似乎没有太大帮助。这些模型被设计为单独加载,而我想在单个几何体和单个纹理中加载更多
  • 我认为您可能必须使用 GLSL 才能实现这一目标。
  • 查看THREE.ShaderMaterialMaterial.onBeforeCompile
猜你喜欢
  • 2017-11-25
  • 2013-10-18
  • 2014-10-22
  • 2019-01-07
  • 2012-07-18
  • 2020-03-08
  • 1970-01-01
  • 2015-09-09
  • 2012-05-09
相关资源
最近更新 更多