思路:在人物的每一个骨骼上面,添加一个Box,然后每一帧遍历Box,计算出box的8个顶点,然后转换为屏幕坐标。比较所有屏幕坐标,找出最大和最小的x,y。然后就可以根据屏幕坐标绘制gl线框了。
public static float[] MathSreenPoint(Transform[] cube , Camera _camera)
{
List<Vector2> screenpos = new List<Vector2>();
for (int i = 0; i < cube.Length; i++)
{
screenpos.AddRange(WorldCubePoint2Screen(cube[i], _camera));
}
float left = -1;
float right = -1;
float up = -1;
float down = -1;
for (int i = 0; i < screenpos.Count; i++)
{
if (screenpos[i].x > right || right == -1)
{
right = screenpos[i].x;
}
if (screenpos[i].x < left || left == -1)
{
left = screenpos[i].x;
}
if (screenpos[i].y > up || up == -1)
{
up = screenpos[i].y;
}
if (screenpos[i].y < down || down == -1)
{
down = screenpos[i].y;
}
}
return new float[] { up, down, left, right };
}
private static Vector2[] WorldCubePoint2Screen(Transform cube , Camera camera)
{
Transform parent = cube.parent;
cube.parent = null;
Vector3 scale = cube.localScale;
Vector3 cubepoint1 = cube.position + cube.right * scale.x / 2 + cube.up * scale.y / 2 + cube.forward * scale.z / 2;
Vector3 cubepoint2 = cube.position - cube.right * scale.x / 2 + cube.up * scale.y / 2 + cube.forward * scale.z / 2;
Vector3 cubepoint3 = cube.position + cube.right * scale.x / 2 - cube.up * scale.y / 2 + cube.forward * scale.z / 2;
Vector3 cubepoint4 = cube.position + cube.right * scale.x / 2 + cube.up * scale.y / 2 - cube.forward * scale.z / 2;
Vector3 cubepoint5 = cube.position - cube.right * scale.x / 2 - cube.up * scale.y / 2 + cube.forward * scale.z / 2;
Vector3 cubepoint6 = cube.position + cube.right * scale.x / 2 - cube.up * scale.y / 2 - cube.forward * scale.z / 2;
Vector3 cubepoint7 = cube.position - cube.right * scale.x / 2 + cube.up * scale.y / 2 - cube.forward * scale.z / 2;
Vector3 cubepoint8 = cube.position - cube.right * scale.x / 2 - cube.up * scale.y / 2 - cube.forward * scale.z / 2;
cube.parent = parent;
Vector2[] screenpos = new Vector2[8];
screenpos[0] = camera.WorldToScreenPoint(cubepoint1);
screenpos[1] = camera.WorldToScreenPoint(cubepoint2);
screenpos[2] = camera.WorldToScreenPoint(cubepoint3);
screenpos[3] = camera.WorldToScreenPoint(cubepoint4);
screenpos[4] = camera.WorldToScreenPoint(cubepoint5);
screenpos[5] = camera.WorldToScreenPoint(cubepoint6);
screenpos[6] = camera.WorldToScreenPoint(cubepoint7);
screenpos[7] = camera.WorldToScreenPoint(cubepoint8);
return screenpos;
}