说明:
年前,在学习Hololens相关知识时,做了一个类似Hololens中微软自行开发的HoloGram程序,大致效果如下:
具体的效果链接视频——链接:http://pan.baidu.com/s/1nuAJVSH 密码:4koe
今天主要写一下这个模型包围盒。
包围盒的制作:
建一个立方体的包围盒预制体,之后通过计算模型的包围盒Positon、Scale,来实例化该包围盒的Posion、Scale
如下所示:
包围盒组成部分包含:
1:一个Unity所创建的Cube,如下所示:
通过双面Shader达到如上的效果,双面Shader如何所示:
-
Shader "Custom/DoubleShader" { -
Properties{ -
_Color("Main Color", Color) = (1,1,1,1)//Tint Color -
_MainTex("Base (RGB)", 2D) = "white" {} -
_MainTex_2("Base (RGB)", 2D) = "white" {} -
} -
SubShader{ -
LOD 100 -
tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" } -
Blend SrcAlpha OneMinusSrcAlpha -
Pass{ -
Cull Front -
Lighting Off -
SetTexture[_MainTex]{ combine texture } -
SetTexture[_MainTex] -
{ -
ConstantColor[_Color] -
Combine Previous * Constant -
} -
} -
Pass -
{ -
Cull Back -
Lighting Off -
SetTexture[_MainTex_2]{ combine texture } -
SetTexture[_MainTex_2] -
{ -
ConstantColor[_Color] -
Combine Previous * Constant -
} -
} -
} -
}
2:八个Untiy创建的cube组成的顶点:
3:12个自己创建的球体(自己创建的球体减少了面数)
程序计算模型包围盒大小
代码如下所示:
-
using UnityEngine; -
/// <summary> -
/// Draw a new MeshBounds -
/// Made By Bruce.XXQQ -
/// </summary> -
public class MeshBounds : MonoBehaviour -
{ -
public Transform target = null; -
Renderer[] renderers; -
void Start() -
{ -
if (target == null) -
target = transform.parent; -
Reset(); -
} -
void Reset() -
{ -
DeleteAllCollider(target); -
var center = GetAllBoundsCenter(target,out renderers); ; -
var bounds = addNewCollider(center, renderers); -
transform.position = bounds.center; -
transform.localScale = bounds.size; -
//update all chirdren localScale -
Vector3 pscale = transform.lossyScale; -
for (int i = 0; i < transform.childCount; i++) -
{ -
Transform s = transform.GetChild(i); -
Vector3 sc = s.lossyScale; -
float max = Mathf.Max(sc.x, sc.y, sc.z); -
s.localScale = new Vector3(max * 1f / pscale.x, max * 1f / pscale.y, max * 1f / pscale.z); -
} -
} -
// delete all collider -
void DeleteAllCollider(Transform transformTarget) -
{ -
Collider[] colliders = transformTarget.GetComponentsInChildren<Collider>(); -
foreach (Collider child in colliders) -
{ -
DestroyImmediate(child); -
} -
} -
//get all Bounds Center -
Vector3 GetAllBoundsCenter(Transform transformTarget,out Renderer[] renders) -
{ -
Vector3 center = Vector3.zero; -
renders = transformTarget.GetComponentsInChildren<Renderer>(); -
foreach (Renderer child in renders) -
{ -
center += child.bounds.center; -
} -
center /= transformTarget.GetComponentsInChildren<Renderer>().Length; -
return center; -
} -
// add a new bounds and Collider -
Bounds addNewCollider(Vector3 center,Renderer[]renders) -
{ -
Bounds bounds = new Bounds(center, Vector3.zero); -
foreach (Renderer child in renders) -
{ -
bounds.Encapsulate(child.bounds); -
} -
// add a new collider -
BoxCollider boxCollider = target.gameObject.AddComponent<BoxCollider>(); -
boxCollider.center = bounds.center - target.position; -
boxCollider.size = bounds.size; -
return bounds; -
} -
}
运行效果如下所示:
测试unitypackage链接:
链接:http://pan.baidu.com/s/1nvtzm6P 密码:pnii