我正在为我的工具编写自己的uv编辑器,并且正在尝试合并尽可能多的投影算法。我需要获取一个任意网格,并为每个顶点设置uv坐标。

到目前为止,我已经有了平面和最小二乘保形贴图。

我想结合更多的东西,例如三平面的,圆柱的,球形的,但是我很难找到信息来执行算法。三平面看起来会产生颜色,但是我需要使所有内容都处于UV坐标中。

帮助将不胜感激!

最佳答案

三平面

忘了它:它不是投影算法(一种为您提供UV坐标的算法),并且您无法从中获得UV坐标。它是一种渲染算法,为您提供一种颜色,该颜色是通过混合分别使用每个X-Y-Z平面投影将获得的颜色而获得的。

圆柱,球形

像平面一样,它们是非常简单的投影算法,可以直接从XYZ值获得UV值,而无需考虑与其他顶点的连通性。


对于圆柱体:将(x,y,z)转换为Cylindrical Coordinates(ρ,φ,z),并将其用作UV坐标u =φ和v = z
对于球形:在Spherical Coordinates(r,θ,φ)中转换(x,y,z),并将u =θ和v =φ用作UV坐标


当然,您可以将X,Y和Z的角色切换为使用不同的轴进行投影,或者执行一些平移/旋转/缩放以具有更多控制权(与您可以控制所用平面的大小和方向的方法相同)用于平面投影)。

立方体

首先,您需要确定将网格的每个面分配给哪个“投影面”。我将投影面命名为X,-X,Y,-Y,Z和-Z,如下图所示(假设X,Y和Z轴分别具有红色,绿色和蓝色):



为此,您只需找出法线(nx,ny,nz)的哪个坐标具有最大绝对值,然后将其分配给与该轴和符号相对应的面即可。例如:


如果n =(0.8,0.5,0.3),则对应的面为X(| nx |最大,nx为正)
如果n =(0.3,0.8,0.5),则对应的面为Y(| ny |最大,且ny为正)
如果n =(0.3,-0.8,0.5),则对应的面为-Y(| ny |最大,而ny为负)


然后,一旦知道要为网格的每个面分配哪个投影面,就可以将相应的平面投影应用于该面周围的顶点,以获得一个临时值(u_temp,v_temp)∈[0,1] x [0, 1]。

下一步是将该值uv_temp∈[0,1] x [0,1]转换为包含在较小正方形中的值uv,如上面的图像A所示。例如,如果您应用投影“ X”,那么您想要uv∈[2/3,3/3] x [2/4,3/4],则可以这样做:

u = 2./3. + u_temp/3.;
v = 2./4. + v_temp/4.;


最后,最后一步是不要忘记复制属于具有不同平面投影(图片上不同颜色之间的边界)的两个面的UV顶点。实际上,可以(在大多数情况下)可以将网格的某些顶点拆分为UV贴图中的几个位置,以提供体面的结果。

10-08 14:52
查看更多