zoukankan      html  css  js  c++  java
  • Unity胶囊体的碰撞检测实现

    可选是否打开矩阵变换,支持xyz三种朝向

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class CapsuleDetection : MonoBehaviour
    {
        public enum Axis { X, Y, Z }
        public Transform comparePointTransform;
        public float radius;
        public float height;
        public Axis axis;
        public bool enableMatrix;
    
    
        bool ExecuteDetection()
        {
            if (comparePointTransform == null) return false;
    
            var result = false;
            var axisIndex = (int)axis;
    
            var comparePoint = comparePointTransform.position;
            var pointA = Vector3.zero;
            var pointB = Vector3.zero;
    
            if (enableMatrix)
            {
                comparePoint = transform.InverseTransformPoint(comparePoint);
                pointA[axisIndex] -= height - radius;
                pointB[axisIndex] += height - radius;
            }
            else
            {
                pointA = transform.position;
                pointB = transform.position;
    
                pointA[axisIndex] -= height - radius;
                pointB[axisIndex] += height - radius;
            }
    
            if (comparePoint[axisIndex] < pointA[axisIndex])
            {
                if (Vector3.Distance(comparePoint, pointA) <= radius)
                {
                    result = true;
                }
            }
    
            else if (comparePoint[axisIndex] > pointB[axisIndex])
            {
                if (Vector3.Distance(comparePoint, pointB) <= radius)
                {
                    result = true;
                }
            }
            else
            {
                var tmpPos = enableMatrix ? Vector3.zero : transform.position;
                tmpPos[axisIndex] = comparePoint[axisIndex];
    
                if (Vector3.Distance(comparePoint, tmpPos) <= radius)
                {
                    result = true;
                }
            }
    
            return result;
        }
    
        void OnDrawGizmos()
        {
            var color = Color.blue;
    
            if (ExecuteDetection())
            {
                color = Color.red;
            }
    
            var axisIndex = (int)axis;
            var pos1 = Vector3.zero;
            var pos2 = Vector3.zero;
    
            if (enableMatrix)
            {
                Gizmos.matrix = transform.localToWorldMatrix;
                pos1[axisIndex] -= height;
                pos2[axisIndex] += height;
            }
            else
            {
                pos1 = transform.position;
                pos2 = transform.position;
    
                pos1[axisIndex] -= height;
                pos2[axisIndex] += height;
            }
    
            DebugExtension.DrawCapsule(pos1, pos2, color, radius);
        }
    }
    View Code

    绘制胶囊体使用DebugExtension插件,在资源商店可以免费下载

  • 相关阅读:
    Large-Margin Softmax Loss for Convolutional Neural Networks
    Selective Kernel Network
    A Discriminative Feature Learning Approach for Deep Face Recognition
    recurrent model for visual attention
    rethinking imageNet pre-training
    字符串格式化输出
    HeatMap
    Numpy 多维数组简介
    浅谈JVM(下)
    java线程池总结
  • 原文地址:https://www.cnblogs.com/hont/p/5340044.html
Copyright © 2011-2022 走看看