コンピュータ グラフィックス: 3D インタラクティブ シーンの描画 (1)

OpenGL は、グラフィックスとハードウェア間のインターフェイスです。他のグラフィックス プログラム開発ツールと比較して、多数のグラフィックス機能を提供します。直感的なプログラミング環境により、3 次元グラフィックスの描画プロセスが簡素化されます。OpenGL を使用して 3 次元シーンを構築すると、インタラクションが可能になります。入力デバイスを介したオブジェクトの操作、シーン内のオブジェクトの相互作用。
ここに画像の説明を挿入します
デラックスシングルルーム

構成環境:vs22+freeglutライブラリ

1. 閉空間となるように壁を描き、閉空間内のシーンのレイアウトを完成させます

//空间基本架构
void drawWall()
{
    
    
    glColor3f(0.47, 0.54, 0.60);//rgb颜色可调
    GLfloat matWall[] = {
    
     0.37, 0.83, 0.98};
	GLfloat matBlack[] = {
    
     0, 0, 0, 1 };
	GLfloat matWhite[] = {
    
     1, 1, 1, 1 };
	GLfloat matShininess[] = {
    
     40 };
	glMaterialfv(GL_FRONT, GL_AMBIENT, matWall);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, matWall);
	glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
	glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
    // 左边
    drawQuads(-10, 10, -20,
        -10, 10, 0,
        -10, -10, 0,
        -10, -10, -20);
    // 右边
    drawQuads(10, -10, -20,
        10, -10, 0,
        10, 10, 0,
        10, 10, -20);
    // back
    drawQuads(10, 10, -20,
        -10, 10, -20,
        -10, -10, -20,
        10, -10, -20);
    // 天花板
    drawQuads(10, 10, -20,
        10, 10, 0,
        -10, 10, 0,
        -10, 10, -20);
    // 地板
    glColor3f(0.75, 0.75, 0.75);
    drawQuads(-10, -10, -20,
        -10, -10, 0,
        10, -10, 0,
        10, -10, -20);
}

glMaterialfv () 関数は、照明モデルのマテリアル パラメータを指定します。
ここに画像の説明を挿入します
2. ベッドを描いて隅に置きます(左)

void drawBed()
{
    
    
    glColor3f(1, 0.8, 0.5);
    glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
    glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
    // 床头
    glPushMatrix();
    glTranslatef(-9.5, -6, -16);
    glScalef(1, 8, 8);
    glutSolidCube(1);
    glPopMatrix();
    // 床尾
    glPushMatrix();
    glTranslatef(4.5, -8.5, -16);
    glScalef(1, 3, 8);
    glutSolidCube(1);
    glPopMatrix();
    //床板
    glPushMatrix();
    glTranslatef(-2, -7, -16);
    glScalef(14, 1, 8);
    glutSolidCube(1);
    glPopMatrix();
    //床垫
    glColor3f(0.6, 0.97, 0.6);
    glMaterialfv(GL_FRONT, GL_AMBIENT, matGreen);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, matGreen);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
    glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
    glPushMatrix();
    glTranslatef(-2, -6, -16);
    glScalef(14, 1, 8);
    glutSolidCube(1);
    glPopMatrix();
}

レンダリングは次のとおりです。
ここに画像の説明を挿入します
3. 部屋のいくつかの基本構成

void drawDesk()
{
    
    
    glColor3f(1, 0.8, 0.5);
    glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
    glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
	//书桌
    glPushMatrix();
    glTranslatef(9, -4, -10);
    glScalef(4, 0.5, 20);
    glutSolidCube(1);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(9.75, -7, -10);
    glScalef(0.5, 6, 20);
    glutSolidCube(1);
    glPopMatrix();
	//床头柜
	glPushMatrix();
    glTranslatef(-8, -8, -10);
    glScalef(4, 4, 4);
    glutSolidCube(1);
    glPopMatrix();
}

このテーブルを物理ブッシュに変換し
ここに画像の説明を挿入します、ティーポットブッシュを購入することをお勧めします。

void drawTeapot()
{
    
    
    glColor3f(0.80,0.71,0.34);
    glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
    glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);

    glPushMatrix();
    glTranslatef(-8, -5.5, -10);
    glRotatef(-100, 0, 1, 0);
    glutSolidTeapot(0.8);
    glPopMatrix();
}

ここに画像の説明を挿入します
まずここにシーンを書きましょう。他のアイテムを好きなように追加できます。次の記事は Android エルフの描画についてです。
完全なソース コードを入手するには、私をフォローしてコメント エリアにメールを残してください。

おすすめ

転載: blog.csdn.net/weixin_52049271/article/details/128315860