C++,OpenGLについてです.

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NS
記事: 4
登録日時: 10年前

C++,OpenGLについてです.

#1

投稿記事 by NS » 10年前

静止した正方形の図形と,同じ大きさの正方形を回転させたものを描画したいのですが
同じ関数の中に二つ書くと,どちらとも回転してしまいます.どのようにすれば静止した正方形と回転させる正方形を書けるのでしょうか...

コードです.
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <time.h>

GLdouble vertex[][3] = {
{ 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0 }
};

int edge[][2] = {
{ 0, 1 },
{ 1, 2 },
{ 2, 3 },
{ 3, 0 },
{ 4, 5 },
{ 5, 6 },
{ 6, 7 },
{ 7, 4 },
{ 0, 4 },
{ 1, 5 },
{ 2, 6 },
{ 3, 7 }
};

void idle(void)
{
glutPostRedisplay();
}

void display(void)
{
int i;

static int r = 0; /* 回転角 */

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

/* 視点位置と視線方向 */
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

/* 図形の回転 */
glRotated((double)r, 0.0, 1.0, 0.0);

/* 図形の描画 */
glColor3d(0.0, 0.0, 1.0);
glBegin(GL_LINES);
for (i = 0; i < 12; ++i) {
glVertex3dv(vertex[edge[0]]);
glVertex3dv(vertex[edge[1]]);
}
glEnd();
glFlush();

/* 一周回ったら回転角を 0 に戻す */
if (++r >= 360) r = 0;
}

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 mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN) {
/* アニメーション開始 */
glutIdleFunc(idle);
}
else {
/* アニメーション停止 */
glutIdleFunc(0);
}
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN) {
/* コマ送り (1ステップだけ進める) */
glutPostRedisplay();
}
break;
default:
break;
}
}

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

void init(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
}

int main(int argc, char *argv[])
{
/* clock_t time_s, time_e;
long l;
time_s = clock();
fprintf("TIME %f", (double)(time_e - time_s) / CLOCKS_PER_SEC);
*/
printf("青い正方形を回転させて赤い正方形に重ねてください\n\n");
printf("左クリック早く回転\n");
printf("右クリック遅く回転\n");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
init();
glutMainLoop();
// time_s = clock();
return 0;

}
添付ファイル
無題2.png
無題2.png (28.18 KiB) 閲覧数: 3255 回

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C++,OpenGLについてです.

#2

投稿記事 by usao » 10年前

>静止した正方形の図形と,同じ大きさの正方形を回転させたものを描画

{静止したものの描画,回転したものの描画}処理は
それぞれコードのどの部分にあたるのでしょうか?

NS
記事: 4
登録日時: 10年前

Re: C++,OpenGLについてです.

#3

投稿記事 by NS » 10年前

回転させた正方形はDisplay関数の中で,静止させる正方形を同様にDisplay関数の中に入れると実行画面で何も表示されなくなったので,上のコードには書いてありません...

NS
記事: 4
登録日時: 10年前

Re: C++,OpenGLについてです.

#4

投稿記事 by NS » 10年前

すみません,書き方によっては二つとも回ってしまったり,二つとも表示されないの間違えです.
dislayFunkの中に書き記しています.

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C++,OpenGLについてです.

#5

投稿記事 by usao » 10年前

>上のコードには書いてありません

であれば,図形を描画するコードをもう一個追加する必要がありますよね.

>/* 図形の描画 */

の部分の図形描画コードを,
glRoteted()の手前にも入れたらどうでしょうか.

NS
記事: 4
登録日時: 10年前

Re: C++,OpenGLについてです.

#6

投稿記事 by NS » 10年前

下記のように書き直したところ,静止した正方形だけ描画され,回転する正方形は表示されませんでした.

void display(void)
{
int i;

static int r = 0; /* 回転角 */

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

/* 視点位置と視線方向 */
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

/*図形の描画*/
glPushMatrix();
glColor3d(0.0, 0.0, 1.0);
glBegin(GL_LINES);
for (i = 0; i < 12; ++i) {
glVertex3dv(vertex[edge[0]]);
glVertex3dv(vertex[edge[1]]);
}
glPopMatrix();

/* 図形の回転 */
glRotated((double)r, 0.0, 1.0, 0.0);

/* 図形の描画 */
glPushMatrix();
glColor3d(0.0, 0.0, 1.0);
glBegin(GL_LINES);
for (i = 0; i < 12; ++i) {
glVertex3dv(vertex[edge[0]]);
glVertex3dv(vertex[edge[1]]);
}
glPopMatrix();

glEnd();
glFlush();

/* 一周回ったら回転角を 0 に戻す */
if (++r >= 360) r = 0;
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C++,OpenGLについてです.

#7

投稿記事 by usao » 10年前

>>/* 図形の描画 */
>
>の部分の図形描画コードを,
>glRoteted()の手前にも入れたらどうでしょうか.

…を,コードで書いてみました.
これだとうまく表示されないでしょうか.

コード:

void display(void)
{
    int i;

    static int r = 0; /* 回転角 */

    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();

    /* 視点位置と視線方向 */
    gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    /* ↓↓↓ ここを増やした ↓↓↓ */
    glColor3d(1.0, 0.0, 0.0);
    glBegin(GL_LINES);
    for (i = 0; i < 12; ++i) {
        glVertex3dv(vertex[edge[i][0]]);
        glVertex3dv(vertex[edge[i][1]]);
    }
    glEnd();
    /* ↑↑↑ ここを増やした ↑↑↑ */

    /* 図形の回転 */
    glRotated((double)r, 0.0, 1.0, 0.0);

    /* 図形の描画 */
    glColor3d(0.0, 0.0, 1.0);
    glBegin(GL_LINES);
    for (i = 0; i < 12; ++i) {
        glVertex3dv(vertex[edge[i][0]]);
        glVertex3dv(vertex[edge[i][1]]);
    }
    glEnd();

    glFlush();

    /* 一周回ったら回転角を 0 に戻す */
    if (++r >= 360) r = 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る