无法理解这些UV纹理坐标(范围不是0.0到1.0)


9

我正在尝试将由Google SketchUp 8 Pro生成的简单3D对象绘制到我的WebGL应用程序上,该模型是一个简单的圆柱体。

我打开了导出的文件,并将顶点的位置,索引,法线和纹理坐标复制到一个.json文件中,以便能够在javascript上使用它。除了具有一些非常大的值(例如46.331676和负值)的纹理坐标外,其他所有内容似乎都可以正常工作。现在我不知道我是否错了,但是2D纹理坐标不应该仅在0.0到1.0的范围内吗?

好吧,使用这些纹理坐标绘制模型会给我一种完全怪异的外观,并且只有当我非常接近模型(不是我自己,凸轮)时,我才能正确看到纹理,就像纹理疯狂一样减小尺寸,并在模型的各个面上无限重复。(是的,我在那个纹理包裹物上使用了GL_REPEAT)

我注意到的是,如果获得所有这些坐标并将它们除以10或100,我将获得“正常”外观,但仍不在0.0到1.0范围内。

这是我的json文件:http//pastebin.com/Aa4wvGvv

这是我的GLSL着色器:http : //pastebin.com/DR4K37T9

这是SketchUp导出的.X文件:http : //pastebin.com/hmYAJZWE

我也尝试使用XNA绘制此模型,但仍然无法正常工作。使用此HLSL着色器: http //pastebin.com/RBgVFq08

我尝试将同一模型导出为不同的格式collada,fbx和x。所有这些产生相同的结果。

Answers:


8

您是正确的,UV通常为0-1,尽管正如David X提到的那样,这不是必需的。您的问题是SketchUp生成的UV坐标的频率。例如,如果您的Y轴(V坐标)从0到46,则该纹理(如果启用了环绕效果)将在V方向上重复46次。包装还使其看起来更小,因为您必须在同一表面积上多次复制图像。重新导出为FBX或Collada并不能解决该问题,因为这两种方法都是相同的。要解决此问题,您需要返回SketchUp并更改其为圆柱体生成UV的方式。也许您可以自己指定UV范围,或者可能必须更改几何形状的参数化方式。我从未使用过SketchUp,所以我没有

最后,看起来圆柱体的顶点缠绕可能与立方体相反。图形API(例如OpenGL和DirectX)使用三角形顶点缠绕来确定三角形所面向的方向。这就是他们执行背面剔除的方式-而不是将三角形背向相机而不是优化。对于圆柱体,由于离摄像机最近的三角形朝向错误的方向,因此视图正在朝圆柱体看。同样,这是一个需要在SketchUp中解决的问题,可以通过查看每个三角形的面法线方向(它应该朝外而不是向内)来验证。


1

(纹理坐标绝对可以在0-1之外。)我认为这只是OpenGL有点怪异。IIRC,球体使用的纹理坐标将0-1正方形放置在表面的〜1/16上,如果圆柱体做类似的事情,我也不会感到惊讶。正确地讲,您可能必须编写自己的圆柱体代码,发布适当的纹理坐标。


1

如果希望uv坐标正好在0到1之间,则可以为模型使用比例矩阵。

因此,在加载模型时,可以检查最大的u和v坐标,并创建一个缩放矩阵,使其更“正常”。因此,这将替代您手动设置的10或100。要使其适合,您将需要将uv坐标缩小到[0,1]。

|1/uMax|0     |
|0     |1/vMax|

当然,这只是一种解决方法,您最好找到一种在正确的设置中设置Sketchup的方法(我认为您的导出器或Sketchup本身在这里出错)。但是,如果对您不起作用,请创建您的后加载处理器并保存纹理缩放矩阵。


@Marmix这是一个非常简单,有效且优雅的解决方案!!!
3d-indiana-jones

0

看起来SketchUp并未规范您的纹理坐标,或未使用其自己的指标。将texcoords <0或> 1并使用GL_REPEAT作为纹理包裹意味着,将按比例缩小纹理以适合几何形状,并在水平和垂直方向上重复。

尝试将网格导入另一个建模包(MilkShape,Blender)中,然后从那里修复uv贴图。


4
将texcoords <0或> 1并使用GL_REPEAT作为纹理包裹意味着,将[ 删除错误语句 ]在水平和垂直方向上重复纹理。
Kromster 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.