zoukankan      html  css  js  c++  java
  • 【物理】AABB物理碰撞检测

    什么是AABB?

    AABB,指轴对齐包围盒(Axis-aligned bounding boxes)。在3D空间中,AABB是一个长方体,在2D空间中是一个长方形。特征是面法线皆平行于坐标轴,即当物体旋转时,AABB不会随物体旋转,也因此特性,AABB可以最快判断两物体是否重叠。

    AABB表达

    《实时碰撞检测算法技术》一书中提到3种AABB的表达方式,这里仅举其中最高效,要求存储空间最少的一种——即存储包围盒的中心位置和包围盒的半径(即包围盒边缘到包围盒中心距离的长度):

    struct AABB {
        Vector3 pos;
        Vector3 r;
    }
    

    AABB间的碰撞检测

    AABB是否相交可作图如下:

    其中r为半径,d为两包围盒中心的距离。

    int AABBIntersection(AABB A, AABB B) {
        for(int i=0, i<3, i++){
            if(abs(A.pos-B.pos)>A.r+B.r)   return 0;
        }
        return 1;
    }
    

    AABB和ray之间的碰撞检测

    在游戏中,经常会出现需要检测从某一点发出的射线是否与物体相交。
    具体逻辑与AABB间的的碰撞检测相似,只是将其中一个AABB换成了射线。射线的结构如下:

    struct Ray {
        Vector3 pos;
        Vector3 direction;
    }
    
    

    检测射线与AABB碰撞方程:

    int RayAABBIntersection(Ray R, AABB A) {
        
    
    }
    

  • 相关阅读:
    Vue2020
    Vue2020
    Vue v-model双向数据绑定 的实现
    TCP 粘包
    黑幕模板
    STL总结与例子
    中缀表达式转后缀表达式
    php 转换数组里的时间戳
    gorm踩过的坑
    WxJava使用lettuce客户端的redis实现微信access_token等接口重复利用
  • 原文地址:https://www.cnblogs.com/liez/p/11965027.html
Copyright © 2011-2022 走看看