using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class Corner : MonoBehaviour
{
private Mesh m_mesh;
// Use this for initialization
void Start ()
{
m_mesh = GetComponent<MeshFilter>().mesh;
Draw();
}
void Draw()
{
/*
* 管道平面与XY平面平行
* 此处的圆角半径参考的是管道的中轴线
*/
float pipeRadius = 5; // 管道的半径
float roundedRadius = 10; // 转弯的圆角半径
float roundedAngleStart = 0;
float roundedAngleEnd = 90;
int radialSegment = 20; // 管道径向分段
int heightSegment = 20; // 纵向分段
Vector3[][] points = GetCornerPoints(pipeRadius, roundedRadius, roundedAngleStart, roundedAngleEnd, radialSegment, heightSegment);
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
for (int i = 0; i < points.Length; i++)
{
for (int j = 0; j < points[i].Length; j++)
{
vertices.Add(points[i][j]);
if (i >= points.Length - 1)
{
continue;
}
if (j < points[i].Length - 1)
{
triangles.Add(i * radialSegment + j);
triangles.Add(i * radialSegment + j + 1);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add((i + 1) * radialSegment + j + 1);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add(i * radialSegment + j + 1);
}
else
{
triangles.Add(i * radialSegment + j);
triangles.Add(i * radialSegment);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add((i + 1) * radialSegment);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add(i * radialSegment);
}
}
}
m_mesh.SetVertices(vertices);
m_mesh.SetTriangles(triangles, 0);
}
/// <summary>
/// 在XY平面构建圆弧,作为管道的轴心,生成所有顶点
/// </summary>
/// <param name="pipeRadius">管道的半径</param>
/// <param name="roundedRadius">转弯的圆角半径</param>
/// <param name="roundedAngleStart">开始角度</param>
/// <param name="roundedAngleEnd">结束角度</param>
/// <param name="radialSegment">管道径向分段数</param>
/// <param name="heightSegment">纵向分段数</param>
/// <returns></returns>
Vector3[][] GetCornerPoints(float pipeRadius, float roundedRadius, float roundedAngleStart, float roundedAngleEnd, int radialSegment, int heightSegment)
{
Vector3 roundedCenter = Vector3.zero;
Vector3[][] points = new Vector3[heightSegment + 1][];
Vector3 pipeCenter;
int i = 0;
float totalAngle = roundedAngleEnd - roundedAngleStart;
for (float roundedAngle = roundedAngleStart; roundedAngle <= roundedAngleEnd; roundedAngle += totalAngle / heightSegment, ++i)
{
pipeCenter = roundedCenter;
pipeCenter.x = roundedRadius * Mathf.Cos(Mathf.Deg2Rad * (roundedAngle + 90));
pipeCenter.y = roundedRadius * Mathf.Sin(Mathf.Deg2Rad * (roundedAngle + 90));
points[i] = GetOneCircle(pipeCenter, pipeRadius, roundedAngle, radialSegment);
}
return points;
}
/// <summary>
/// 以管道轴心的点作为圆心画YZ平面的圆,作旋转变换后得到这一段圆的顶点
/// </summary>
/// <param name="center">圆心,在轴心上</param>
/// <param name="pipeRadius">半径</param>
/// <param name="roundedAngle">圆角角度</param>
/// <param name="radialSegment">分段</param>
/// <returns>圆圈的点</returns>
Vector3[] GetOneCircle(Vector3 center, float pipeRadius, float roundedAngle, int radialSegment)
{
Vector3[] pointsInACircle = new Vector3[radialSegment];
Vector3 temp;
int i = 0;
for (float pipeAngle = 0; pipeAngle < 360; pipeAngle += 360.0f / radialSegment, ++i)
{
temp = center;
temp.z = center.z + pipeRadius * Mathf.Cos(Mathf.Deg2Rad * pipeAngle);
temp.y = center.y + pipeRadius * Mathf.Sin(Mathf.Deg2Rad * pipeAngle);
Vector3 raiusVec = temp - center;
raiusVec = Quaternion.AngleAxis(roundedAngle, Vector3.forward) * raiusVec;
temp = center + raiusVec;
pointsInACircle[i] = temp;
}
return pointsInACircle;
}
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class Corner : MonoBehaviour
{
private Mesh m_mesh;
// Use this for initialization
void Start ()
{
m_mesh = GetComponent<MeshFilter>().mesh;
Draw();
}
void Draw()
{
/*
* 管道平面与XY平面平行
* 此处的圆角半径参考的是管道的中轴线
*/
float pipeRadius = 5; // 管道的半径
float roundedRadius = 10; // 转弯的圆角半径
float roundedAngleStart = 0;
float roundedAngleEnd = 90;
int radialSegment = 20; // 管道径向分段
int heightSegment = 20; // 纵向分段
Vector3[][] points = GetCornerPoints(pipeRadius, roundedRadius, roundedAngleStart, roundedAngleEnd, radialSegment, heightSegment);
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
for (int i = 0; i < points.Length; i++)
{
for (int j = 0; j < points[i].Length; j++)
{
vertices.Add(points[i][j]);
if (i >= points.Length - 1)
{
continue;
}
if (j < points[i].Length - 1)
{
triangles.Add(i * radialSegment + j);
triangles.Add(i * radialSegment + j + 1);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add((i + 1) * radialSegment + j + 1);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add(i * radialSegment + j + 1);
}
else
{
triangles.Add(i * radialSegment + j);
triangles.Add(i * radialSegment);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add((i + 1) * radialSegment);
triangles.Add((i + 1) * radialSegment + j);
triangles.Add(i * radialSegment);
}
}
}
m_mesh.SetVertices(vertices);
m_mesh.SetTriangles(triangles, 0);
}
/// <summary>
/// 在XY平面构建圆弧,作为管道的轴心,生成所有顶点
/// </summary>
/// <param name="pipeRadius">管道的半径</param>
/// <param name="roundedRadius">转弯的圆角半径</param>
/// <param name="roundedAngleStart">开始角度</param>
/// <param name="roundedAngleEnd">结束角度</param>
/// <param name="radialSegment">管道径向分段数</param>
/// <param name="heightSegment">纵向分段数</param>
/// <returns></returns>
Vector3[][] GetCornerPoints(float pipeRadius, float roundedRadius, float roundedAngleStart, float roundedAngleEnd, int radialSegment, int heightSegment)
{
Vector3 roundedCenter = Vector3.zero;
Vector3[][] points = new Vector3[heightSegment + 1][];
Vector3 pipeCenter;
int i = 0;
float totalAngle = roundedAngleEnd - roundedAngleStart;
for (float roundedAngle = roundedAngleStart; roundedAngle <= roundedAngleEnd; roundedAngle += totalAngle / heightSegment, ++i)
{
pipeCenter = roundedCenter;
pipeCenter.x = roundedRadius * Mathf.Cos(Mathf.Deg2Rad * (roundedAngle + 90));
pipeCenter.y = roundedRadius * Mathf.Sin(Mathf.Deg2Rad * (roundedAngle + 90));
points[i] = GetOneCircle(pipeCenter, pipeRadius, roundedAngle, radialSegment);
}
return points;
}
/// <summary>
/// 以管道轴心的点作为圆心画YZ平面的圆,作旋转变换后得到这一段圆的顶点
/// </summary>
/// <param name="center">圆心,在轴心上</param>
/// <param name="pipeRadius">半径</param>
/// <param name="roundedAngle">圆角角度</param>
/// <param name="radialSegment">分段</param>
/// <returns>圆圈的点</returns>
Vector3[] GetOneCircle(Vector3 center, float pipeRadius, float roundedAngle, int radialSegment)
{
Vector3[] pointsInACircle = new Vector3[radialSegment];
Vector3 temp;
int i = 0;
for (float pipeAngle = 0; pipeAngle < 360; pipeAngle += 360.0f / radialSegment, ++i)
{
temp = center;
temp.z = center.z + pipeRadius * Mathf.Cos(Mathf.Deg2Rad * pipeAngle);
temp.y = center.y + pipeRadius * Mathf.Sin(Mathf.Deg2Rad * pipeAngle);
Vector3 raiusVec = temp - center;
raiusVec = Quaternion.AngleAxis(roundedAngle, Vector3.forward) * raiusVec;
temp = center + raiusVec;
pointsInACircle[i] = temp;
}
return pointsInACircle;
}
}