2

メッシュツールキット用の簡単なビジュアライザーを作成する必要があります。作業しているオブジェクトは常に[-1,1]^3ボックス(両端を含む)内にあるため、オブジェクトがユーザーに完全に表示されるようにする必要があります。また、ユーザーがオブジェクトの周りを「飛んでいる」ように、オブジェクトの周りでカメラを回転させる可能性も必要です。

それが私がこれをしている方法です:

static void Reshape(int w, int h)
{
    glViewport(0,0,(GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float maxDistance = sqrt(2);
    if (w <= h)
    {
        glOrtho(-maxDistance, maxDistance, -maxDistance * (GLfloat)h / (GLfloat)w,
            maxDistance * (GLfloat)h / (GLfloat)w, -6.0, 6.0);
    }
    else
    {
        glOrtho(-maxDistance * (GLfloat)w / (GLfloat)h, maxDistance * (GLfloat)w / (GLfloat)h,
            -maxDistance, maxDistance, -6.0, 6.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

static void PolarView(GLdouble distance, GLdouble twist, GLdouble elevation)
{
    double centerx, centery, centerz;
    double eyex, eyey, eyez;

    eyex = distance * cos(-twist) * cos(elevation);
    eyey = distance * sin(-twist) * cos(elevation);
    eyez = distance * sin(elevation);
    centerx = centery = centerz = 0;

    gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, 0, 0, 1);
}

Reshape関数は初期設定中に呼び出され、ビジュアライザーコントロールのサイズを変更するたびに、3の平方根よりも大きい角度と距離でPolarView関数が再描画ごとに呼び出されます(本当に重要ですか?)。このコードは、立方体や球体などの凸型オブジェクトでは正常に機能しますが、トーラスオブジェクトでは問題が発生するため(一部の面が他の面から見える)、深度テストに関するものだと思います。セットアップの何が問題になっていますか?スクリーンショット: インターネットで検索したところ、近距離平面と遠距離平面のパラメーターに問題がある場合に、このような問題が発生する可能性があることがわかりました。私の場合、これらの正しい値は何ですか?私の描画手順は次のようになります。
悪いトーラス
悪いトーラスがいっぱい

glEnable(GL_DEPTH_TEST);
glClearDepth(1);
glPolygonMode(GL_FRONT, GL_LINE); // Changing of GL_LINE to GL_FILL doesn't fixing my problem, it just changing the appearance of the model.
glClearColor(BackColor.R / 255.0f, BackColor.G / 255.0f, BackColor.B / 255.0f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
PolarView(sqrt(3), _phi, _theta);
// .. only draws 

私のPIXELFORMATDESCRIPTOR:

        PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        24,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        32, // Depth buffer size
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,
        0,
        0
    };

私はこれを回避するいくつかの方法を見つけました:

  • 近くの飛行機と遠くの飛行機の値を入れ替える
  • [OK]に設定glDepthFuncするGL_GREATERと 、エラーが偶数個でもコードは正常に機能します。しかし、最初のエラーはどこにありますか?glClearDepth0
4

2 に答える 2

2

OpenGL FAQ 12を読みましたか?

コードで疑わしいと思われる点の 1 つは、ネガ ニア プレーンです。負の Z 値はカメラの後ろにあります。これは通常、3D シーンをレンダリングする際の間違いです。ただし、それ自体で問題が発生することはありません。Z の範囲 [-6,6] は、この種のシーンに十分な精度を提供するはずです。

お電話glEnable(GL_DEPTH_TEST)ですか?各フレームに渡しGL_DEPTH_BUFFER_BITていますか?glClear

更新: に電話していますglPolygonMode(GL_FRONT, GL_LINE)。これは、前面三角形がアウトラインのみで描画されることを意味します。つまり、前面三角形 A が別の前面三角形 B と重なる場合、A を通して B の端まで見ることができます。凸状のボディでは、これは起こりません。 、そのため、問題に気付かないでください。

三角形で背後の三角形を覆い隠したい場合は、 mode を使用してそれらを塗りつぶす必要がありますGL_FILL。ワイヤーフレームの図を取得するには、次のようにモデルを白い塗りつぶしで描画し、次にモデルを黒いアウトラインで再度描画する必要があります。

glDepthFunc(GL_LEQUAL);
glPolygonMode(GL_FRONT, GL_FILL);
/* モデルを白で描画 */
glDepthFunc(GL_EQUAL);
glPolygonMode(GL_FRONT, GL_LINE);
/* モデルを再び黒で描画します */

モデルの 2 回目のパスでは、カメラに近い (つまり、Z が低い) 最初のパスで描かれた三角形によって隠されない輪郭のみを描きたいという考えです。

別のアイデア: カメラが間違った方向を向いている可能性があります。これは、glFrustum パースペクティブではまったくなく、glOrtho パースペクティブでシーンが正しく描画されない理由を説明します。glOrtho の場合、シーン全体がカメラの後ろに描かれています。そのため、Z オーダーが逆になっています。ニア プレーンを正の数に設定すると、シーン全体がカリングされます。

于 2009-02-22T15:58:23.573 に答える
0

「8.070モデル全体を表示するビューを自動的に計算するにはどうすればよいですか?(境界球と上向きのベクトルを知っています)」OpenGLFAQ8のエントリが私の質問に答えます。ただし、私の設定は少し異なります。これが、書き直したPolarView関数とReshape関数です。

static void Reshape(int w, int h)
{
    float diameter = sqrt(3);
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLdouble zNear = 1;
    GLdouble zFar = zNear + diameter * 2;
    GLdouble left = -diameter;
    GLdouble right = diameter;
    GLdouble top = -diameter;
    GLdouble bottom = diameter;
    double aspect = (double)w / (double)h;
    if (aspect < 1)
    {
        bottom /= aspect;
        top /= aspect;
    }
    else
    {
        left *= aspect;
        right *= aspect;
    }
    glOrtho(left, right, bottom, top, zNear, zFar);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

static void PolarView(GLdouble twist, GLdouble elevation)
{
    float diameter = sqrt(3);
    double distance = diameter * 2;
    double centerx, centery, centerz;
    double eyex, eyey, eyez;

    eyex = distance * cos(twist) * cos(elevation);
    eyey = distance * sin(twist) * cos(elevation);
    eyez = distance * sin(elevation);
    centerx = centery = centerz = 0;
    gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, 0, 0, 1);
}  
于 2009-02-23T10:41:39.053 に答える