游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2523|回复: 2

AABB的转换问题,想不通

[复制链接]

2

主题

31

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2011-10-8 18:08:00 | 显示全部楼层 |阅读模式
AABB取长方体为包围盒,发生转换后生成新的AABB;其中Pmin,Pmax是类AABB的成员变量。

void AABB::xform(const D3DXMATRIX& M, AABB& out)
{
// Convert to center/extent representation.
D3DXVECTOR3 c = center();  <--即c=(Pmin+Pmax)/2
D3DXVECTOR3 e = extent();  <--即e=(Pmax-Pmin)/2

// Transform center in usual way.
D3DXVec3TransformCoord(&c, &c, &M);

// Transform extent.
D3DXMATRIX absM;
D3DXMatrixIdentity(&absM);
absM(0,0) = fabsf(M(0,0)); absM(0,1) = fabsf(M(0,1)); absM(0,2) = fabsf(M(0,2));
absM(1,0) = fabsf(M(1,0)); absM(1,1) = fabsf(M(1,1)); absM(1,2) = fabsf(M(1,2));
absM(2,0) = fabsf(M(2,0)); absM(2,1) = fabsf(M(2,1)); absM(2,2) = fabsf(M(2,2));
D3DXVec3TransformNormal(&e, &e, &absM); //因为平移不影响向量的计算
// Convert back to AABB representation.
out.minPt = c - e;
out.maxPt = c + e;
}

摘自龙书-讲地形的章节

对M分量取绝对值,这一点,我想不通。请高人指点。

0

主题

27

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2011-10-8 21:51:00 | 显示全部楼层

Re:AABB的转换问题,想不通

Ogre的源代码也是采用这种方式对AABB进行转换。
首先,对M中的值取绝对值会使得该向量的旋转不会出现负值;
其次,考虑到在构建AABB盒的时候,物品在AABB空间中是正负对称的。当我们分别取center和extent来对这个盒子进行旋转的时候,在盒子坐标系中,我们是以该盒子的中心来进行旋转。
举个例子:向量extent(x,y,z)绕Y轴旋转deta角,从Z轴往下看(Z轴朝向眼睛),那么与 extent相对应的一个向量为leftExtent(-x,y,z),这个也是从AABB中心指向AABB左上角的一个向量。那么向量与矩阵相乘如下
               {cos deta, 0, -sin deta}
(x,y,z)*   {0,        1, 0       }
               {sin deta, 0, cos deta}
extent--->extent1(x1, y1, z1),leftExtent-->extent2(x2, y2, z2)
x1 == cos deta * x + sin deta * z    x2 == (-x)*cos deta + sin deta * z
y1 == y     y2 == y
z1 == - sin deta * x + cos deta * z    z2 == (-x) * (-sin deta) + cos deta * z
假设deta 范围(0,pi/2),则sin deta > 0, cos deta>0.
在构建新的AABB的时候,我们仍然取最大值(x1, y, z2),如果取绝对值,结果也是这个。
可以推广到其它轴,不知道我这样理解对不对。

2

主题

31

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2011-10-9 00:18:00 | 显示全部楼层

Re:AABB的转换问题,想不通

谢谢楼上的。
必要:
Pmin' = c-e   c不变,e取最大
Pmax' = c+e   c不变,e取最大 ,也就是说e的取法是一致,要尽可能取大的。

e为向量,平移不影响数值,只考虑旋转;而c进行转换后,已经考虑了平移的情况。
所以接下来,只要以盒子中心旋转就可以了。
又因为e各分量>0,
所以M各分量取了绝对值后,c-e*M和c+e*M必然取到极值(这里的e是指转换前的向量),

充分:
而M又是可以看作是绕x轴旋转,绕y轴,绕z轴旋转的组合。不妨将M分解成M=Mz*My*Mx
于是e*M=e*Mz*My*Mx
对于e*Mz,记e(x,y,z),x,y,z均>0,转换后(x',y',z'=z)
因为Mz转换后只改变x,y分量,按时针方向,有两种情形(复数计算公式):
逆时针转 (x*cosa-y*sina,y*cosa+x*sina)
顺时针转 (x*cosa+y*sina,y*cosa-x*sina)
不管Mz实际是什么效果,绝对值后,值取为(x*cosa+y*sina,y*cosa+x*sina),这就相当于对于物体在xy平面上,绕z轴逆时针和顺时针各转一次得到图形,其c-e*Mz,c+e*Mz两个极值确定范围,刚好严格地把物体包围在里面(投影方向)。

接下来的,经过*My*Mx的处理,3维方向上保证了盒子刚好把物体包围起来,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 15:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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