在Unity中UV映射过程圆柱体

时间:2019-03-16 13:02:24

标签: unity3d mesh uv-mapping procedural

我有一种方法可以根据包含高度,半径和边数的变量创建圆柱。

网格可以在任意数量的边上生成,但是我真的很难理解应该如何对其进行UV映射。

圆柱的每一侧都是一个由两个三角形组成的四边形。 三角形共享顶点。

我认为uv代码的位置正确,但是我不知道什么值合适? 现在,纹理已在网格的所有侧面拉伸/弯曲。 请帮助我理解这一点。

private void _CreateSegmentSides(float height)
{
    if(m_Sides > 2) { 
        float           angleStep   = 360.0f / (float) m_Sides;
        BranchSegment   seg         = new BranchSegment(m_NextID++);
        Quaternion      rotation    = Quaternion.Euler(0.0f, angleStep, 0.0f);

        int index_tr = 0, index_tl = 3, index_br = 2, index_bl = 1;
        float u0 = (float)1 / (float) m_Sides;
        int max = m_Sides - 1;

        // Make first triangles.
        seg.vertexes.Add(rotation * (new Vector3(m_Radius, height, 0f)));
        seg.vertexes.Add(rotation * (new Vector3(m_Radius, 0f, 0f)));
        seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 1]);
        seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 3]);

        // Add triangle indices.
        seg.triangles.Add(index_tr);    // 0
        seg.triangles.Add(index_bl);    // 1
        seg.triangles.Add(index_br);    // 2
        seg.triangles.Add(index_tr);    // 0
        seg.triangles.Add(index_br);    // 2
        seg.triangles.Add(index_tl);    // 3

        seg.uv.Add(new Vector2(0, 0));
        seg.uv.Add(new Vector2(0, u0));
        seg.uv.Add(new Vector2(u0, u0));
        seg.uv.Add(new Vector2(u0, 0));

        for (int i = 0; i < max; i++)
        {
            seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]);      // new vertex

            seg.triangles.Add(seg.vertexes.Count - 1);  // new vertex
            seg.triangles.Add(seg.vertexes.Count - 2);  // shared
            seg.triangles.Add(seg.vertexes.Count - 3);  // shared

            seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]);      // new vertex

            seg.triangles.Add(seg.vertexes.Count - 3);  // shared
            seg.triangles.Add(seg.vertexes.Count - 2);  // shared
            seg.triangles.Add(seg.vertexes.Count - 1);  // new vertex

            // How should I set up the variables for this part??
            // I know they are not supposed to be zero.
            if (i % 2 == 0) {
                seg.uv.Add(new Vector2(0, 0));
                seg.uv.Add(new Vector2(0, u0));
            } else {
                seg.uv.Add(new Vector2(u0, u0));
                seg.uv.Add(new Vector2(u0, 0));
            }
        }
        m_Segments.Add(seg);
    }
    else
    {
        Debug.LogWarning("Too few sides in the segment.");
    }
}

编辑:添加了图片

这是圆柱体的样子(单边三角形):

enter image description here

这是同一着色器(在平面上)的外观:

enter image description here

编辑2:线框图片

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

所以您的线框是okey(您仅链接了线框,但我要求阴影线框:这是shaded wireframe但它的okey)。

您的纹理之所以看起来像这样,是因为它试图在任何高度上使图像变暗,因此在高度为1m的圆柱体上看起来可能不错,但是在高度为1000m的圆柱体上看起来可能很好,所以您实际上需要动态地遍历这张uv地图。

高度为1m的圆柱的示例,纹理为okey cos,尺寸为1x1: enter image description here

高度2m的圆柱体纹理由于长度2x1尺寸的两倍而被拉伸的示例:

enter image description here

因此,您可以做的是,如果始终生成相同高度的圆柱体,则可以在内部统一调整它,在称为贴图的纹理属性下,只需增加纹理的x或y尺寸,别忘了制作纹理重复自己。 另外,您的气瓶盖应该看起来像这样(不是必须的东西,是的):

enter image description here