游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5046|回复: 11

OBB的创建算法

[复制链接]

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-5-27 17:58:00 | 显示全部楼层 |阅读模式
哪位有详细的OBB创建算法啊?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-5-27 21:43:00 | 显示全部楼层

Re:OBB的创建算法

以下是我代码里面的一部分,也许对你有用

//得到原Aabb随被包围体变换之后成为Obb的8个顶点和6个面
D3DXVECTOR3 * BaseAABB::GetObbPoints()
{
        Entity * entity = GetOwner();

        D3DXMATRIX * mat = entity->GetSenceWorldMatrix();
        /*
        原AAbb八个顶点
        3—2   7—6
        |底| + |顶|
        0—1   4—5
        随被包围对象变换之后的坐标
        */
        if(mat)
        {
            if(lastMat != *mat)
                {
                        //更新Obb的8个顶点
                        mObbPoints[0].x = m_vMin.x; mObbPoints[0].y = m_vMin.y; mObbPoints[0].z = m_vMin.z;
                        mObbPoints[1].x = m_vMax.x; mObbPoints[1].y = m_vMin.y; mObbPoints[1].z = m_vMin.z;
                        mObbPoints[2].x = m_vMax.x; mObbPoints[2].y = m_vMin.y; mObbPoints[2].z = m_vMax.z;
                        mObbPoints[3].x = m_vMin.x; mObbPoints[3].y = m_vMin.y; mObbPoints[3].z = m_vMax.z;

                        mObbPoints[4].x = m_vMin.x; mObbPoints[4].y = m_vMax.y; mObbPoints[4].z = m_vMin.z;
                        mObbPoints[5].x = m_vMax.x; mObbPoints[5].y = m_vMax.y; mObbPoints[5].z = m_vMin.z;
                        mObbPoints[6].x = m_vMax.x; mObbPoints[6].y = m_vMax.y; mObbPoints[6].z = m_vMax.z;
                        mObbPoints[7].x = m_vMin.x; mObbPoints[7].y = m_vMax.y; mObbPoints[7].z = m_vMax.z;
                        D3DXVec3TransformCoordArray(mObbPoints, sizeof(D3DXVECTOR3), mObbPoints, sizeof(D3DXVECTOR3),mat, 8);

                        //更新Obb的6个平面
                        D3DXPlaneFromPoints(&mObbPlanes[0], mObbPoints + 4, mObbPoints + 7, mObbPoints + 6);        // 上平面(top)
                        D3DXPlaneFromPoints(&mObbPlanes[1], mObbPoints    , mObbPoints + 1, mObbPoints + 2);        // 下平面(bottom)
                        D3DXPlaneFromPoints(&mObbPlanes[2], mObbPoints    , mObbPoints + 4, mObbPoints + 5);        // 近平面(near)

                        D3DXPlaneFromPoints(&mObbPlanes[3], mObbPoints + 2, mObbPoints + 6, mObbPoints + 7);        // 远平面(far)
                        D3DXPlaneFromPoints(&mObbPlanes[4], mObbPoints    , mObbPoints + 3, mObbPoints + 7);        // 左平面(left)
                        D3DXPlaneFromPoints(&mObbPlanes[5], mObbPoints + 1, mObbPoints + 5, mObbPoints + 6);        // 右平面(right)

                        lastMat = *mat;
                }
                return mObbPoints;
        }
        else
        {
                return 0;
        }
}

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-5-28 09:56:00 | 显示全部楼层

Re:OBB的创建算法

谢谢你的代码!
如果给定一组点,要如何算这组点的OBB呢?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-5-28 11:14:00 | 显示全部楼层

Re:OBB的创建算法

你是说任意离散个数的点,求最小的Obb包围盒吗?
这个要用到很多数学知识了,暂时没想到

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-5-28 11:29:00 | 显示全部楼层

Re:OBB的创建算法

对,任意的离散点。
我在Real-Time Rendering上找到一个算法,但是说得不是很明白。牵扯到凸包计算,协方差矩阵和矩阵的特征向量,不晓得该怎么算。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-28 12:29:00 | 显示全部楼层

Re:OBB的创建算法

obb的计算是个difficult problem.
很多算法理论上可行,但实际计算量和计算过程都太复杂
你看到的那个算法应该在collision queries using oriented bounding boxes这篇文章里
Geometric Tools for Computer Graphics里也有相应的介绍
但这种方法计算出来的obb也不一定是最优的

还有一种称为min-principal-conponent box的算法,被认为是比较可行的,感兴趣的话去google一下吧

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-5-28 14:25:00 | 显示全部楼层

Re:OBB的创建算法

是不是 Real-time Collision Detection 的 4.4.4 Optimizing PCA-based OBBs 中的方法啊?

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-28 17:37:00 | 显示全部楼层

Re:OBB的创建算法

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-5-28 18:15:00 | 显示全部楼层

Re: OBB的创建算法

非常感谢啊
我喜欢这个算法  [em13] [em3]

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2009-5-31 11:56:00 | 显示全部楼层

Re:OBB的创建算法

obb的东西其实就是用另外一种方式来表示一个box的东西,给中心点,三个粥的方向向量,各个轴的长度就可以了,他比aabb使用起来麻烦点,一般可以根据人的骨骼来决定obb
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 01:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表