もっと大量のポリゴンを

OpenGLで作るiPhone SDKゲームプログラミング - 6章

レースゲーム(3D)

6-5 車の描画

車のタイヤ部分は、前回のタイヤバリアと全く同じ要領で、VBOを使って実装しました。車のボディ部の座標は、サンプルをダウンロードしたときについてたCSVファイルを読み込んで、タイヤとは別のVBOとして実装しました。CSVの内容は、

X座標,Y座標,Z座標,U座標,V座標
X座標,Y座標,Z座標,U座標,V座標
X座標,Y座標,Z座標,U座標,V座標
//...

というとてもシンプルなものでした。

あとは、タイヤをマトリクス変換を使って4箇所に描画し、その上にボディを乗せてやればOK。

void HelperDrawCar(CpCar& car, CpVboBinder3D& body, GLuint bodyTexture, CpVboBinder3D& tyre, GLuint tyreTexture)
{
    glPushMatrix();
    {
        // 車の位置まで移動する
        glTranslatef(car.GetPosX(), car.GetPosY(), 0.001f);
        glRotatef(car.GetAngle(), 0.0f, 0.0f, 1.0f);
        glScalef(car.GetSize() / 2, car.GetSize() / 2, car.GetSize() / 2);
        
        // ボディを描画する
        body.Draw(bodyTexture);
        
        // タイヤを描画する
        glPushMatrix();
        {
            // 地面に埋もれてしまうのを避けるために少し上にあげる
            glTranslatef(0.0f, 0.0f, 0.4f);

            // フロントタイヤを描画する
            glPushMatrix();
            {
                // 操舵角を決定する
                static float frontTyreAngle = 0.0f;
                float currentFrontTyreAngle = 0.0f;

                if (car.IsControlLeftOn())
                {
                    currentFrontTyreAngle -= 30.0f;
                }

                if (car.IsControlRightOn())
                {
                    currentFrontTyreAngle += 30.0f;
                }

                //--前輪角度を -30.0 〜 +30.0 の間で制御
                frontTyreAngle += (currentFrontTyreAngle - frontTyreAngle) * 0.3f;

                // 車は右向きで初期化されているので、X軸正方向にフロントタイヤを移動する
                glTranslatef(0.75f, 0.0f, 0.0f);

                // フロント左タイヤを描画する
                glPushMatrix();
                {
                    glTranslatef(0.0f, 0.75f, 0.0f);
                    glRotatef(frontTyreAngle, 0.0f, 0.0f, -1.0f);
                    glRotatef(car.GetTyreRotation(), 0.0f, 1.0f, 0.0f);
                    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
                    tyre.Draw(tyreTexture);
                }
                glPopMatrix();


                // フロント右タイヤを描画する
                glPushMatrix();
                {
                    glTranslatef(0.0f, -0.75f, 0.0f);
                    glRotatef(frontTyreAngle, 0.0f, 0.0f, -1.0f);
                    glRotatef(car.GetTyreRotation(), 0.0f, 1.0f, 0.0f);
                    glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
                    tyre.Draw(tyreTexture);
                }
                glPopMatrix();
            }
            glPopMatrix();

            // リアタイヤを描画する
            glPushMatrix();
            {
                glTranslatef(-0.75f, 0.0f, 0.0f);

                // リア左タイヤを描画する
                glPushMatrix();
                {
                    glRotatef(car.GetTyreRotation(), 0.0f, 1.0f, 0.0f);
                    glTranslatef(0.0f, 0.75f, 0.0f);
                    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
                    tyre.Draw(tyreTexture);
                }
                glPopMatrix();

                // リア右タイヤを描画する
                glPushMatrix();
                {
                    glRotatef(car.GetTyreRotation(), 0.0f, 1.0f, 0.0f);
                    glTranslatef(0.0f, -0.75f, 0.0f);
                    glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
                    tyre.Draw(tyreTexture);
                }
                glPopMatrix();
            }
            glPopMatrix();
        }
        glPopMatrix();
    }
    glPopMatrix();
}

車が一気にリッチになった!

SSでは伝わりませんが、動いている間はタイヤがくるくると回るし、フロントタイヤは旋回時にちゃんと傾くし、左右旋回のときに10フレームかけてカメラアングルが車アングルを追いかけるようにしたので、だいぶそれっぽく見えます。