当前位置: 首页 > news >正文

空物体下很多子物体的体积判断并附加对应的碰撞器

需求:在空物体下计算对应的空间体积并附加对应的碰撞器,这个其实是可以手动处理的,代码处理有些不严谨,有些误差挺大的要特殊处理

思路:由于我做的是多个同样物体的空间分布,所以可以直接取X,Y,Z方向的最大距离,然后加上个对应方向的最远物体的两直径,则可获得对应的长宽高,然后赋予boxcollider对应的数值。

1.获取空间最大的距离

    private float MaxDirectionDistant(List<Transform> ChildPos, DirectionEnum direction)
    {
        float maxDistant = 0;
       
        switch (direction)
        {
            case DirectionEnum.Directionx:
        
        if (ChildPos.Count > 0)
        {
            float TempDistant = 0;
            for (int i = 0; i < ChildPos.Count; i++)
            {
                if (ChildPos[i] != null)
                {
                    
                    float posi = ChildPos[i].localPosition.x + 0.01f;
                    float posx = ChildPos[0].localPosition.x + 0.01f;
                    TempDistant = Mathf.Abs(ChildPos[i].localPosition.x - ChildPos[0].localPosition.x);       
                    if (TempDistant > maxDistant)
                    {
                        maxDistant = TempDistant;

                    }
                }

            }
        }  
                break;
            case DirectionEnum.Directiony:

                if (ChildPos.Count > 0)
                {
                    float TempDistant = 0;
                    for (int i = 0; i < ChildPos.Count; i++)
                    {
                        if (ChildPos[i] != null)
                        {
                            float posi = ChildPos[i].localPosition.y + 0.01f;
                            float posx = ChildPos[0].localPosition.y + 0.01f;
                            TempDistant = Mathf.Abs(ChildPos[i].localPosition.y - ChildPos[0].localPosition.y);
                            if (TempDistant > maxDistant)
                            {
                                maxDistant = TempDistant;

                            }
                        }

                    }
                }

                break;
            case DirectionEnum.Directionz:
                if (ChildPos.Count > 0)
                {
                    float TempDistant = 0;
                    for (int i = 0; i < ChildPos.Count; i++)
                    {
                        if (ChildPos[i] != null)
                        {
                            float posi = ChildPos[i].localPosition.z + 0.01f;
                            float posx = ChildPos[0].localPosition.z + 0.01f;
                            TempDistant = Mathf.Abs(ChildPos[i].localPosition.z - ChildPos[0].localPosition.z);
                            if (TempDistant > maxDistant)
                            {
                                maxDistant = TempDistant;

                            }
                        }

                    }
                }
                break; 


        }
       
        return maxDistant;

    }

2.加上对应的两物体的半径,我这里是同类物体,所以我只加第一个物体的直径

 float colliderx = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.x * tempSameMoveChild[0].localScale.x + maxdistantx;
                    collidery = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.y * tempSameMoveChild[0].localScale.y + maxdistanty;
                    float colliderz = tempSameMoveChild[0].GetComponent<MeshFilter>().mesh.bounds.size.z * tempSameMoveChild[0].localScale.z + maxdistantz;

3.赋值给父物体的boxcoollider

tempTransform.gameObject.GetComponent<BoxCollider>().size = new Vector3(colliderx, collidery, colliderz);

 

拓展1.当物体有相应的旋转时,这个值不对,应为mesh的bound获得是物体坐标获得的xyz,而boxcollider对应的空间坐标系。此时的解决方案-成上对应的矩阵变换

拓展2:当物体体积太小或距离太近的时候容易出错-暂时没找到对应的原因。-怀疑是浮点数的影响,可特殊处理

转载于:https://www.cnblogs.com/carsonche/p/6923819.html

相关文章:

  • http://www.onvif.org/onvif/ver20/util/operationIndex.html
  • Hadoop高速入门
  • 对象的初始化过程
  • C# goto
  • 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记
  • Spark RDD概念学习系列之Pair RDD的transformation操作
  • linux 不常用命令及命令组合
  • 面试基础_03实现strcpy、strcat、strcmp、strlen
  • Python学习之路12☞模块与包
  • 移动端页面的适配
  • Sql 列转行字符串
  • 团队冲刺阶段二(八)
  • Oracle解锁scott账户
  • SonarQube Scanner的配置与使用简介
  • 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
  • 【技术性】Search知识
  • JAVA_NIO系列——Channel和Buffer详解
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Spring Boot MyBatis配置多种数据库
  • 半理解系列--Promise的进化史
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云重庆大学大数据训练营落地分享
  • 整理一些计算机基础知识!
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 安徽锐锋科技IDMS系统简介
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Python) SOAP Web Service (HTTP POST)
  • (vue)页面文件上传获取:action地址
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (南京观海微电子)——COF介绍
  • (算法)N皇后问题
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)德国人的记事本
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net和jar包windows服务部署
  • .net实现客户区延伸至至非客户区
  • /*在DataTable中更新、删除数据*/
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /etc/fstab 只读无法修改的解决办法
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @NestedConfigurationProperty 注解用法
  • @RequestMapping处理请求异常
  • [ linux ] linux 命令英文全称及解释
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择