`

[转] 分享一个超高效的不规则物体碰撞检测的类~~

阅读更多
http://bbs.9ria.com/thread-1270-1-1.html


之前,在坛里看到过有朋友贴过不规则物体碰撞检测的类,这里,我再贴个一位牛老外写的一个类,经自己测试,用一个1500*1500的矢量图和一个10*10的不短移动的小球进行碰状检测,CPU占用仅4%左右,超级高效!!!
这里是代码:
Actionscript:


package ws.tink.display
{
        
        import flash.display.BitmapData;
        import flash.display.BlendMode;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        
        import flash.geom.ColorTransform;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        
        public class HitTest
        {

                public static function complexHitTestObject( target1:DisplayObject, target2:DisplayObject,  accurracy:Number = 1 ):Boolean
                {
                        return complexIntersectionRectangle( target1, target2, accurracy ).width != 0;
                }
                
                public static function intersectionRectangle( target1:DisplayObject, target2:DisplayObject ):Rectangle
                {
                        // If either of the items don't have a reference to stage, then they are not in a display list
                        // or if a simple hitTestObject is false, they cannot be intersecting.
                        if( !target1.root || !target2.root || !target1.hitTestObject( target2 ) ) return new Rectangle();
                        
                        // Get the bounds of each DisplayObject.
                        var bounds1:Rectangle = target1.getBounds( target1.root );
                        var bounds2:Rectangle = target2.getBounds( target2.root );
                        
                        // Determine test area boundaries.
                        var intersection:Rectangle = new Rectangle();
                        intersection.x   = Math.max( bounds1.x, bounds2.x );
                        intersection.y    = Math.max( bounds1.y, bounds2.y );
                        intersection.width      = Math.min( ( bounds1.x + bounds1.width ) - intersection.x, ( bounds2.x + bounds2.width ) - intersection.x );
                        intersection.height = Math.min( ( bounds1.y + bounds1.height ) - intersection.y, ( bounds2.y + bounds2.height ) - intersection.y );
                
                        return intersection;
                }
                
                public static function complexIntersectionRectangle( target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1 ):Rectangle
                {                     
                        if( accurracy <= 0 ) throw new Error( "ArgumentError: Error #5001: Invalid value for accurracy", 5001 );
                        
                        // If a simple hitTestObject is false, they cannot be intersecting.
                        if( !target1.hitTestObject( target2 ) ) return new Rectangle();
                        
                        var hitRectangle:Rectangle = intersectionRectangle( target1, target2 );
                        // If their boundaries are no interesecting, they cannot be intersecting.
                        if( hitRectangle.width * accurracy <1 || hitRectangle.height * accurracy <1 ) return new Rectangle();
                        
                        var bitmapData:BitmapData = new BitmapData( hitRectangle.width * accurracy, hitRectangle.height * accurracy, false, 0x000000 ); 

                        // Draw the first target.
                        bitmapData.draw( target1, HitTest.getDrawMatrix( target1, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, -255, -255, 255 ) );
                        // Overlay the second target.
                        bitmapData.draw( target2, HitTest.getDrawMatrix( target2, hitRectangle, accurracy ), new ColorTransform( 1, 1, 1, 1, 255, 255, 255, 255 ), BlendMode.DIFFERENCE );
                        
                        // Find the intersection.
                        var intersection:Rectangle = bitmapData.getColorBoundsRect( 0xFFFFFFFF,0xFF00FFFF );
                        
                        bitmapData.dispose();
                        
                        // Alter width and positions to compensate for accurracy
                        if( accurracy != 1 )
                        {
                                intersection.x /= accurracy;
                                intersection.y /= accurracy;
                                intersection.width /= accurracy;
                                intersection.height /= accurracy;
                        }
                        
                        intersection.x += hitRectangle.x;
                        intersection.y += hitRectangle.y;
                        
                        return intersection;
                }
                
                
                protected static function getDrawMatrix( target:DisplayObject, hitRectangle:Rectangle, accurracy:Number ):Matrix
                {
                        var localToGlobal:Point;;
                        var matrix:Matrix;
                        
                        var rootConcatenatedMatrix:Matrix = target.root.transform.concatenatedMatrix;
                        
                        localToGlobal = target.localToGlobal( new Point( ) );
                        matrix = target.transform.concatenatedMatrix;
                        matrix.tx = localToGlobal.x - hitRectangle.x;
                        matrix.ty = localToGlobal.y - hitRectangle.y;
                        
                        matrix.a = matrix.a / rootConcatenatedMatrix.a;
                        matrix.d = matrix.d / rootConcatenatedMatrix.d;
                        if( accurracy != 1 ) matrix.scale( accurracy, accurracy );

                        return matrix;
                }

        }

} 
分享到:
评论

相关推荐

    VB.net不规则图形碰撞检测(附源工程)

    在VB.NET中实现不规则图形的碰撞检测是一个有趣且实用的技术挑战,特别是在开发游戏或交互式应用程序时。本文将深入探讨这一主题,并基于提供的描述,分析实现这一功能的关键知识点。 首先,我们要理解“不规则图形...

    不规则碰撞检测

    在"LWDetection.h"头文件中,可能定义了一个名为"LWDetection"的类,这个类可能是用来封装不规则碰撞检测逻辑的。它可能会包含一些方法,如初始化多边形、设置顶点、进行碰撞检查等。例如: ```objc @interface ...

    AS3.0高级碰撞检测

    位图的碰撞检测是Flash开发中的一个重要技术,尤其在游戏制作和交互式应用程序中不可或缺。在AS3.0中,提供了多种碰撞检测方法,包括基本的`hitTestObject`和`hitTestPoint`,以及更高级的`BitmapData.hitTest`方法...

    FLASH高级碰撞检测

    下面我们来看一个具体的示例,演示如何使用BitmapData.hitTest进行不规则图形之间的碰撞检测。 ```as public class BitmapCompare extends Sprite { public function BitmapCompare() { stage.align = StageAlign...

    一种碰撞检测和二维不规则嵌套算法_julia_代码_下载

    在二维不规则嵌套问题中,我们通常面临的是如何在一个大的二维空间内高效地放置多个形状不规则的小对象,使得这些小对象不重叠且占用的空间最小。这在制造业、物流、包装等领域有着广泛的应用。例如,木工切割、金属...

    OgreOpcode碰撞检测

    OgreOpcode是Ogre3D图形引擎的一个扩展库,用于实现高效的碰撞检测功能。由于其轻量级的特性,它成为了不使用完整物理引擎时的理想选择。然而,由于文档相对匮乏,初次接触OgreOpcode的开发者可能会遇到不少困难。...

    碰撞检测及响应算法

    碰撞检测,简单来说,就是判断虚拟世界中的两个或多个对象是否发生接触或接近,这一过程在游戏开发、物理模拟、机器人路径规划等领域具有广泛应用。算法的高效性和准确性直接影响到软件性能与用户体验。 首先,我们...

    4-14-5(Region碰撞检测).7z

    在游戏开发、物理模拟或者计算机图形学中,Region碰撞检测是一项关键的技术,用于确定两个或多个对象是否在空间上重叠或接触。本文件“4-14-5(Region碰撞检测).7z”可能包含关于这个主题的详细资料,如源代码、教程...

    gskinner的碰撞检测实现

    BitmapData是ActionScript 3.0中的一个类,它提供了对位图数据的低级访问,从而允许我们进行像素级别的操作,包括碰撞检测。 首先,让我们了解什么是BitmapData。BitmapData是Flash Player或Adobe AIR中用于处理...

    虚拟现实中的碰撞检测技术word文档格式60.docx

    - **凹形模型**:适用于复杂的几何形状,如不规则物体。 ##### 2.3 碰撞检测的场景特征 不同的虚拟场景具有不同的特征,这对碰撞检测算法的选择有很大影响。例如,在复杂场景中,可能需要采用层次化的检测策略来...

    电信设备-一种基于包围盒树法的并行碰撞检测方法.zip

    在电信设备领域,高效、精确的碰撞检测是关键任务之一,特别是在模拟通信系统中的多实体交互或优化网络布局时。本文将深入探讨一种基于包围盒树法(Bounding Volume Hierarchy,简称BVH)的并行碰撞检测方法。这种...

    unity3d 插件 自定义 碰撞体 形状 优化 Concave Collider.rar

    4. **使用Layer Culling**:Unity支持基于层的剔除机制,合理分配游戏对象到不同的图层,并设置合适的碰撞检测层,可以避免不必要的碰撞检测,进一步优化性能。 5. **Physics Material优化**:使用更简单的物理材质...

    基于距离的碰撞算法

    在游戏开发中,碰撞检测是不可或缺的一个环节,尤其是在实时性要求高的Moba(多人在线战术竞技)游戏中。基于距离的碰撞算法是一种优化过的碰撞检测方法,尤其适合于地图区域相对较小的游戏场景。这类算法通常比传统...

    四叉树实现碰撞检测、坐标点查找与比对,如果是坐标组,那么需要另外定义插入的规则,该Demo代码示例针对的是单个坐标点。

    3. 碰撞检测:给定一个点或一组点,遍历四叉树,对于每个节点,检查其边界是否包含目标点,如果是,则继续检查其子节点,直到找到目标点或确定没有碰撞。 4. 删除操作:当某个对象移出四叉树的覆盖范围时,需要从树...

    flash 像素碰撞

    4. **不规则位图处理**:"不规则位图像素碰撞检测"可能是指处理具有不规则形状的图像。对于非矩形或非简单几何形状的对象,传统的碰撞检测方法可能不适用。这时,需要将对象转换为位图,并对位图进行像素级别的比较...

    AutoMoveView

    AABB是最基础的碰撞检测方式,通过为每个物体创建一个包围盒,只需比较包围盒之间是否有重叠就能快速判断是否发生碰撞。这种方法简便易行,适用于多物体的大规模碰撞检测。 然而,对于形状复杂的物体,AABB可能会...

    DXDraw实现的2D小程序,实现了碰撞检测,精灵动画。

    在本文中,我们将深入探讨如何使用DXDraw API创建一个2D小程序,该程序包含了碰撞检测和精灵动画等关键功能。DXDraw是DirectX的一部分,它为开发者提供了在Windows平台上进行2D图形绘制的强大工具。 首先,DXDraw ...

Global site tag (gtag.js) - Google Analytics