改造这个AABB我已经旋转网格后,所以它再适合它

问题描述:

我有这个类AABB至极我foun在互联网和它曾经为当网移动,但是当我当然旋转网格将停止工作,还我已经注意到它有一个转换函数,所以我认为这是我必须使用的,所以它在我旋转网格之后起作用,但是我有一点新的矩阵并且我不知道如何使用它:改造这个AABB我已经旋转网格后,所以它再适合它

#ifndef AABB_H 
    #define AABB_H 

    class aabb { 
    public: 
    aabb() { min.x = min.y = min.z = 1e24f; max.x = max.y = max.z = -1e24f; } 
    aabb &operator =(const aabb &a) { min = a.min; max = a.max; return *this; } 

    vec3d min, max; 

    vec3d center() { return ((min + max) * 0.5f); } 

    void empty() { min.x = min.y = min.z = 1e24f; max.x = max.y = max.z = -1e24f; } 
    void add(const vec3d &pnt) { 
     if (pnt.x < min.x) min.x = pnt.x; 
     if (pnt.x > max.x) max.x = pnt.x; 
     if (pnt.y < min.y) min.y = pnt.y; 
     if (pnt.y > max.y) max.y = pnt.y; 
     if (pnt.z < min.z) min.z = pnt.z; 
     if (pnt.z > max.z) max.z = pnt.z; 
    } 
    void transform(const mat3x3 &m, const vec3d &trans) { 
     vec3d oldmin = min, oldmax = max; 
     min = max = trans; 
     if (m.m11 > 0.0f) { min.x += m.m11 * oldmin.x; max.x += m.m11 * oldmax.x; } 
      else { min.x += m.m11 * oldmax.x; max.x += m.m11 * oldmin.x; } 
     if (m.m12 > 0.0f) { min.y += m.m21 * oldmin.x; max.y += m.m21 * oldmax.x; } 
      else { min.y += m.m21 * oldmax.x; max.y += m.m21 * oldmin.x; } 
     if (m.m13 > 0.0f) { min.z += m.m31 * oldmin.x; max.z += m.m31 * oldmax.x; } 
      else { min.z += m.m31 * oldmax.x; max.z += m.m31 * oldmin.x; } 
     if (m.m21 > 0.0f) { min.x += m.m12 * oldmin.y; max.x += m.m12 * oldmax.y; } 
      else { min.x += m.m12 * oldmax.y; max.x += m.m12 * oldmin.y; } 
     if (m.m22 > 0.0f) { min.y += m.m22 * oldmin.y; max.y += m.m22 * oldmax.y; } 
      else { min.y += m.m22 * oldmax.y; max.y += m.m22 * oldmin.y; } 
     if (m.m23 > 0.0f) { min.z += m.m32 * oldmin.y; max.z += m.m32 * oldmax.y; } 
      else { min.z += m.m32 * oldmax.y; max.z += m.m32 * oldmin.y; } 
     if (m.m31 > 0.0f) { min.x += m.m13 * oldmin.z; max.x += m.m13 * oldmax.z; } 
      else { min.x += m.m13 * oldmax.z; max.x += m.m13 * oldmin.z; } 
     if (m.m32 > 0.0f) { min.y += m.m23 * oldmin.z; max.y += m.m23 * oldmax.z; } 
      else { min.y += m.m23 * oldmax.z; max.y += m.m23 * oldmin.z; } 
     if (m.m33 > 0.0f) { min.z += m.m33 * oldmin.z; max.z += m.m33 * oldmax.z; } 
      else { min.z += m.m33 * oldmax.z; max.z += m.m33 * oldmin.z; } 
    } 

    bool contains(const vec3d &a) { return (a.x >= min.x) && (a.x <= max.x) && (a.y >= min.y) && (a.y <= max.y) && (a.z >= min.z) && (a.z <= max.z); } 
    vec3d closest(const vec3d &a) { 
     vec3d r; 
     if (a.x < min.x) r.x = min.x; 
      else if (a.x > max.x) r.x = max.x; 
       else r.x = a.x; 

     if (a.y < min.y) r.y = min.y; 
      else if (a.y > max.y) r.y = max.y; 
       else r.y = a.y; 

     if (a.z < min.z) r.z = min.z; 
      else if (a.z > max.z) r.z = max.z; 
       else r.z = a.z; 
     return r; 
    } 
    }; 
    #endif 

另外,作为aditional的数据我只是想,因为它是一个海军游戏旋转的Y axix网。

感谢您的回答。

我承认从书中3D数学底漆图形和游戏开发的代码,但它不是完全一样的。我可以看到翻译部分可以工作,但不能轮换。 trans是为你的矩阵的翻译部分。在这本书中,边界框也被传递到方法中。在您找到的代码中,将其替换为保存旧的最小值和最大值以在方法中开始替换。代码会将最小值和最大值扩展到无穷大(只需添加开始和结束)。该代码优化,使得并非所有的8个点转变,而是如何利用一个点是由矩阵转换,并找出其中哪一个将有改造后的最小值。最小化总和的诀窍是将矩阵中9个元素中的每个元素的每个产品分别最小化。

这样的事情对我的作品......

public void add(float[] p) { 
    if (p[0] < mOriginalMin[0]) { 
     mOriginalMin[0] = p[0]; 
    } 
    if (p[0] > mOriginalMax[0]) { 
     mOriginalMax[0] = p[0]; 
    } 
    if (p[1] < mOriginalMin[1]) { 
     mOriginalMin[1] = p[1]; 
    } 
    if (p[1] > mOriginalMax[1]) { 
     mOriginalMax[1] = p[1]; 
    } 
    if (p[2] < mOriginalMin[2]) { 
     mOriginalMin[2] = p[2]; 
    } 
    if (p[2] > mOriginalMax[2]) { 
     mOriginalMax[2] = p[2]; 
    } 
} 

public void transform(Matrix44 mat) { 
    /** Get the translation part */ 
    mCurrMin[0] = mCurrMax[0] = mat.m[12]; 
    mCurrMin[1] = mCurrMax[1] = mat.m[13]; 
    mCurrMin[2] = mCurrMax[2] = mat.m[14]; 

    if (mat.m[0] > 0) { 
     mCurrMin[0] += mat.m[0] * mOriginalMin[0]; 
     mCurrMax[0] += mat.m[0] * mOriginalMax[0]; 
    } else { 
     mCurrMin[0] += mat.m[0] * mOriginalMax[0]; 
     mCurrMax[0] += mat.m[0] * mOriginalMin[0]; 
    } 
      .....etc etc. 

我认为,“反式”的意思翻译不变换(提示:这里有没有执行矩阵运算)。谈到变换和矩阵 - 你有答案。如果对象被旋转,翻译或缩放,那么你应该得到它的全局(世界)矩阵,并乘以它的最小值和最大值。然后重新计算你的中心。