0

次のコードを実装しようとしています。

http://www.lighthouse3d.com/tutorials/view-frustum-culling/geometric-approach-implementation/

グラフィック エンジンでフラスタム カリングを使用する必要があります。

私の機能は次のとおりです。

void frustum::updateCameraData()
{
    float _ratio = float(globalData::windowWidth/globalData::windowHeight);
    // store the information
    this->ratio = _ratio;
    this->angle = globalData::cameraAngle;
    this->nearD = globalData::zNear;
    this->farD = globalData::zFar;

    // compute width and height of the near and far m_frustumane sections
    tang = (float)tan(PI * globalData::cameraAngle * 0.5) ;
    nh = nearD * tang;
    nw = nh * _ratio;
    fh = farD  * tang;
    fw = fh * _ratio;

}

    void frustum::extractFrustum(vector3f camPosition, vector3f camDirection, vector3f camUp)
{
    cout << "camPosition = ";
    camPosition.print();
    cout << " camDirection = ";
    camDirection.print();
    cout << " camUp = ";
    camUp.print();
    cout << "\n";
    vector3f dir,nc,fc,X,Y,Z,Zn;


    // compute the Z axis of camera
    // this axis points in the opposite direction from
    // the looking direction
    Z = camPosition - camDirection;
    Z.Normalize();

    // X axis of camera with given "up" vector and Z axis
    X = camUp * Z;
    X.Normalize();

    // the real "up" vector is the cross product of Z and X
    Y = Z * X;

    // compute the centers of the near and far planes
    nc = camPosition - Z * nearD;
    fc = camPosition - Z * farD;

    // compute the 4 corners of the frustum on the near plane
    ntl = nc + Y * nh - X * nw;
    ntr = nc + Y * nh + X * nw;
    nbl = nc - Y * nh - X * nw;
    nbr = nc - Y * nh + X * nw;

    // compute the 4 corners of the frustum on the far plane
    ftl = fc + Y * fh - X * fw;
    ftr = fc + Y * fh + X * fw;
    fbl = fc - Y * fh - X * fw;
    fbr = fc - Y * fh + X * fw;



    Zn = vector3f(-Z.x,-Z.y,-Z.z);
    m_frustum[NEARP].setNormalAndPoint(Zn,nc);
    m_frustum[FARP].setNormalAndPoint(Z,fc);

    vector3f aux,normal;

    aux = (nc + Y*nh) - camPosition;
    aux.Normalize();
    normal = aux * X;
    Zn = nc+Y*nh;
    m_frustum[TOP].setNormalAndPoint(normal,Zn);

    aux = (nc - Y*nh) - camPosition;
    aux.Normalize();
    normal = X * aux;

    Zn = nc-Y*nh;
    m_frustum[BOTTOM].setNormalAndPoint(normal,Zn);

    aux = (nc - X*nw) - camPosition;
    aux.Normalize();
    normal = aux * Y;

    Zn = nc-X*nw;
    m_frustum[LEFT].setNormalAndPoint(normal,Zn);

    aux = (nc + X*nw) - camPosition;
    aux.Normalize();
    normal = Y * aux;

    Zn = nc+X*nw;
    m_frustum[RIGHT].setNormalAndPoint(normal,Zn);

}

bool frustum::pointInFrustum( float x, float y, float z )
{
    vector3f point = vector3f(x,y,z);

    for(int i=0; i < 6; i++)
    {
        cout << "m_frustum[i].distance(point) = "<< m_frustum[i].distance(point) <<" < 0\n";
        if (m_frustum[i].distance(point) < 0)
        {
            return false;
        }
    }
    return true;
}



/*this is used to calculate the distance of point to plane*/

float distance(vector3f &p) {

    return (d + normal.innerProduct(p));
}

ただし、望ましくない結果が得られます (これは私のデバッグ メッセージです)。

   camPosition = (0, 15, 40) camDirection = (0, 0, 0) camUp = (0, 1, 0)

NO DRAWN: object0
posicion: -20,0,-20
/*object position*/ vector3f point = vector3f(-20,0,-20)
m_frustum[0].distance(point) = 14.7867 < 0
/*object position*/ vector3f point = vector3f(-20,0,-20)
m_frustum[1].distance(point) = 14.485 < 0
/*object position*/ vector3f point = vector3f(-20,0,-20)
m_frustum[2].distance(point) = 14.2216 < 0
/*object position*/ vector3f point = vector3f(-20,0,-20)
m_frustum[3].distance(point) = -15.0501 < 0
NO DRAWN: object1
posicion: 0,0,-20
/*object position*/ vector3f point = vector3f(0,0,-20)
m_frustum[0].distance(point) = 14.7867 < 0
/*object position*/ vector3f point = vector3f(0,0,-20)
m_frustum[1].distance(point) = 14.485 < 0
/*object position*/ vector3f point = vector3f(0,0,-20)
m_frustum[2].distance(point) = 14.2216 < 0
/*object position*/ vector3f point = vector3f(0,0,-20)
m_frustum[3].distance(point) = -15.0501 < 0
NO DRAWN: object2
posicion: 20,0,-7
/*object position*/ vector3f point = vector3f(20,0,-7)
m_frustum[0].distance(point) = 14.7867 < 0
/*object position*/ vector3f point = vector3f(20,0,-7)
m_frustum[1].distance(point) = 14.485 < 0
/*object position*/ vector3f point = vector3f(20,0,-7)
m_frustum[2].distance(point) = 14.2216 < 0
/*object position*/ vector3f point = vector3f(20,0,-7)
m_frustum[3].distance(point) = -15.0501 < 0
NO DRAWN: object3
posicion: -40,0,-20
/*object position*/ vector3f point = vector3f(-40,0,-20)
m_frustum[0].distance(point) = 14.7867 < 0
/*object position*/ vector3f point = vector3f(-40,0,-20)
m_frustum[1].distance(point) = 14.485 < 0
/*object position*/ vector3f point = vector3f(-40,0,-20)
m_frustum[2].distance(point) = 14.2216 < 0
/*object position*/ vector3f point = vector3f(-40,0,-20)
m_frustum[3].distance(point) = -15.0501 < 0

どのオブジェクトもテストに合格しませんでした (各オブジェクトの位置としてポイントを使用して、pointInFrustrum() でテストしました。

錐台カリングなしでシーンをレンダリングすると、すべてが完璧に見えますが、実際に使用してみると、テストに合格するものは何もありません。どこでエラーが発生する可能性がありますか? (コードは、私が上で言及したリンクです)。

すべてのオブジェクトは視野内にあります...

マトリックスは glm::mat4; で管理されます。

編集:

修正後、カメラを少し下に向けるとオブジェクトが描画されますが、カメラを少し上に向けるとすべてのオブジェクトが完全に消えます (今回は描画されません)。何が起こっているのか知っていますか?前もって感謝します。

カメラが下向きの場合:

ここに画像の説明を入力

カメラが少し上を向いている場合:

ここに画像の説明を入力

4

1 に答える 1

0

私はついに問題を解決することができました。それは平面の計算にありました(私はマトリックスを使用していませんでした)、それを変更したところ、すべてが完璧に機能しました。

于 2014-08-17T03:23:10.433 に答える