静止した正方形の図形と,同じ大きさの正方形を回転させたものを描画したいのですが
同じ関数の中に二つ書くと,どちらとも回転してしまいます.どのようにすれば静止した正方形と回転させる正方形を書けるのでしょうか...
コードです.
#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;
}
C++,OpenGLについてです.
Re: C++,OpenGLについてです.
>静止した正方形の図形と,同じ大きさの正方形を回転させたものを描画
{静止したものの描画,回転したものの描画}処理は
それぞれコードのどの部分にあたるのでしょうか?
{静止したものの描画,回転したものの描画}処理は
それぞれコードのどの部分にあたるのでしょうか?
Re: C++,OpenGLについてです.
回転させた正方形はDisplay関数の中で,静止させる正方形を同様にDisplay関数の中に入れると実行画面で何も表示されなくなったので,上のコードには書いてありません...
Re: C++,OpenGLについてです.
すみません,書き方によっては二つとも回ってしまったり,二つとも表示されないの間違えです.
dislayFunkの中に書き記しています.
dislayFunkの中に書き記しています.
Re: C++,OpenGLについてです.
>上のコードには書いてありません
であれば,図形を描画するコードをもう一個追加する必要がありますよね.
>/* 図形の描画 */
の部分の図形描画コードを,
glRoteted()の手前にも入れたらどうでしょうか.
であれば,図形を描画するコードをもう一個追加する必要がありますよね.
>/* 図形の描画 */
の部分の図形描画コードを,
glRoteted()の手前にも入れたらどうでしょうか.
Re: C++,OpenGLについてです.
下記のように書き直したところ,静止した正方形だけ描画され,回転する正方形は表示されませんでした.
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;
}
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;
}
Re: C++,OpenGLについてです.
>>/* 図形の描画 */
>
>の部分の図形描画コードを,
>glRoteted()の手前にも入れたらどうでしょうか.
…を,コードで書いてみました.
これだとうまく表示されないでしょうか.
>
>の部分の図形描画コードを,
>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;
}