美文网首页
ARCar项目第二节课应完成代码

ARCar项目第二节课应完成代码

作者: 三斤耳朵 | 来源:发表于2019-04-29 20:30 被阅读0次

    各位对项目感兴趣的看官请移步,这里没有各位需要的代码,本内容仅做阶段记录用。

    基类PrimitiveBase

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /*
     * #AuthorName#
     * #UpdateTime#
     */
    //要求组件
    [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
    [ExecuteInEditMode]
    public class PrimitiveBase : MonoBehaviour {
        //定义平面的初始化位置
        public Vector3 offset;
        //MeshFilter
        protected MeshFilter meshFilter;
        //定义mesh网格的纹理坐标数组
        protected Vector2[] uvs;
        //定义mesh网格的三角形顶点索引数组
        protected int[] triangles;
        //定义mesh网格的顶点数据数组
        protected Vector3[] vertices;
    
        //唤醒
        private void Awake()
        {
            //创建对象其他相关属性
            Init();
        }
        void Init()
        {
            //需要对象的MeshFilter
            meshFilter = GetComponent<MeshFilter>();
            //需要对象空Mesh
            meshFilter.sharedMesh = new Mesh();
        }
    
        protected virtual void InitMesh() { }
        protected virtual void UpdateShape() { }
    
        protected void UpdateMesh()
        {
            if (meshFilter.sharedMesh == null)
            {
                meshFilter.sharedMesh = new Mesh();
            }
            meshFilter.sharedMesh.vertices = vertices;
            meshFilter.sharedMesh.triangles = triangles;
            meshFilter.sharedMesh.uv = uvs;
        }
    
        //当面板内容改动时,就会自动调用这个方法
        private void OnValidate()
        {
            InitMesh();
        }
    }
    

    矩形线条RectMesh

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /*
     * #AuthorName#
     * #UpdateTime#
     */
    
    public class RectMesh : PrimitiveBase
    {
        
        //定义平面的宽和长
        public float m_Width;
        public float m_Length;
        
        //锚点类型枚举
        public enum PirotAlign
        {
            Left,
            Center,
            Right
        }
        //初始化锚点
        public PirotAlign widthAlign = PirotAlign.Center;
        public PirotAlign lengthAlign = PirotAlign.Center;
    
        //创建Mesh
        protected override void InitMesh()
        {
            uvs = new Vector2[4];
            uvs[0].x = 0;
            uvs[0].y = 0;
            uvs[1].x = 1;
            uvs[1].y = 0;
            uvs[2].x = 0;
            uvs[2].y = 1;
            uvs[3].x = 1;
            uvs[3].y = 1;
    
            triangles = new int[] { 0, 2, 3, 0, 3, 1 };
    
            UpdateShape();
        }
    
        protected override void UpdateShape()
        {
            vertices = new Vector3[4];
            Vector3 localPos = offset;
            float w2 = m_Width * 0.5f;
            float l2 = m_Length * 0.5f;
    
            switch (widthAlign)
            {
                case PirotAlign.Left:
                    vertices[0].x = localPos.x;
                    vertices[1].x = localPos.x + w2;
                    vertices[2].x = localPos.x;
                    vertices[3].x = localPos.x + w2;
                    break;
                case PirotAlign.Center:
                    vertices[0].x = localPos.x - w2;
                    vertices[1].x = localPos.x + w2;
                    vertices[2].x = localPos.x - w2;
                    vertices[3].x = localPos.x + w2;
                    break;
                case PirotAlign.Right:
                    vertices[0].x = localPos.x - w2;
                    vertices[1].x = localPos.x ;
                    vertices[2].x = localPos.x - w2;
                    vertices[3].x = localPos.x ;
                    break;
            }
    
            switch (lengthAlign)
            {
                case PirotAlign.Left:
                    vertices[0].z = localPos.z;
                    vertices[1].z = localPos.z;
                    vertices[2].z = localPos.z + l2;
                    vertices[3].z = localPos.z + l2;
                    break;
                case PirotAlign.Center:
                    vertices[0].z = localPos.z - l2;
                    vertices[1].z = localPos.z - l2;
                    vertices[2].z = localPos.z + l2;
                    vertices[3].z = localPos.z + l2;
                    break;
                case PirotAlign.Right:
                    vertices[0].z = localPos.z - l2;
                    vertices[1].z = localPos.z - l2;
                    vertices[2].z = localPos.z;
                    vertices[3].z = localPos.z;
                    break;
            }
            
            vertices[0].y = vertices[1].y = vertices[2].y = vertices[3].y = localPos.y;
    
            UpdateMesh();
        }
    }
    

    弧形线条

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /*
     * #AuthorName#
     * #UpdateTime#
     */
    /// <summary>
    /// 我们在这里先设计圆环的mesh,注意继承PrimitiveBase
    /// </summary>
    public class RingMesh : PrimitiveBase {
        //我们先来看绘制的基本概念,我们想要的是圆环,首先要确定分割面
        public int segment = 1;
        //创建Mesh
        protected override void InitMesh()
        {
            //确保分割面数量大于0
            segment = segment > 0 ? segment : 1;
            //然后是uv顶点
            //如果是我们刚才的分割方式,应该有多少顶点,分割面数
            int vertexCount = segment * 2 + 2;
            uvs = new Vector2[vertexCount];
            //然后是顶点二维坐标
            //假设我们分割了segment数量的面,那么我们的uv顶点如下
            float singleUV = 1f / segment;
            float uvY = 0f;
            for (int i = 0; i < vertexCount; i+=2)
            {
                uvs[i].x = 0f;
                uvs[i + 1].x = 0f;
                uvs[i].y = uvY;
                uvs[i+1].y = uvY;
                uvY += singleUV;
            }
    
    
            //然后是三角形顶点
            //从矩形思考triangles = new int[] { 0, 2, 3, 0, 3, 1 };
            triangles = new int[segment * 2 * 3];
            //我们需要创建若干顶点序列
            for (int i = 0; i < segment; i++)
            {
                int k = i * 6;
                int j = i * 2;
                triangles[k] = j;
                triangles[k+1] = j + 2;
                triangles[k+2] = j + 3;
                triangles[k+3] = j;
                triangles[k+4] = j + 3;
                triangles[k+5] = j + 1;
            }
            UpdateShape();
        }
    

    相关文章

      网友评论

          本文标题:ARCar项目第二节课应完成代码

          本文链接:https://www.haomeiwen.com/subject/mcwunqtx.html