1

C ++のopenglでピラミッドを動かそうとしていますが、ピラミッドが向いている方向に前進させようとしています。しかし、私はこれを行う方法を理解できないようです。これは私のピラミッドを描画するための私のコードです:

void drawTriangle()
{
    //back
    glBegin(GL_POLYGON);
        glColor3f(1,0,0);
        glVertex3f(-1,-1,-1);
        glVertex3f(1,-1,-1);
        glVertex3f(0,1,0);
    glEnd();

    //front
    glBegin(GL_POLYGON);
        glColor3f(0,1,0);
        glVertex3f(-1,-1,1);
        glVertex3f(1,-1,1);
        glVertex3f(0,1,0);
    glEnd();

    //right
    glBegin(GL_POLYGON);
        glColor3f(0,0,1);
        glVertex3f(1,-1,-1);
        glVertex3f(1,-1,1);
        glVertex3f(0,1,0);
    glEnd();

    //left
    glBegin(GL_POLYGON);
        glColor3f(1,1,0);
        glVertex3f(-1,-1,-1);
        glVertex3f(-1,-1,1);
        glVertex3f(0,1,0);
    glEnd();

    //bottom
    glBegin(GL_POLYGON);
        glColor3f(1,0,1);
        glVertex3f(-1,-1,-1);
        glVertex3f(1,-1,-1);
        glVertex3f(1,-1,1);
        glVertex3f(-1,-1,1);
    glEnd();
}

これは、ピラミッドが画面に描画される方法です。

glPushMatrix();
    glTranslatef(Xtri,0,Ztri);
    glRotatef(heading,0,1,0);
    drawTriangle();
    glPopMatrix();

    glFlush();

そして、ピラミッドが移動できるように変数が更新される方法は次のとおりです。

void processKeys()
{
    if(keys[VK_LEFT])
    {
        heading-=1.0f;
    }
    if(keys[VK_RIGHT])
    {
        heading+=1.0f;
    }
    if(keys[VK_UP])
    {
        Vtri-=0.001f;
    }
    if(keys[VK_DOWN])
    {
        Vtri+=0.001f;
    }
}
void update()
{
    Xtri += Vtri*cos((90+heading)*(PI/180.0f));
    Ztri += Vtri*sin((90+heading)*(PI/180.0f));
}

赤または背面がピラミッドの移動方向になりたい面になるように、ピラミッドを前方に移動させようとしていますが、このコードを使用すると、まったく機能せず、移動します非常に面白い方法で。

4

3 に答える 3

2

これを行う方法の 1 つを次に示します。これは Direct3D に基づいていますが、OpenGL と非常によく似ていると思います。

ピラミッドに 2 つのベクトルを用意します。1 つは位置を含み、もう 1 つは回転を含みます。最初はどちらも 0,0,0 に初期化されています。また、最初はオブジェクトの方向を向いている方向ベクトル (例: 1,0,0) と速度を再び 0 に設定します。

a または d を押して、回転ベクトルの y 要素を目的の角度に調整します。同様に、w または s を押してオブジェクトの速度を調整します。動きを fps に依存しないようにするために、おそらくフレームのレンダリング時間を考慮に入れる必要があります。

次に、Y 軸を中心に回転行列を作成します。その行列を使用して、初期位置ベクトルを乗算することにより、新しい正規化されたベクトルを作成します。次に、速度を掛けたこのベクトルを位置座標に追加し、これらの座標を変換行列に使用します。

それが理にかなっていることを願っています。ここにいくつかの擬似コードがあります:

// in constructor:
x = y = z = 0.0f;   // position
ry = 0.0f;          // rotation
speed = 0.0f;
initVec(1,0,0);     // initial direction vector

// in event handler:
// upon key press adjust speed and/or ry

// in move():
// create rotation matrix around Y axis by ry = rotationMatrix

// use it to find new direction vector
newDirectionVector = initVec * rotationMatrix;

// adjust your position
x += newDirectionVector * speed;
y += newDirectionVector * speed;
z += newDirectionVector * speed;

glTranslatef(x, y, z);

// render
于 2012-11-21T04:06:41.500 に答える
0

オブジェクトが最初に原点にあると仮定して、変換の前に回転を行う必要があります(数学を正しく思い出せば)。適用される回転行列は軸 (0, 1, 0) を中心に回転すると思います。すでに新しい場所に移動している場合、その回転はあなたの位置と向きに影響します。

于 2012-11-20T21:14:34.800 に答える