首页 > 学院 > 开发设计 > 正文

Hololens——HoloGram之包围盒计算

2019-11-08 00:17:52
字体:
来源:转载
供稿:网友

说明:

年前,在学习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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表