Explication détaillée de Unity Bound

Le contenu sera continuellement mis à jour, veuillez me corriger s'il y a des erreurs, merci !
 

Explication détaillée de Unity Bound
     
TechX insiste pour apporter une technologie innovante au monde !

Vivez une meilleure expérience d'apprentissage - continuez à travailler dur, continuez à vous améliorer, continuez à explorer
TechX ——Cœur pour l'exploration et cœur pour le progrès !

Aide à maîtriser rapidement les limites

, économisant ainsi un temps d'apprentissage précieux pour les débutants et évitant toute confusion !


Insérer la description de l'image ici



1. Aperçu des limites

1. Type de limites


Dans Unity, un cadre de délimitation est une forme géométrique utilisée pour représenter approximativement la plage ou la limite d'un objet ou d'un groupe d'objets dans un espace tridimensionnel. Il s'agit d'une forme simple, généralement un cube ou un rectangle, qui entoure complètement un objet ou un groupe d'objets.

Il existe de nombreux types de boîtes englobantes, notamment :

  • AABB (Axis-Aligned Bounding Box) : Il s'agit d'une boîte englobante orientée avec l'axe des coordonnées et ses six faces sont parallèles à l'axe des coordonnées. AABB est très efficace pour gérer la détection des collisions d'objets, la vérification de la visibilité des objets et l'optimisation simple des limites d'objets.

  • OBB (Oriented Bounding Box) : Il s’agit d’une boîte englobante qui peut pivoter dans la direction de l’objet. Contrairement à AABB, OBB peut tourner librement en fonction de l'orientation de l'objet et entoure donc l'objet avec plus de précision, mais nécessite également plus de calculs.

  • Limites de la sphère : il s'agit d'une sphère qui entoure un objet, souvent utilisée pour la détection de collision ou la vérification de la visibilité des objets. Un cadre de délimitation sphérique n'est peut-être pas la représentation la plus précise des objets de forme irrégulière, mais il constitue une méthode simple et rapide de détection de collision.

2. Attribut de limites


Dans Unity, de nombreux objets ont une propriété Bounds qui décrit le cadre de délimitation de l'objet. Par exemple, les composants tels que Renderer, Collider et Mesh ont tous des propriétés Bounds, qui sont utilisées pour représenter des objets ou des cadres de délimitation pour les objets. Les propriétés de Bounds incluent généralement la position du point central et la taille du cadre de délimitation.

Insérer la description de l'image ici

taille Dimensions du cadre de délimitation, qui décrivent la largeur, la hauteur et la profondeur du cadre de délimitation le long de trois axes (X, Y et Z).
centre Position du point central du cadre de délimitation. Ce point central est le centre géométrique de l'objet ou de l'objet contenu dans le cadre de délimitation.
étendues Représente la moitié de l'attribut size, qui représente la demi-taille avant du cadre de délimitation sur chaque axe.
min (Coordonnées mondiales) Le plus petit point du cadre de délimitation. Cette valeur est toujours égale à l'étendue du centre.
maximum (Coordonnées mondiales) Le point maximum du cadre de délimitation. Cette valeur est toujours égale à centre + étendue.
Point le plus proche (point vectoriel 3) Utilisé pour trouver le point le plus proche d'un point donné sur le cadre de délimitation. Transmettez les coordonnées Vector3 d'un point et renvoyez les coordonnées du point le plus proche du point sur le cadre de délimitation.
Contient (Vector3 points) Vérifie si un point se trouve à l’intérieur du cadre de délimitation. Introduisez un point représenté par les coordonnées Vector3. Si le point se trouve à l'intérieur du cadre de délimitation, renvoie true ; sinon, renvoie false.
Encapsuler (limites des limites) Utilisé pour étendre le cadre de délimitation afin de contenir un autre objet Bounds. En passant un objet Bounds, cette méthode ajustera le cadre de délimitation actuel afin qu'il contienne complètement l'objet Bounds transmis.
Encapsuler (Vector3 points) Utilisé pour étendre le cadre de délimitation pour inclure un point donné. Transmettez les coordonnées Vector3 d'un point qui sera entièrement contenu par le cadre de délimitation.
SetMinMax (Vecteur3 min, Vecteur3 max) Définit le cadre de délimitation en fonction des coordonnées des sommets minimum et maximum. Passez les valeurs de coordonnées Vector3 des sommets minimum et maximum pour redéfinir la position et la taille du cadre de délimitation.
Développer (montant flottant) Ajuste la taille du cadre de sélection en étendant ses dimensions sur chaque axe. En passant un montant à virgule flottante, cette valeur sera ajoutée respectivement à la largeur, à la hauteur et à la profondeur du cadre de délimitation.

2. Des limites dans l’unité

1. Limites du rendu (boîte englobante du rendu)


Le moteur de rendu est un composant qui restitue les graphiques à l'écran. Chaque moteur de rendu possède une propriété Bounds, qui représente le cadre de délimitation du contenu rendu par le moteur de rendu. La boîte englobante est entourée par la fusion de tous les maillages rendus (Mesh) sous ce moteur de rendu. Couramment utilisé pour déterminer la visibilité des objets pour le recadrage de la caméra.

Dessiner les limites du rendu :

public class MyComponent : MonoBehaviour
{
    
    
	//Renderer Bounds为世界坐标
    private Bounds bounds;
	private MeshRenderer renderer;

    void OnDrawGizmos()
    {
    
    
        // 获取物体的 MeshRenderer 组件
        renderer = GetComponent<MeshRenderer>();
        bounds = renderer.bounds;
        
        // 设置 Gizmos 的颜色
        Gizmos.color = Color.green;
        Gizmos.DrawWireCube(bounds.center, bounds.size);
    }
}
  • L'effet du déplacement sur les limites de rendu :

Lorsque l'objet est déplacé, les limites du moteur de rendu seront mises à jour en conséquence pour suivre le mouvement de l'objet. À ce stade, les limites du moteur de rendu se déplaceront également pour garantir des calculs de visibilité corrects.

Insérer la description de l'image ici

  • L'effet de la rotation sur les limites de rendu :

Lorsque l'objet pivote, les limites du moteur de rendu seront mises à jour en conséquence. Contrairement au déplacement, la rotation entraîne une modification de la taille du cadre de sélection, mais celle-ci ne tourne pas lorsque l'objet tourne.

Insérer la description de l'image ici

  • L'effet de la mise à l'échelle sur les limites de rendu :

Lorsque l'objet est mis à l'échelle, les limites du moteur de rendu seront mises à jour en conséquence en fonction de l'échelle. À ce moment, les limites du moteur de rendu seront également mises à l'échelle pour garantir le cadre de délimitation correct.

Insérer la description de l'image ici

2. Limites du collisionneur (boîte englobante du collisionneur)


Collider est un composant utilisé pour détecter les collisions. Différents types de collisionneurs (tels que BoxCollider, SphereCollider, etc.) ont une propriété Bounds, qui représente le cadre de délimitation du collisionneur. Cette boîte englobante est utilisée pour calculer des collisions, déclencher des événements de collision ou effectuer des simulations physiques.

Tracer les limites du collisionneur :

public class MyComponent : MonoBehaviour
{
    
    
	//Collider Bounds为世界坐标
    private Bounds bounds;
	private BoxCollider boxCollider;

    void OnDrawGizmos()
    {
    
    
         //获取物体的 BoxCollider组件
         boxCollider = GetComponent<BoxCollider>();
         bounds = boxCollider.bounds;
        
        // 设置 Gizmos 的颜色
        Gizmos.color = Color.green;
        Gizmos.DrawWireCube(bounds.center, bounds.size);
    }
}
  • L'effet du déplacement sur les limites du collisionneur :

Lorsque l'objet est déplacé, les limites du moteur de rendu seront mises à jour en conséquence pour suivre le mouvement de l'objet. À ce stade, les limites du moteur de rendu se déplaceront également pour garantir des calculs de visibilité corrects.

Insérer la description de l'image ici

  • L'effet de la rotation sur les limites du collisionneur :

Lorsque l'objet pivote, les limites du moteur de rendu seront mises à jour en conséquence. Contrairement au déplacement, la rotation entraîne une modification de la taille du cadre de sélection, mais celle-ci ne tourne pas lorsque l'objet tourne.

Insérer la description de l'image ici

  • Effet de la mise à l'échelle sur les limites du collisionneur :

Lorsque l'objet est mis à l'échelle, les limites du moteur de rendu seront mises à jour en conséquence en fonction de l'échelle. À ce moment, les limites du moteur de rendu seront également mises à l'échelle pour garantir le cadre de délimitation correct.

Insérer la description de l'image ici

3. Limites du maillage (boîte de délimitation de la grille)


Mesh est une collection qui représente la surface d'un objet tridimensionnel, et MeshRenderer est utilisé pour restituer ces maillages. Chaque maillage possède également une propriété Bounds, qui représente le cadre de délimitation du maillage. Cette zone de délimitation est généralement la plus petite zone de délimitation calculée à partir des positions des sommets du maillage et est utilisée pour optimiser le rendu et la détection de collision.

Dessiner des limites de maillage :

public class MyComponent : MonoBehaviour
{
    
    
	//Mesh Bounds为本地坐标
    private Bounds bounds;
	private MeshFilter filter ;

    void OnDrawGizmos()
    {
    
    
          获取物体的 MeshFilter组件
         MeshFilter filter = GetComponent<MeshFilter>();
         bounds = filter.sharedMesh.bounds;
         //将本地坐标转换未为世界坐标
         var centerPoint = transform.TransformPoint(bounds.center);
         bounds = new Bounds(centerPoint, bounds.size);
        
        // 设置 Gizmos 的颜色
        Gizmos.color = Color.green;
        Gizmos.DrawWireCube(bounds.center, bounds.size);
    }
}
  • L'effet du déplacement sur les limites du maillage :

Lorsque l'objet est déplacé, les limites du moteur de rendu seront mises à jour en conséquence pour suivre le mouvement de l'objet. À ce stade, les limites du moteur de rendu se déplaceront également pour garantir des calculs de visibilité corrects.

Insérer la description de l'image ici

  • L'effet de la rotation sur les limites du collisionneur :
  • Effet de la mise à l'échelle sur les limites du collisionneur :

Les limites d'un maillage sont les plus petites boîtes englobantes calculées en fonction des positions de ses sommets lors de la création du maillage. Ce cadre de délimitation est généralement fixé lors de la création du maillage et ne se met pas à jour en temps réel à mesure que l'objet évolue ou pivote.

Par conséquent, lorsque l'objet est mis à l'échelle ou pivoté, les limites du maillage ne seront pas mises à jour en temps réel pour s'adapter à ces changements. Les limites du maillage conservent la forme et la taille de la boîte englobante calculée d'origine même si l'objet est mis à l'échelle ou pivoté.

Insérer la description de l'image ici
Insérer la description de l'image ici

3. La différence entre Bounds et Collider


  • Boîte englobante (OBB) dans Collider :

Les composants Collider créent généralement des zones de collision correspondantes en fonction de la forme de l'objet (par exemple, BoxCollider, SphereCollider, etc.). Les boîtes englobantes utilisées par ces collisionneurs sont généralement des boîtes englobantes orientées (OBB), c'est-à-dire qu'elles peuvent tourner avec la rotation de l'objet et former des zones de collision correspondantes en fonction de la forme de l'objet.

OBB offre une meilleure précision de détection car il peut mieux s'adapter à la forme et à la rotation des objets.

public class MyComponent : MonoBehaviour
{
    
    
	private BoxCollider boxCollider;

    void OnDrawGizmos()
    {
    
    
         //获取物体的 BoxCollider组件
         boxCollider = GetComponent<BoxCollider>();
         
         // 设置 Gizmos 的颜色
         Gizmos.color = Color.green;
         Matrix4x4 rotationMatrix = Matrix4x4.TRS(transform.position, transform.rotation, transform.lossyScale);
         // 根据物体的变换,绘制实时的 Bounds
         Matrix4x4 oldMatrix = Gizmos.matrix;
         Gizmos.matrix = rotationMatrix;
         Gizmos.DrawWireCube(boxCollider.center, boxCollider.size);
         Gizmos.matrix = oldMatrix;
    }
}
  • Boîte englobante (AABB) dans les limites :

Limites Les boîtes englobantes sont généralement des boîtes englobantes non orientées (AABB). Cela signifie qu'il ne tourne pas lorsque l'objet tourne, mais reste toujours orienté le long de l'axe des coordonnées.

AABB est souvent utilisé pour envelopper rapidement un objet, mais peut ne pas envelopper la forme de l'objet avec précision lorsque l'objet pivote, car il s'agit d'un cadre de délimitation fixe le long de l'axe de coordonnées.


4. Calculs associés des limites

1. Calculer les sommets des limites

/// <summary> Bounds顶点 </summary>
/// <param name="bounds"></param>
public Vector3[] DrawBoundBoxLine(Bounds bounds)
{
    
    
    //计算出包围盒8个点
    Vector3 min = bounds.min;
    Vector3 max = bounds.max;
    Vector3[] vertices = new Vector3[8];

    // 计算八个顶点的坐标
    vertices[0] = new Vector3(min.x, min.y, min.z);
    vertices[1] = new Vector3(max.x, min.y, min.z);
    vertices[2] = new Vector3(min.x, min.y, max.z);
    vertices[3] = new Vector3(max.x, min.y, max.z);
    vertices[4] = new Vector3(min.x, max.y, min.z);
    vertices[5] = new Vector3(max.x, max.y, min.z);
    vertices[6] = new Vector3(min.x, max.y, max.z);
    vertices[7] = new Vector3(max.x, max.y, max.z);
	return vertices;
}

2. Développez plusieurs limites

public class MyComponent : MonoBehaviour
{
    
    
	private Bounds bounds;
	
	/// <summary> 扩展Bounds </summary>
	/// <param name="model"></param>
	public Bounds ExtendBound(Transform model)
	{
    
    
		Vector3 center = Vector3.zero;
		Renderer[] renders = model.GetComponentsInChildren<Renderer>();
		
		foreach (Renderer child in renders){
    
    
			center += child.bounds.center;   
		}
		
		center /= model.GetComponentsInChildren<Transform>().Length; 
		Bounds bounds = new Bounds(center,Vector3.zero);
		
		foreach (Renderer child in renders)
		{
    
    
			bounds.Encapsulate(child.bounds);   
		}
		return bounds;
	}
	
	void OnDrawGizmos()
	{
    
    
	    bounds = ExtendBound(transform);
	     设置 Gizmos 的颜色
	    Gizmos.color = Color.green;
	    Gizmos.DrawWireCube(bounds.center, bounds.size);
	}
}




TechX ——Cœur pour l'exploration et cœur pour le progrès !

Chaque chute est une croissance,

chaque effort est un progrès

FIN
Merci de lire ce blog! J'espère que ce contenu vous sera utile. Si vous avez des questions ou des commentaires, ou si vous souhaitez en savoir plus sur ce sujet, n'hésitez pas à laisser un message dans la zone commentaires pour communiquer avec moi. Je serai plus qu'heureux de discuter et de partager du contenu plus intéressant avec vous tous.
Si vous aimez ce blog, aimez-le et partagez-le avec plus d'amis afin que davantage de personnes puissent en bénéficier. En attendant, vous pouvez également suivre mon blog pour obtenir les dernières mises à jour et articles en temps opportun.
Dans les prochains écrits, je continuerai à travailler dur pour partager un contenu plus intéressant et plus pratique. Merci encore pour votre soutien et vos encouragements, et j'ai hâte de vous voir sur le prochain blog !

Je suppose que tu aimes

Origine blog.csdn.net/caiprogram123/article/details/135441086
conseillé
Classement