我有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中旋转网格,因为它是一个海军游戏。
感谢您的回答。
答案 0 :(得分:1)
我认识到图书和游戏开发的3D数学入门书中的代码,但它并不完全相同。我可以看到翻译部分可以工作但不能轮换。 trans意味着你的矩阵的翻译部分。在本书中,边界框也传入方法。在您找到的代码中,删除了替换为保存旧的最小值和最大值以在方法中开始。代码会将最小值和最大值扩展为无穷大(只需添加,然后再打开)。优化代码,以便不是所有8个角点都被转换,而是利用矩阵如何转换点并确定转换后哪一个具有最小值。最小化整个总和的技巧是为矩阵中的每个元素单独最小化每个产品。
这样的事情对我有用......
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.
答案 1 :(得分:0)
我认为'trans'意味着不转换(提示:这里没有执行矩阵运算)。说到变换和矩阵 - 有你的答案。如果对象被旋转,平移或缩放,那么你应该获得它的全局(世界)矩阵并乘以它的最小值和最大值。然后重新计算你的中心。