版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aiyan1111111/article/details/56836980
说明:
年前,在学习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