質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

OpenGLの使い方について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 382

beginee

score 1

OpenGlの使い方を知りたいです。
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(-0.5, 0.5);
glVertex2f( 0.5, 0.5);
glVertex2f( 0.5,-0.5);
glVertex2f(-0.5,-0.5);
glEnd();
上のコードを使って球体とかも作れるんでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fana

    2020/06/03 16:58

    話そのものを変更するのはやめてください.
    質問文と回答,コメントの内容がミスマッチになると,読んだ人には全く意味がわからなくなってしまいます.
    別の話をする場合には,別の新規の質問としてください.

    キャンセル

回答 1

checkベストアンサー

0

話の内容的には,

  • いくつの箱が必要で
  • それぞれの箱をどこに配置すべきか

という,算数の話であろうと思います.

とりあえず,forとかを用いずに(というか別にコードとして書かなくてもいいので)
N段のピラミッドに関して各箱を置くべき座標を列挙してみるとよいでしょう.
何パターンかのNに関する座標値を眺めてみて,それらの座標値に法則性を見出してから「だったら forでこう書けば良いんじゃね?」という実装に移ると良いでしょう.


追記:コード案

//様子が見やすいようにてきとーに回転してみる用の角度
double RotAngle = 0;

void OnTimer(int)
{//回転量を変更して再描画を促す
    RotAngle += 1;
    if( RotAngle > 360 )RotAngle -= 360;
    glutPostRedisplay();
    glutTimerFunc( 50, OnTimer, 0 );
}

//
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    //視点設定:見やすい位置に調整してどうぞ
    gluLookAt(0.0, 2.0, 13.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
    //様子が見やすいようにY軸まわりに回転してみる(回転量はOnTimerで一定時間ごとに変更している)
    glRotated( RotAngle, 0,1,0 );

    {//座標がわかりやすいように原点から3軸方向に線を描画
        glBegin( GL_LINES );
        {
            const double AxisLength = 3.5;  //線の長さ.てきとー.
            glColor3d( 1,0,0 ); glVertex3d( 0,0,0 );    glVertex3d( AxisLength,0,0 );
            glColor3d( 0,1,0 ); glVertex3d( 0,0,0 );    glVertex3d( 0,AxisLength,0 );
            glColor3d( 0,0,1 ); glVertex3d( 0,0,0 );    glVertex3d( 0,0,AxisLength );
        }
        glEnd();
    }
    {//ピラミッド描画
        const int N = 5;    //これがピラミッドの段数
        const double UnitSize = 0.5;    //全体的なサイズ(ピラミッド最上段のCubeのサイズ)
        glColor3d( 1,1,1 );

        for( int i=0; i<N; ++i )//N段分のループ
        {
            glPushMatrix();
            {
                //段に応じてY方向に位置をずらす
                const double Y_Offset = (i+0.5) * UnitSize;
                glTranslated( 0, Y_Offset, 0 );
                //段に応じて,XY方向の大きさを決める
                const double XZ_Scale = UnitSize * (N - i);
                glScaled( XZ_Scale, UnitSize, XZ_Scale );
                //
                glutWireCube( 1 );
            }
            glPopMatrix();
        }
    }
    glFlush();
}

void resize(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {//qキーかESCキーで終了させる
    case 'q':
    case 'Q':
    case '\033': /* '\033' は ESC の ASCII コード */
        exit(0);
    default:
        break;
    }
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(display);
    glutReshapeFunc(resize);
    //glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutTimerFunc( 50, OnTimer, 0 );
    glClearColor(0, 0, 0, 1.0);
    glutMainLoop();
    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/03 13:44

    コード提示は遠慮したい:GLUT(あるいはそれに準じる物)の用意とかがわりと面倒なうえ,残念ながら本件の内容的に取り組んでもこちらに得るものが無いと思うので……

    それはそれとして,【各段を「1個の(立方体ではない,平べったい)箱」として,段ごとに箱のサイズを変える】という方針ならば,(glutSolidCube()は何もしないと箱の中心位置が原点になるので)段ごとに高さ方向にだけ位置をオフセットしてやれば済むと思いますが,それも無理ですか?

    キャンセル

  • 2020/06/03 15:31 編集

    なんとか解けました。
    アイデア提供ありがとうございます

    キャンセル

  • 2020/06/03 16:29 編集

    一応,「こんな感じでどうか?」的なコードを追記.
    ({ライティングなし,ピラミッドはワイヤーフレーム描画}な簡易状態ですが,そこらへんはメイン話題の算数部分とは無関係なので.)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る