u3d mesh的组织方法 ,u3d 默认的mesh构造方法是三角形,即index指向三个点,那么这三个点就会被连接成三角形,
那么之前必须先申请很多点,uv,法线,然后设置点,index即可,有一点需要注意就是 ,u3d里面必须逆时针绘制才会显示面,否则不显示,以下代码先记录
using UnityEngine; using System.Collections; public class LiDiBoxOne : MonoBehaviour { private GameObject TObj; public Material Tmeterial; public float THeight; private Mesh teMesh; private int MNUMPOINT = 12100; private Vector3[] vertex; private Vector2[] uvs; private int[] trangles; private Vector4[] tangents; private Vector3 m_OldPos; private Vector3 m_OldLeftPos; private Vector3 m_OldRightPos; private int m_Step; // Use this for initialization void Start() { m_Step = 0; m_OldPos = new Vector3(0, 0, 0); TObj = new GameObject(); TObj.name = "abc"; TObj.transform.position = new Vector3(0, 0, 0); vertex = new Vector3[MNUMPOINT]; uvs = new Vector2[MNUMPOINT]; tangents = new Vector4[MNUMPOINT]; trangles = new int[MNUMPOINT *12]; TObj.gameObject.AddComponent<MeshFilter>(); TObj.gameObject.AddComponent("MeshRenderer"); if (Tmeterial) TObj.renderer.material = Tmeterial; else TObj.renderer.material.color = Color.white; teMesh = new Mesh(); } // Update is called once per frame void Update() { LidiNewAction(); } void LidiOldAction() { Vector3 mTempPositionCar = this.transform.position; Vector3 mTempPosition = new Vector3(mTempPositionCar.x, THeight, mTempPositionCar.z); if (Vector3.Distance(m_OldPos, mTempPosition) > 4.0f) { Vector3 m_leftstep = this.transform.right * 4.50f; Vector3 m_left = mTempPosition - m_leftstep; Vector3 m_right = mTempPosition + m_leftstep; float PointDis; for (int j = 0; j < 2; ++j) { if (j == 0) { vertex[m_Step * 2 + j] = new Vector3(m_left.x, THeight, m_left.z); PointDis = 0; uvs[m_Step * 2 + j] = new Vector2(0.0f, m_Step); m_OldLeftPos = new Vector3(m_left.x, THeight, m_left.z); } else { vertex[m_Step * 2 + j] = new Vector3(m_right.x, THeight, m_right.z); uvs[m_Step * 2 + j] = new Vector2(1.0f, m_Step); m_OldRightPos = new Vector3(m_right.x, THeight, m_right.z); } tangents[m_Step * 2 + j] = new Vector4(0, 1, 0, 1); } if (m_Step > 0) { int ggtemp = m_Step - 1; trangles[ggtemp * 6 + 0] = ggtemp * 2; trangles[ggtemp * 6 + 1] = ggtemp * 2 + 2; trangles[ggtemp * 6 + 2] = ggtemp * 2 + 1; trangles[ggtemp * 6 + 3] = ggtemp * 2 + 2; trangles[ggtemp * 6 + 4] = ggtemp * 2 + 3; trangles[ggtemp * 6 + 5] = ggtemp * 2 + 1; } teMesh.vertices = vertex; teMesh.uv = uvs; teMesh.triangles = trangles; teMesh.RecalculateNormals(); teMesh.RecalculateBounds(); teMesh.tangents = tangents; TObj.GetComponent<MeshFilter>().mesh = teMesh; m_Step++; m_OldPos = mTempPosition; } } void LidiNewAction() { Vector3 mTempPosition = this.transform.position; Vector3 m_leftstep = this.transform.right * 6.50f; Vector3 m_leftPos = mTempPosition - m_leftstep; Vector3 m_rightPos = mTempPosition + m_leftstep; float disleft = Vector3.Distance(m_leftPos, m_OldLeftPos); float disright = Vector3.Distance(m_rightPos, m_OldRightPos); if (disleft > 1.5250f || disright > 1.525f) { for (int j = 0; j < 3; ++j) { if (j == 0) { vertex[m_Step * 3 + j] = new Vector3(m_leftPos.x, THeight, m_leftPos.z); uvs[m_Step * 3 + j] = new Vector2(0.0f, m_Step *0.25f); } if (j == 1) { vertex[m_Step * 3 + j] = new Vector3(mTempPosition.x, THeight, mTempPosition.z); uvs[m_Step * 3 + j] = new Vector2(0.5f, m_Step *0.25f); } if (j == 2) { vertex[m_Step * 3 + j] = new Vector3(m_rightPos.x, THeight, m_rightPos.z); uvs[m_Step * 3 + j] = new Vector2(1.0f, m_Step *0.25f); } // tangents[m_Step * 2 + j] = new Vector4(0, 1, 0, 1); } if (m_Step > 0) { int ggtemp = m_Step - 1; trangles[ggtemp * 12 + 0] = ggtemp * 3; trangles[ggtemp * 12 + 1] = ggtemp * 3 + 3; trangles[ggtemp * 12 + 2] = ggtemp * 3 + 4; trangles[ggtemp * 12 + 3] = ggtemp * 3 + 0; trangles[ggtemp * 12 + 4] = ggtemp * 3 + 4; trangles[ggtemp * 12 + 5] = ggtemp * 3 + 1; trangles[ggtemp * 12 + 6] = ggtemp * 3 + 1; trangles[ggtemp * 12 + 7] = ggtemp * 3 + 4; trangles[ggtemp * 12 + 8] = ggtemp * 3 + 2; trangles[ggtemp * 12 + 9] = ggtemp * 3 + 2; trangles[ggtemp * 12 + 10] = ggtemp * 3 + 4; trangles[ggtemp * 12 + 11] = ggtemp * 3 + 5; } teMesh.vertices = vertex; teMesh.uv = uvs; teMesh.triangles = trangles; teMesh.RecalculateNormals(); teMesh.RecalculateBounds(); teMesh.tangents = tangents; TObj.GetComponent<MeshFilter>().mesh = teMesh; m_Step++; m_OldLeftPos = m_leftPos; m_OldRightPos = m_rightPos; m_OldPos = mTempPosition; } } }
时间: 2024-10-24 03:24:35