游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3203|回复: 4

原始的包围盒变换距阵后如何得到变换后的4个顶点

[复制链接]

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2007-1-21 13:53:00 | 显示全部楼层 |阅读模式
同上

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-21 14:43:00 | 显示全部楼层

Re:原始的包围盒变换距阵后如何得到变换后的4个顶点

原始包围盒与变换矩阵相乘后的包围盒顶点既是

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-1-22 13:27:00 | 显示全部楼层

Re:原始的包围盒变换距阵后如何得到变换后的4个顶点

如果你的变换不包含旋转,可以直接变换(Min,Max)2个点

但如果包含旋转,就只能老老实实的变换8个点

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2007-1-22 15:26:00 | 显示全部楼层

Re:原始的包围盒变换距阵后如何得到变换后的4个顶点

楼主指的是AABB盒子吧
只变换八个点是很不准确的…
看看《3D游戏开发中的数学》中的算法吧
下面的代码是从书里整理出来的,我测试过,基本能用 .
struct AABB
{
D3DXVECTOR3 _min ;
D3DXVECTOR3 _max ;
void TransformBox(const D3DXMATRIX& mat) ;
};

inline void AABB::TransformBox(const D3DXMATRIX& mat)
{
    AABBbox(_min ,_max) ;
    _min = _max = D3DXVECTOR3(mat.m[3][0],mat.m[3][1],mat.m[3][2]);

    if (mat.m[0][0] > 0.0f)
    {
        _min.x += mat.m[0][0] * box._min.x; _max.x += mat.m[0][0] * box._max.x;
    }
    else
    {
        _min.x += mat.m[0][0] * box._max.x; _max.x += mat.m[0][0] * box._min.x;
    }

    if (mat.m[0][1] > 0.0f)
    {
        _min.y += mat.m[0][1] * box._min.x; _max.y += mat.m[0][1] * box._max.x;
    }
    else
    {
        _min.y += mat.m[0][1] * box._max.x; _max.y += mat.m[0][1] * box._min.x;
    }

    if (mat.m[0][2] > 0.0f)
    {
        _min.z += mat.m[0][2] * box._min.x; _max.z += mat.m[0][2] * box._max.x;
    }
    else
    {
        _min.z += mat.m[0][2] * box._max.x; _max.z += mat.m[0][2] * box._min.x;
    }

    if (mat.m[1][0] > 0.0f)
    {
        _min.x += mat.m[1][0] * box._min.y; _max.x += mat.m[1][0] * box._max.y;
    }
    else
    {
        _min.x += mat.m[1][0] * box._max.y; _max.x += mat.m[1][0] * box._min.y;
    }

    if (mat.m[1][1] > 0.0f)
    {
        _min.y += mat.m[1][1] * box._min.y; _max.y += mat.m[1][1] * box._max.y;
    }
    else
    {
        _min.y += mat.m[1][1] * box._max.y; _max.y += mat.m[1][1] * box._min.y;
    }
    if (mat.m[1][2] > 0.0f)
    {
        _min.z += mat.m[1][2] * box._min.y; _max.z += mat.m[1][2] * box._max.y;
    }
    else
    {
        _min.z += mat.m[1][2] * box._max.y; _max.z += mat.m[1][2] * box._min.y;
    }
    if (mat.m[2][0] > 0.0f)
    {
        _min.x += mat.m[2][0] * box._min.z; _max.x += mat.m[2][0] * box._max.z;
    }
    else
    {
        _min.x += mat.m[2][0] * box._max.z; _max.x += mat.m[2][0] * box._min.z;
    }
    if (mat.m[2][1] > 0.0f)
    {
        _min.y += mat.m[2][1] * box._min.z; _max.y += mat.m[2][1] * box._max.z;
    }
    else
    {
        _min.y += mat.m[2][1] * box._max.z; _max.y += mat.m[2][1] * box._min.z;
    }
    if (mat.m[2][2] > 0.0f)
    {
        _min.z += mat.m[2][2] * box._min.z; _max.z += mat.m[2][2] * box._max.z;
    }
    else
    {
        _min.z += mat.m[2][2] * box._max.z; _max.z += mat.m[2][2] * box._min.z;
    }
}

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-1-22 15:52:00 | 显示全部楼层

Re:原始的包围盒变换距阵后如何得到变换后的4个顶点

你这个方法和变换8个点没多大区别

要做到完全精确就必须通过原模型重新算

比如一个面片按XY平面放,包围盒就是一个很扁的盒子,但如果按Y轴旋转45度,包围盒就不再扁了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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