Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d UV映射统一的程序圆柱体_Unity3d_Mesh_Uv Mapping_Procedural - Fatal编程技术网

Unity3d UV映射统一的程序圆柱体

Unity3d UV映射统一的程序圆柱体,unity3d,mesh,uv-mapping,procedural,Unity3d,Mesh,Uv Mapping,Procedural,我有一个方法,可以根据包含高度、半径和边数的变量创建圆柱体 网格可以生成任意数量的边,但是我真的很难理解如何进行UV贴图 圆柱体的每一侧是由两个三角形组成的四边形。 三角形共享顶点 我认为uv代码的位置是正确的,但是我不知道什么值是合适的? 现在,纹理在网格的所有侧面都被拉伸/弯曲。 请帮助我理解这一点 private void _CreateSegmentSides(float height) { if(m_Sides > 2) { float

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

网格可以生成任意数量的边,但是我真的很难理解如何进行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.");
    }
}
private void\u侧边(浮动高度)
{
如果(m_边>2){
浮动角度步长=360.0f/(浮动)m_边;
BranchSegment seg=新的BranchSegment(m_NextID++);
四元数旋转=四元数.Euler(0.0f,角度步长,0.0f);
int index_tr=0,index_tl=3,index_br=2,index_bl=1;
浮动u0=(浮动)1/(浮动)m_边;
int max=m_边-1;
//先做三角形。
添加(旋转*(新矢量3(m_半径,高度,0f));
添加(旋转*(新矢量3(m_半径,0f,0f));
添加(旋转*seg.vertexs[seg.vertexs.Count-1]);
添加(旋转*seg.vertexs[seg.vertexs.Count-3]);
//添加三角形索引。
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(新向量2(0,0));
seg.uv.Add(新向量2(0,u0));
分段uv添加(新矢量2(u0,u0));
分段uv添加(新矢量2(u0,0));
对于(int i=0;i
编辑:添加图片

这是圆柱体的外观(单面三角形):

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

编辑2:线框图片

所以你的线框是OK的(你只链接了线框,但我要求使用着色线框:这是一个B,但它是OK的)

你的纹理看起来像这样,是因为它试图沿着任何高度拉伸你的图像,所以它在1米高的圆柱体上看起来不错,但在1000米高的圆柱体上看起来会拉伸,所以你实际上需要动态拉伸这个uv贴图

例如,对于1m高的圆柱体,纹理为okey,因为它是1x1尺寸:

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

所以你可以做的是,如果你总是生成相同高度的圆柱体,你可以在unity内部调整它,在纹理属性中,它被称为平铺,只需增加纹理的x或y维度,别忘了让纹理自身重复。 此外,您的气缸盖应该是这样的(这不是必须的,但是的):

所以你的线框是OK的(你只链接了线框,但我要求使用着色线框:这是一个B,但它是OK的)

你的纹理看起来像这样,是因为它试图沿着任何高度拉伸你的图像,所以它在1米高的圆柱体上看起来不错,但在1000米高的圆柱体上看起来会拉伸,所以你实际上需要动态拉伸这个uv贴图

例如,对于1m高的圆柱体,纹理为okey,因为它是1x1尺寸:

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

所以你可以做的是,如果你总是生成相同高度的圆柱体,你可以在unity内部调整它,在纹理属性中,它被称为平铺,只需增加纹理的x或y维度,别忘了让纹理自身重复。 此外,您的气缸盖应该是这样的(这不是必须的,但是的):


你能提供图片吗?@Menyus添加了picsCan你也提供了着色+线框图片吗?@Menyus添加了线框图片你能提供图片吗?@Menyus添加了picsCan你也提供了着色+线框图片吗?@Menyus添加了线框图片回答。事实上,我的物体并没有那么长或大,所以它有点离题了。我的问题是计算每一侧的正确UV坐标。如果看到前两张图片,则圆柱体的UV计算不正确,因此纹理以奇怪的方式拉伸。我想如果坐标是正确的,它应该看起来非常类似于第二张图片。你能发布一个不透明的着色线框吗?:)(可能只能回答,周日晚上,在gf父母atm)我没有用于播放模式的线框着色器。而且我不能为编辑器同时选择着色和线框,我没有同时选择这两个选项。豪