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

news2024/9/21 20:42:36

       在实现分离轴算法前,需要做一些准备工作,在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/1080484.html

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

相关文章

电容如何能做升压?(电荷泵的工作原理及特性)

目录 一、电荷泵 二、电荷泵工作原理 1、 倍压型电荷泵 2、 稳压型电荷泵 1、 开关调整稳压型电荷泵 2、 LDO稳压型电荷泵 3、 反向型电荷泵 三、 电荷泵的优劣势 1&#xff09;成本 2&#xff09;效率 3&#xff09;噪声 4&#xff09;面积及EMI 5&#xff09;输…

apifox的使用以及和idea集成

apifox 简介 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter&#xff0c;由此可见apifox集功能于一身&#xff0c;极大的提升了我们开发的效率&#xff0c;不用再为postman网络连接失败而发愁&…

【Qt】对话框QDialog

文章目录 **对话框**QDialog**基本概念**对话框分类标准对话框自定义消息框模态对话框非模态对话框 案例&#xff1a;点击新建按钮弹出对话框消息对话框其它标准对话框 对话框QDialog 基本概念 对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【业务功能篇 131】23种设计模式介绍

第一章 设计模式概述 1.1 代码质量好坏如何评价? 要想学习设计模式呢 我们就必须搞清楚设计模式到底在我们的编程过程中起到了怎样的作用,在编程世界中它处在一个什么样的位置,它到底是一种抽象的设计思想,还是一套具体的落地方案. 在学习设计模式之前呢 我们需要了解一下 代…

【轻松玩转MacOS】故障排除篇

引言 在使用 MacOS 时&#xff0c;遇到故障是在所难免的。不要担心&#xff0c;这篇文章将为您提供一些常见的故障排除步骤&#xff0c;并介绍如何联系苹果的支持团队寻求帮助。让我们一起来看看吧&#xff01; 一、常见的故障排除步骤 1.1 网络连接问题 如果你发现你的Mac…

中兴路由器mesh组网设置分享!没想到居然这么简单!

前段时间忙了几天&#xff0c;总算是搬进新家了&#xff0c;因为新家比之前租的房子大了许多&#xff0c;所以之前用的路由器已经是力不从心了&#xff0c;我把它放大厅里&#xff0c;除了离大厅最近的一个房间有信号&#xff0c;其他两个房间的信号微乎其微&#xff0c;就算连…

接口自动化测试,如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

【Python语义分割】Segment Anything(SAM)模型介绍安装教程

1 Segment Anything介绍 1.1 概况 Meta AI 公司的 Segment Anything 模型是一项革命性的技术&#xff0c;该模型能够根据文本指令或图像识别&#xff0c;实现对任意物体的识别和分割。这一模型的推出&#xff0c;将极大地推动计算机视觉领域的发展&#xff0c;并使得图像分割技…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

离散型制造企业MES管理系统解决方案

随着制造业的快速发展&#xff0c;离散型制造企业面临着越来越多的挑战。多样性、生产批次、工序复杂性以及高度定制化等特点使得企业的生产管理变得越来越复杂。为了提高生产效率和管理效率&#xff0c;许多企业开始寻求合适的解决方案。本文将以离散型制造企业的特点为基础&a…

云剪辑解决方案,支持云端剪辑私有化部署

在当今的商业环境中&#xff0c;视频已经成为了企业宣传和品牌推广的重要工具。然而&#xff0c;视频制作技术开发部署的成本和复杂性却让许多企业望而却步。为了解决这个问题&#xff0c;美摄科技推出了云剪辑解决方案&#xff0c;这是一款专为企业设计的高效视频剪辑技术服务…

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…

水声功率放大器的应用场景有哪些

水声功率放大器是一种特殊的放大器&#xff0c;它专门用于放大水声信号&#xff0c;广泛应用于水声通信、水声传感、声纳等领域。下面将详细介绍水声功率放大器的应用场景及其重要性。 水声通信是水声功率放大器最常见的应用场景之一。水声通信是利用水作为传输介质进行通信的一…

JavaScript Web APIs第四天笔记

Web APIs - 第4天 进一步学习 DOM 相关知识&#xff0c;实现可交互的网页特效 能够插入、删除和替换元素节点能够依据元素节点关系查找节点 日期对象 掌握 Date 日期对象的使用&#xff0c;动态获取当前计算机的时间。 ECMAScript 中内置了获取系统时间的对象 Date&#xff…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…

Python 人工智能 Machine Learning 机器学习基础知识点详细教程(更新中)

人工智能基本介绍 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它试图了解智能的实质&#xff0c;并生产出一种新的能以人类智能相似的方式做出反应的智…

echart双柱状图

1.效果 2.代码 const option {baseOption: {// backgroundColor: #0e2147,timeline: {show: false,},color: [#f14f75, #2c7efa],title: {text: 自动派单使用情况分析,textStyle: {rich: {a: {fontSize: 16,fontWeight: 600,},},},subtext: "2023~2024",top: 3%,l…

redis 哨兵 sentinel(一)配置

sentinel巡查监控后台master主机是否故障&#xff0c;如果故障根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 sentinel 哨兵的功能 监控 监控主从redis库运行是否正常消息通知 哨兵可以将故障转移的结果发送给客户端故障转移 如果master异常&#xff0c;则…

传奇XO引擎架设教程

本教程只限于技术研究使用&#xff0c;请勿用于商业用途。 本站教程、资源皆在单机环境进行&#xff0c;仅供单机研究学习使用&#xff0c;下载后请于24小时内删除&#xff0c;或购买正版。 XO三端引擎架设教程 演示系统&#xff1a;Windows Server2012 演示地址&#xff1a;…