ここから本文です

授業でvisual stadioを使ってOpenGLによるCGプログラミングをしています。 私は...

pok********さん

2017/12/2202:14:20

授業でvisual stadioを使ってOpenGLによるCGプログラミングをしています。

私はプラネタリウムを作ろうとしているのですが、星座線の表示がうまくいきません。

どうすればうまくいくでしょうか?

一番下に簡易版のコードを載せます。
問題になっているのはdisplayの下の方、星座線のところです。
このプログラムを実行すると画像上のように星が描画されています。
しかし、本来であれば画像下のように線も描画されるはずなのです。
なぜ描画されないのでしょうか?


以下、簡易版コード

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#define KEY_ESC 27
#define PAI 3.1415926536

void resetview(void);
int xBegin, yBegin;
int mButton;
float theta1 = 0.0, theta2 = 0.0, theta3 = 0.0;
float lati = 35.0;//緯度


void display(void)
{
float star[6][3] =
{
{40.0,89.0,2.0},
{36.0,80.0,4.5},
{95.0,76.0,2.5},
{180.0,81.0,5.0},
{235.0,70.0,1.5},
{275.0,80.0,4.7}
};
int line[6][2] =
{
{0,1},
{1,2},
{0,3},
{3,4},
{4,5},
{5,0}
};

float x, y, z, r, h, d = 150.0, m = 1.0;
int i, j, num, n = 100;


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);

glPushMatrix();//1
glRotatef(theta1, 1.0, 0.0, 0.0);//マウスで動かす
glRotatef(theta2, 0.0, 1.0, 0.0);
glPushMatrix();//2
glTranslatef(0.0, -1.0, 0.0);
glRotatef(180.0, 0.0, 1.0, 0.0);//初期を北向きに


glPushMatrix();//3
glRotatef(90.0, 1.0, 0.0, 0.0);
glColor3f(0.2, 0.2, 0.2);

glBegin(GL_POLYGON);//地面
for(i=0; i<n; i++){
r = d;
x = r * cos(2.0 * PAI * (float)i / (float)n);
y = r * sin(2.0 * PAI * (float)i / (float)n);
z = 0.0;
glVertex3f(x, y, z);
}
glEnd();

glPopMatrix();//3

glPushMatrix();//4
if(lati >= 0){//緯度調整
glRotatef(90.0 - lati, 1.0, 0.0, 0.0);}
else{
glRotatef(180.0, 0.0, 0.0, 1.0);
glRotatef(90.0 + lati, 1.0, 0.0, 0.0);}

glRotatef(theta3, 0.0, 1.0, 0.0);//星の動き
for(i=0;i<6;i++){

glPushMatrix();//5
glRotatef(star[i][0], 0.0, 1.0, 0.0);
glRotatef(star[i][1], 1.0, 0.0, 0.0);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);//星
for(j=0; j<n; j++){
r = (6.0 - star[i][2]) / 5.0;
x = r * cos(2.0 * PAI * (float)j / (float)n);
y = r * sin(2.0 * PAI * (float)j / (float)n);
z = -d;
glVertex3f(x, y, z);
}
glEnd();
glPopMatrix();//5
}

glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);//星座線
for(i=0; i<6; i++){
for(j=0; j<2; j++){
glPushMatrix();//10
num = line[i][j];
glRotatef(star[num][0],0.0, 1.0, 0.0);
glRotatef(star[num][1],1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, -d);
glPopMatrix();//10
}
}
glEnd();

glPopMatrix();//4

glPopMatrix();//2
glPopMatrix();//1
glDisable(GL_DEPTH_TEST);
glutSwapBuffers();

}

void myKbd(unsigned char key, int x, int y)
{
switch(key) {
case KEY_ESC:
exit(0);
}
glutPostRedisplay();
}

void myMouse(int button, int state, int x, int y)
{
if(state == GLUT_DOWN){
switch(button){
case GLUT_LEFT_BUTTON:
mButton = button;
break;
}
xBegin = x;
yBegin = y;
}
}

void myMotion(int x, int y)
{
int xDisp, yDisp;

xDisp = x - xBegin;
yDisp = y - yBegin;

switch (mButton) {
case GLUT_LEFT_BUTTON://視点の向きを変える
theta1 -= (float)yDisp / 6.0;
if(theta1 > 90.0){
theta1 = 90.0;}
else if(theta1 < -90.0){
theta1 = -90.0;}
theta2 -= (float)xDisp / 6.0;
break;
}
xBegin = x;
yBegin = y;
glutPostRedisplay();
}

void myInit(char *progname)
{
int width = 1500, height = 900;
float aspect = (float)width / (float)height;

glutInitWindowPosition(0, 0);
glutInitWindowSize(width, height);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutCreateWindow(progname);
glClearColor(0.0, 0.0, 0.0, 1.0);

glutKeyboardFunc(myKbd);
glutMouseFunc(myMouse);
glutMotionFunc(myMotion);
resetview();

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75.0, aspect, 0.1, 200.0);
glMatrixMode(GL_MODELVIEW);
}

void resetview(void)
{
theta1 = 0.0;
theta2 = 0.0;
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
myInit(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return(0);
}

glRotatef,glPushMatrix,glPopMatrix,void resetview,theta1,glBegin-glEnd,glBegin-glEnd内

閲覧数:
37
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

fkh********さん

2017/12/2220:36:08

glBegin-glEnd内で行列操作は出来ませんので、自分でsin, cos等を使って座標を計算する必要があります。

質問した人からのコメント

2017/12/26 12:25:57

そういうことだったのですね。
知りませんでした。
ありごとうございます!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる