碰撞检测算法——分离轴算法实现(一)

news2024/9/28 3:30:41

       在实现分离轴算法前,需要做一些准备工作,在Unity中实现自定义多边形的显示,以及获取多边形的顶点和边的数据。

1.实现自定义多边形显示

        Unity中MeshFilter是负责处理Mesh(网格)的信息的引用,MeshRender是渲染MeshFilter中引用的网格,自定义网格需要同过这两个组件来显示。有了显示组件,下面就需要来生成我们需要的多边形mesh,mesh的生成是通过顶点生成三角形,然后三角形连接起来组成需要的Mesh。例如:在原点通过三个点生成一个三角形,

生成结果:

代码如下:

public void CreateTriangle()
{
    MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
    meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

    MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();

    Mesh mesh = new Mesh();

    Vector3[] vertices = new Vector3[3]
   {
        new Vector3(.5f ,  0, 0),
        new Vector3(-.5f, 0, 0),
        new Vector3(0,  .5f , 0)
   };

    mesh.vertices = vertices;

    int[] tris = new int[3]
    {
        // 左下方三角形
        1,2,0
    };
    mesh.triangles = tris;

    Vector3[] normals = new Vector3[3]
    {
        Vector3.forward,
        Vector3.forward,
        Vector3.forward,

    };
    mesh.normals = normals;

    Vector2[] uv = new Vector2[3]
    {
        new Vector2(.5f * width, 0),
        new Vector2(-.5f * width, 0),
        new Vector2(.5f * width, .5f * height)
    };
    mesh.uv = uv;

    base.meshFilter.mesh = mesh;

       有了生成形状的逻辑,还需要获取顶点数据和边数据的脚本,而这些逻辑都是所有形状共有的,所以可以将这些逻辑都封装到一个Polygon的脚本中。

  首先要提供一个更新顶点位置的方法,因为物体不是固定不变的。

public void UpdatePointInfo()
{
    points.Clear();
    //获取所有顶点
    Vector3[] v = meshFilter.sharedMesh.vertices;

    for (int i = 0; i < v.Length; i++)
    {
        //将顶点转换到世界坐标
        Vector3 vn = this.gameObject.transform.TransformPoint(v[i]);
        points.Add(vn);
    }
}

 然后还需要再顶点位置变了以后,边的信息也将改变,因此还需要有个建立边信息的方法。

public void BuildEdges()
{
    Vector2 p1;
    Vector2 p2;
    edges.Clear();
    for (int i = 0; i < points.Count; i++)
    {
        p1 = points[i];
        if (i + 1 >= points.Count)
        {
            p2 = points[0];
        }
        else
        {
            p2 = points[i + 1];
        }
        edges.Add(p2 - p1);
    }
}

2.创建矩形

矩形的草图如图所示:

创建矩形需要两个三角形,一共需要6个顶点,但是其中有两个顶点可以共用,所以四个顶点就足够了。

代码:

   public void CreteRectangle()
   {
       MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
       meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

       meshFilter = gameObject.GetComponent<MeshFilter>();

       Mesh mesh = new Mesh();

       Vector3[] vertices = new Vector3[4]
       {
           new Vector3(.5f, -.5f , 0),
           new Vector3(.5f,  .5f , 0),
           new Vector3(-.5f, -.5f , 0),
           new Vector3(-.5f,  .5f , 0)
       };
       mesh.vertices = vertices;

       int[] tris = new int[6]
       {
           // 左下方三角形
           0, 2, 1,
           // 右上方三角形
           2, 3, 1
       };
       mesh.triangles = tris;

       Vector3[] normals = new Vector3[4]
       {
           Vector3.forward,
           Vector3.forward,
           Vector3.forward,
           Vector3.forward
       };
       mesh.normals = normals;

       Vector2[] uv = new Vector2[4]
       {
           new Vector2(0, 0),
           new Vector2(1, 0),
           new Vector2(0, 1),
           new Vector2(1, 1)
       };
       mesh.uv = uv;

       base.meshFilter.mesh = mesh;
   }

演示:

碰撞检测算法-分离轴算法简介:分离轴算法演示,具体细节可以看我在这里写的https://;更多实用攻略教学,爆笑沙雕集锦,你所不知道的游戏知识,热门游戏视频7*24小时持续更新,尽在哔哩哔哩bilibili 视频播放量 6、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 浅陌95sss, 作者简介 记录自己的学习成果,分享自己的快乐,相关视频:学习记录--BFS寻路算法,学习记录--网络状态机实现,学习记录--设计模式之命令模式,排行榜模拟,学习记录--网格系统,选择排序演示,Comsol-模型收敛性,学习记录--Rpg雷达图,直接插入排序演示,预制菜的防腐剂,自我检测结果出了,结果很失望,出乎你我的预料icon-default.png?t=N7T8https://www.bilibili.com/video/BV1qp4y1M7WU/?spm_id_from=333.999.0.0

 参考资料:

Example: creating a quad - Unity 手册icon-default.png?t=N7T8https://docs.unity.cn/cn/current/Manual/Example-CreatingaBillboardPlane.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管程的定义以及基本特征

1.引入管程 为了解决信号量机制存在的问题&#xff1a;编写程序困难、易出错。 1973年&#xff0c;Brinch Hansen首次在程序设计语言(Pascal)中引入了“管程”成分&#xff1a;一种高级同步机制。 2.管程的定义和基本特征 1.管程是一种特殊的软件模块&#xff0c;有这些部分…

Leetcode——数组的遍历系列练习

485. 最大连续 1 的个数 class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {// 记录最大连续1个数int max 0;// 记录数组中存在1个数int sum 0;// 遍历连续1个数int count 0;for (int i 0; i < nums.size() - 1; i) {if (nums[i] 1)s…

linux | linux扩大磁盘空间 | centos7.9 | 虚拟机

注意&#xff1a;可以完全参考下面这边博客&#xff08;我只是搬运工&#xff09; centos扩大磁盘空间 简单讲讲&#xff0c;为什么有点失落落的&#xff1f; 明明就是一个 很程序化的东西 可是网上一大推 天花乱坠 而且很多人都是半吊子水&#xff0c;甚至半吊子都没有 通过关…

jdbc(DriverManager+Connection+Statement+ResultSet)+SQL注入+开启预编译+数据连接池

1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 2 JDBC优势 可随时替换底层数据库&#xff0c;访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC&#xff08;接口&#xf…

裸辞18K外包,面试阿里、字节全都一面挂,哭死.....

测试员可以先在外包积累经验&#xff0c;以后去大厂就很容易&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓今年今天履历只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大…

[软件工具]ARW文件批量转图片jpg工具使用教程

当你有一批后缀为.ARW格式图像文件怎么转jpg呢&#xff0c;我们可以使用这个工具进行转换首先我们打开软件 然后我们直接导入文件夹&#xff0c;点击开始转换等待转换完成即可。详细视频教程参看&#xff1a; ARW文件批量转图片jpg png bmp工具使用教程_哔哩哔哩_bilibili这个…

自动化测试基础篇:Selenium 框架设计(POM)

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。本文介绍selenium的框架设计。 自动化测试框架 1.什么是自动化测试框架 简单来说&#xff0c;自动化测试框架就是由一些标准&#xff0c;协议&…

Vue-2.1scoped样式冲突

默认情况&#xff1a;写在组件中的样式会全局生效->因此很容易造成多个组件之间的样式冲突问题 1.全局样式&#xff1a;默认组件中的样式会作用到全局 2.局部样式&#xff1a;可以给组件加上scoped属性&#xff0c;可以让样式只作用于当前组件 <style scoped> <…

长沙建筑模板生产厂家有哪些?

在湖南长沙地区&#xff0c;建筑施工企业寻找一家可信赖的建筑模板供应商是非常重要的。在长沙地区&#xff0c;有多家建筑模板生产厂家&#xff0c;其中值得一提的是能强优品木业&#xff0c;他们是长沙地区建筑模板生产的领先供应商之一。 能强优品木业位于广西贵港市&#x…

Leetcode: 63. 不同路径 II(动态规划)

1. 题目解析 LeetCode链接 根据题目可以得出&#xff0c;当处于 [i][j] 位置时只能从 [i][j - 1], 和 [i - 1][j] 到达&#xff0c;所以我们只需要将到达上述两点的路径相加就可以得到到达该点的路径和 2. 解题思路 通过分析题目我们可以使用动态规划来解决这道题 首先我们…

【计算机网络笔记】什么是计算机网络?

前言计算机网络的定义交换网络什么是Internet从组成细节角度看从服务角度看 最后感谢 &#x1f496; 本篇文章总字数&#xff1a;1342字 预计阅读时间&#xff1a;5~10min 建议收藏之后慢慢阅读 前言 计算机网络通信技术计算机技术。 计算机网络是通信技术与计算机技术紧密结…

求后缀表达式的值

后缀表达式的值 【题目描述】 从键盘读入一个后缀表达式&#xff08;字符串&#xff09;&#xff0c;只含有0-9组成的运算数及加&#xff08;&#xff09;、减&#xff08;—&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;四种运算符。每个运算数之间…

面试题____Java小白找工作必须领悟的修仙秘籍(二)

当我们走出校园&#xff0c;步入社会&#xff0c;必须得找工作&#xff0c;那么作为it小白你必须拥有过硬的基础应用知识&#xff0c;才能慢慢的适应工作的节奏&#xff0c;以下内容则都是基础中的基础&#xff0c;需要全部进行掌握&#xff0c;因为这里可能有你面试时需要回答…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法&#xff0c;可用于评估系统对异常情况的响应。通过这种测试方法&#xff0c;可以发现系统中的潜在问题&#xff0c;并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

交易履约之结算平台实践 | 京东云技术团队

导读 京东科技业务在快速发展的同时&#xff0c;产生了众多线上化资金结算的需求。传统的线下资金结算模式有着人力成本高、耗时长、多方沟通协调成本高、结算准确率低等固有缺点&#xff0c;且无法满足“风法财审”对于资金流程的管控要求&#xff0c;在此背景下金道结算平台…

springboot就业信息管理系统springboot32

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

[UUCTF 2022 新生赛]ezpop - 反序列化(字符串逃逸)【***】

[UUCTF 2022 新生赛]ezpop 一、解题过程二、其他WP三、总结反思 一、解题过程 题目代码&#xff1a; <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$basedata,$ob;function __construct($str){$this->name$str;}function __wakeup(){i…

成集云 | 嗨便利集成金蝶云星辰 | 解决方案

方案介绍 嗨便利是一款便捷即时到家服务平台。它集合了即时零售、即时配送、前置仓、数字化中台、会员体系以及自研SAAS系统等众多前沿科技&#xff0c;利用大数据驱动的预测算法&#xff0c;通过多渠道订单整合&#xff0c;智能调度配送系统&#xff0c;致力于为消费者提供“…

互联网干洗店洗鞋店预约收衣下单软件

拽牛科技洗护软件系统可以实现用户在线下单&#xff0c;商家依托平台来接单&#xff0c;将用户的订单运送到校外来清洗处理&#xff0c;这样可以有效的避免学校的高房租成本。 软件有四种下单模式&#xff0c;网点自取模式&#xff5c;上门取送模式&#xff5c;快递柜模式&…