【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2699|回复: 5

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

[复制链接]
发表于 2018-11-23 18:19:13 | 显示全部楼层 |阅读模式
本帖最后由 西北旺 于 2018-11-23 18:19 编辑

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

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


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


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

主要代码如下:
[mw_shl_code=csharp,true]//根据链表创建数组
        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 = VertexList;

            //UV赋值
            if (i % 2 == 0)
            {
                uv = new Vector2(i * 0.5f * 1.0f / (Vertices_Count * 0.5f - 1.0f), 0);
            }
            else
            {
                uv = 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, vertices[i - 1] - vertices).normalized;
                Vector3 temp2 = Vector3.Cross(vertices[i + 1] - vertices, vertices[i + 2] - vertices).normalized;
                Vector3 temp3 = Vector3.Cross(vertices[i - 1] - vertices, vertices[i + 1] - vertices).normalized;
                normals = (temp1 + temp2 + temp3) / 3;
            }
            else if (i % 2 == 1)
            {
                Vector3 temp1 = Vector3.Cross(vertices[i - 1] - vertices, vertices[i - 2] - vertices).normalized;
                Vector3 temp2 = Vector3.Cross(vertices[i + 1] - vertices, vertices[i - 1] - vertices).normalized;
                Vector3 temp3 = Vector3.Cross(vertices[i + 2] - vertices, vertices[i + 1] - vertices).normalized;
                normals = (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;[/mw_shl_code]

效果如下:

效果演示

效果演示

点评

请看x.co/u99(网址) 肺炎,国内报道真实吗?番习土啬看看海外真实报道...... git.io/g7777 (网址)  发表于 2020-6-4 08:04
发表于 2018-11-23 19:48:23 | 显示全部楼层
你这个是不是简单了点~~~一下子估计看不懂吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 08:02

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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