1

私はインターネットで見つけた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

また、追加データとして、海軍のゲームであるため、Y-axixでメッシュを回転させたいだけです。

回答ありがとうございます。

4

2 に答える 2

1

グラフィックスとゲーム開発のための本の3D数学入門書からのコードを認識していますが、まったく同じではありません。平行移動部分は機能しますが、回転は機能しないことがわかります。トランスは、マトリックスの翻訳部分となることを目的としています。この本では、バウンディングボックスもメソッドに渡されます。見つけたコードでは、これは削除され、メソッドで開始する古い最小値と最大値を保存するように置き換えられています。このコードは、最小値と最大値を無限大に拡張します(追加するだけです)。コードは、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.
于 2013-11-28T22:24:04.800 に答える
0

「trans」は変換ではなく変換を意味すると思います(ヒント:ここでは行列演算は実行されていません)。変換と行列について言えば、あなたの答えがあります。オブジェクトが回転、平行移動、またはスケーリングされている場合は、そのグローバル(ワールド)マトリックスを取得し、最小値と最大値にそれを掛ける必要があります。次に、センターを再計算します。

于 2013-02-19T18:41:44.513 に答える