Hololens——HoloGram之包围盒计算
说明:
年前,在学习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