opengles拾取,碰撞检测,相交检测

该博客介绍如何使用AABB(轴对齐边界框)在OpenGL中实现拾取和碰撞检测功能,通过检测鼠标射线与物体的相交情况来实现交互操作。
摘要由CSDN通过智能技术生成


本例用AABB来实现opengl中的拾取功能,AABB在opengl中可用来做相交检测,碰撞检测,本例用于检测鼠标指向的射线是否和物体相交

AABB实现类

   template<typename T>
    class   AxisAlignedBox
    {
    public:
        enum Extent
        {
            EXTENT_NULL,  //是否被初始化
            EXTENT_FINITE,//有限大
            EXTENT_INFINITE//无限大
        };
    public:
	    tvec3<T>    _minimum;//最小值
	    tvec3<T>    _maximum;//最大值
        Extent      _extent;//扩展变量
    public:
	    /*
	    1-----2
	    /|    /|
	    / |   / |
	    5-----4  |
	    |  0--|--3
	    | /   | /
	    |/    |/
	    6-----7
	    */
	    typedef enum 
        {
		    FAR_LEFT_BOTTOM     =   0,
		    FAR_LEFT_TOP        =   1,
		    FAR_RIGHT_TOP       =   2,
		    FAR_RIGHT_BOTTOM    =   3,
		    NEAR_RIGHT_BOTTOM   =   7,
		    NEAR_LEFT_BOTTOM    =   6,
		    NEAR_LEFT_TOP       =   5,
		    NEAR_RIGHT_TOP      =   4
	    } CornerEnum;

	    AxisAlignedBox()
	    {
		    _minimum    =   tvec3<T>( T(-0.5), T(-0.5), T(-0.5) );
		    _maximum    =   tvec3<T>( T(0.5), T(0.5), T(0.5) );
            _extent     =   EXTENT_NULL;
	    }
	    AxisAlignedBox(const AxisAlignedBox & rkBox)
	    {
            setExtents( rkBox._minimum, rkBox._maximum );
            _extent =   rkBox._extent;
	    }

	    AxisAlignedBox( const tvec3<T>& min, const tvec3<T>& max )
	    {
		    setExtents( min, max );
	    }

	    AxisAlignedBox(
		    T mx, T my, T mz,
		    T Mx, T My, T Mz
            )
	    {
		    setExtents( mx, my, mz, Mx, My, Mz );
	    }

	    AxisAlignedBox<T>& operator=(const AxisAlignedBox<T>& right)
	    {
            setExtents(right._minimum, right._maximum);
		    return *this;
	    }

	    ~AxisAlignedBox()
	    {
	    }
	    /** 
        *   获取最小值
	    */
	    const tvec3<T>& getMinimum(void) const
	    { 
		    return _minimum; 
	    }

	    /** 
        *   Gets a modifiable version of the minimum
	    *   corner of the box.
	    */
	    tvec3<T>& getMinimum(void)
	    { 
		    return _minimum; 
	    }

		//设置最小值
        void    setMinimum(const tvec3<T>& mins)
        { 
            _minimum    =   mins;
        }
        void    setMinimum(T x,T y, T z)
        { 
            _minimum    =   tvec3<T>(x,y,z);
        }
	    /** 
        *   Gets the maximum corner of the box.
	    */
	    const tvec3<T>& getMaximum(void) const
	    { 
		    return _maximum;
	    }
	    /** 
        *   Gets a modifiable version of the maximum
	    *   corner of the box.
	    */
	    tvec3<T>& getMaximum(void)
	    { 
		    return _maximum;
	    }
	    /** 
        *   Sets the maximum corner of the box.
	    */
	    void setMaximum( const tvec3<T>& vec )
	    {
		    _maximum = vec;
	    }

	    void setMaximum( T x, T y, T z )
	    {
		    _maximum.x = x;
		    _maximum.y = y;
		    _maximum.z = z;
	    }

	    /** 
        *   Changes one of the components of the maximum corner of the box
	    *   used to resize only one dimension of the box
	    */
	    void setMaximumX( T x )
	    {
		    _maximum.x = x;
	    }

	    void setMaximumY( T y )
	    {
		    _maximum.y = y;
	    }

	    void setMaximumZ( T z )
	    {
		    _maximum.z = z;
	    }

	    /** 
        *   设置包围盒的大小  min:最小值   max:最大值
	    */
	    void setExtents( const tvec3<T>& min, const tvec3<T>& max )
	    {
		    _minimum    =   min;
		    _maximum    =   max;
            _extent     =   EXTENT_FINITE;
	    }
		//设置包围盒大小  mx my mz 最小值xyz  Mx My  Mz 最大值xyz
	    void setExtents(
		    T mx, T my, T mz,
		    T Mx, T My, T Mz )
	    {
		    _minimum.x  =   mx;
		    _minimum.y  =   my;
		    _minimum.z  =   mz;

		    _maximum.x  =   Mx;
		    _maximum.y  =   My;
		    _maximum.z  =   Mz;
            _extent     =   E
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值