Hololens——HoloGram之包围盒计算

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/aiyan1111111/article/details/56836980
今日推荐