Javascript threejs-将UV坐标标准化为0和1问题

Javascript threejs-将UV坐标标准化为0和1问题,javascript,typescript,three.js,aframe,uv-mapping,Javascript,Typescript,Three.js,Aframe,Uv Mapping,我有一个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(

我有一个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;
}
专用转换器numbertouv(numb:number){
设转换为0;
如果(麻木<0 | |麻木>1){
如果(numb<0){numb=-numb;}
转换=麻木-数学地板(麻木);
}
否则如果(麻木>1){
转换=麻木-数学地板(麻木)
}
否则{
转化=麻木;
}
转换收益;
}
结果是这样的

但预期的结果是这样的

我哪里错了

@pailhead,我的目标是用标准化的UV点将第一个纹理移植到atlas上。我的问题是,我们是否可以这样做。我将第一个UV坐标标准化为0和1,为了避免“拉伸”效果,我还将纹理重复到第二个图集上,重复次数与“重复”功能相同


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


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

是的,原始纹理是平铺的,坐标从-3到+5,但我将原始纹理粘贴到更大的atlas纹理中。最后一个纹理的坐标从0到1,出于这个动机,我想将平铺坐标转换成新的范围。我不确定这是否应该像这样工作。在着色器中,您可以使用
fract
来调节UV,但取决于UV的布局,它是否索引,我想这会导致奇怪的效果。我想象一堵墙有3段,u值为
[0,1.5,3]
。在此基础上运行您的逻辑将产生
[0,0.5,0]
,这看起来像一个巨大的拉伸,然后是一个回到起点的镜像。还有,你会遇到第二个条件吗?然后我想如果我想粘贴一个重复的纹理到一个更大的图集中(没有重复包装),我必须粘贴这个纹理的重复次数,然后我可以正常化uv点。例如,如果一个纹理重复了5次,我将这个纹理复制到一个地图集上5次。如果我使用0和1的UV坐标,我将实际使用以前重复的所有纹理。我实际上不确定你指的是什么:)想详细说明吗?好的。最后我编辑了我的主要帖子。在这种情况下,threejs似乎没有多大帮助。模型设计为单独加载,而我希望在单个几何体和单个纹理中加载更多。我认为您可能必须使用GLSL才能实现这一点。查看
THREE.ShaderMaterial
Material.onBeforeComile
|0|---|1.5|-|2|--|3| <- a slice through the wall, U axis
|0|-[0.5]-|0||0|