请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

【技术宅公社】数字艺术论坛   游戏开发 定格动画 动画论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

人人连接登陆

无需注册,直接登录

只需一步,轻松搞定

调查问卷
搜索
www.Exceedu.com视频站即将开放!欢迎投稿!论坛使用专用地址http://forum.exceedu.com/forum

ExceedU@学习圈子在线视频平台与论坛账号现在已经互通,在视频页面注册的朋友在论坛里需要激活!! 通过这个窗口,给我们提意见。我们的数字教程在持续研发当中,感谢大家的关注。

查看: 24|回复: 1

根据轨迹动态绘制片状模型

[复制链接]

该用户从未签到

发表于 2018-11-23 18:19:13 | 显示全部楼层 |阅读模式
一键分享 一键分享
本帖最后由 西北旺 于 2018-11-23 18:19 编辑

unity提供了动态绘制模型的接口,在需要动态建模的程序中,可以利用这个接口,动态绘制出模型。

1.获取组件meshfilter,Mesh mesh=GetComponent<MeshFilter>().mesh;


2.获取模型的轨迹数据,一般为用户层传入;


2.对mesh的顶点数据、索引数据、法线数据、UV数据等赋值,即可按轨迹动态绘制出片状模型;

主要代码如下:
[C#] 纯文本查看 复制代码
//根据链表创建数组
        Vertices_Count = VertexList.Count;

        Vector3[] vertices = new Vector3[Vertices_Count];

        //根据三角形个数创建索引数组
        int triangles_count = Vertices_Count - 2;

        int[] triangles = new int[triangles_count * 3];

        //创建UV数组
        Vector2[] uv = new Vector2[Vertices_Count];

        for (int i = 0; i < Vertices_Count; i++)
        {
            //顶点赋值
            vertices[i] = VertexList[i];

            //UV赋值
            if (i % 2 == 0)
            {
                uv[i] = new Vector2(i * 0.5f * 1.0f / (Vertices_Count * 0.5f - 1.0f), 0);
            }
            else
            {
                uv[i] = new Vector2(i * 0.5f * 1.0f / (Vertices_Count * 0.5f - 1.0f), 1);
            }
        }

        //法线赋值
        Vector3[] normals = new Vector3[Vertices_Count];
        for (int i = 0; i < Vertices_Count; i++)
        {
            //给边缘的四个点及中间的两排顶点分别进行法线赋值
            if (i == 0)
            {
                normals[0] = Vector3.Cross(vertices[1] - vertices[0], vertices[2] - vertices[0]).normalized;
            }
            else if (i == 1)
            {
                Vector3 temp2 = Vector3.Cross(vertices[3] - vertices[1], vertices[2] - vertices[1]).normalized;
                normals[1] = (normals[0] + temp2) * 0.5f;
            }
            else if (i == (Vertices_Count - 1))
            {
                normals[Vertices_Count - 1] = Vector3.Cross(vertices[Vertices_Count - 2] - vertices[Vertices_Count - 1], vertices[Vertices_Count - 3] - vertices[Vertices_Count - 1]).normalized;
            }
            else if (i == (Vertices_Count - 2))
            {
                Vector3 temp1 = Vector3.Cross(vertices[Vertices_Count - 2] - vertices[Vertices_Count - 1], vertices[Vertices_Count - 3] - vertices[Vertices_Count - 1]).normalized;
                Vector3 temp2 = Vector3.Cross(vertices[Vertices_Count - 4] - vertices[Vertices_Count - 2], vertices[Vertices_Count - 3] - vertices[Vertices_Count - 2]).normalized;
                normals[Vertices_Count - 2] = (temp1 + temp2) * 0.5f;
            }
            else if (i % 2 == 0)
            {
                Vector3 temp1 = Vector3.Cross(vertices[i - 2] - vertices[i], vertices[i - 1] - vertices[i]).normalized;
                Vector3 temp2 = Vector3.Cross(vertices[i + 1] - vertices[i], vertices[i + 2] - vertices[i]).normalized;
                Vector3 temp3 = Vector3.Cross(vertices[i - 1] - vertices[i], vertices[i + 1] - vertices[i]).normalized;
                normals[i] = (temp1 + temp2 + temp3) / 3;
            }
            else if (i % 2 == 1)
            {
                Vector3 temp1 = Vector3.Cross(vertices[i - 1] - vertices[i], vertices[i - 2] - vertices[i]).normalized;
                Vector3 temp2 = Vector3.Cross(vertices[i + 1] - vertices[i], vertices[i - 1] - vertices[i]).normalized;
                Vector3 temp3 = Vector3.Cross(vertices[i + 2] - vertices[i], vertices[i + 1] - vertices[i]).normalized;
                normals[i] = (temp1 + temp2 + temp3) / 3;
            }
        }

        meshfront.vertices = vertices;
        meshfront.normals = normals;
        meshfront.uv = uv;

        //给索引赋值
        int j = 0;
        for (int i = 0; i < triangles_count * 0.5; i++)
        {
            triangles[j++] = 2 * i + 0;
            triangles[j++] = 2 * i + 1;
            triangles[j++] = 2 * i + 2;

            triangles[j++] = 2 * i + 3;
            triangles[j++] = 2 * i + 2;
            triangles[j++] = 2 * i + 1;
        }

        meshfront.triangles = triangles;

效果如下:

效果演示

效果演示

回复

使用道具 举报

  • TA的每日心情
    红包
    2018-4-20 09:51
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2018-11-23 19:48:23 | 显示全部楼层
    你这个是不是简单了点~~~一下子估计看不懂吧
    *滑动验证:
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册 人人连接登陆

    本版积分规则

    申请友链|小黑屋|手机版|ExceedU数字艺术 ( 沪ICP备14023054号  

    GMT+8, 2018-12-13 00:36

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表