ここから本文です

プログラミングのC言語の問題なのですが、自分で何度やってもどうしてもわかりませ...

jag********さん

2019/5/2201:30:34

プログラミングのC言語の問題なのですが、自分で何度やってもどうしてもわかりません。教えて下さいお願いします。

以下の3次元オブジェクトを作成せよ

頂点と線分からのピラミッド
• cg6-1.cを参考、プリミティブ使用禁止

黄色の中身が詰まった円錐
円錐の上に紫の中身が詰まったドーナツをかぶる

円錐とドーナツはプリミティブを使用すること

視点を変えて別の角度から見せること

x,y,z軸を描画すること

描画したx,y,z軸はワールド座標系にす
ること
隠面処理も行うこと

画像は実行結果の例です。

これがcg6-1.cです。

include <stdlib.h>#include <GL/glut.h>#define KEY_ESC 27

/* 点の幾何情報 */
double vertex[][3]={
{0.0, 0.0, 0.0}, /* A */
{1.0, 0.0, 0.0}, /* B */
{1.0, 1.0, 0.0}, /* C */
{0.0, 1.0, 0.0}, /* D */
{0.0, 0.0, 1.0}, /* E */
{1.0, 0.0, 1.0}, /* F */
{1.0, 1.0, 1.0}, /* G */
{0.0, 1.0, 1.0}, /* H */
};

/* 線分情報 */
int edge[][2]={
{0, 1}, /* a (A-B)*/
{1, 2}, /* b (B-C)*/
{2, 3}, /* c (C-D)*/
{3, 0}, /* d (D-A)*/
{4, 5}, /* e (E-F)*/
{5, 6}, /* f (F-G)*/
{6, 7}, /* g (G-H)*/
{7, 4}, /* h (H-E)*/
{0, 4}, /* i (A-E)*/
{1, 5}, /* j (B-F)*/
{2, 6}, /* k (C-G)*/
{3, 7}, /* l (D-H)*/
};

/* x,y,z軸の描画 */
void xyzAxes(){
glBegin(GL_LINES);
glColor3d(1.0, 0.0, 0.0);
glVertex3d(0.0, 0.0, 0.0);
glVertex3d(1.0, 0.0, 0.0);

glColor3d(0.0, 1.0, 0.0);
glVertex3d(0.0, 0.0, 0.0);
glVertex3d(0.0, 1.0, 0.0);

glColor3d(0.0, 0.0, 1.0);
glVertex3d(0.0, 0.0, 0.0);
glVertex3d(0.0, 0.0, 1.0);
glEnd();
}

void myKeyboard(unsigned char key, int x, int y){
if(key == KEY_ESC)
exit(0);
}

void display(){
int i;

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();

/* 軸を描く */
xyzAxes();

glColor3d(1.0, 1.0, 1.0);
glTranslated(0.0, 0.0, -5.0);

/* --- 練習6-2 --- */

/* ------------------*/

glBegin(GL_LINES);

/* --- 練習6-1 --- */

/* ------------------*/

glEnd();

glPopMatrix();
glFlush();
}

void myInit(char *progname){
int width=500, height=500;
double aspect = (double)width/(double)height;

glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(width, height);
glutInitWindowPosition(0,0);
glutCreateWindow(progname);
glClearColor(0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc(myKeyboard);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(60.0, aspect, 1.0, 20.0);

/* --- 練習6-3 --- */

}

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

glVertex3d,glColor3d,XYZ軸,プリミティフ,glLoadIdentity,glTranslated,glPushMatrix

閲覧数:
57
回答数:
1

違反報告

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

dbc********さん

2019/5/2401:49:43

関数displayとmyInitをこんな感じに書き換えるとできます。

void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
//ワールド座標系にする
glLoadIdentity();
//x,y,z軸を描画する
glBegin(GL_LINES);
glColor3d(1, 0, 0);
glVertex3d(0, 0, 0);
glVertex3d(1, 0, 0);
glColor3d(0, 1, 0);
glVertex3d(0, 0, 0);
glVertex3d(0, 1, 0);
glColor3d(0, 0, 1);
glVertex3d(0, 0, 0);
glVertex3d(0, 0, 1);
glEnd();
//頂点と線分からのピラミッド
glPushMatrix();
glTranslated(1, 1.4, -1);
glBegin(GL_LINES);
glColor3d(1, 1, 1);
glVertex3d(0, 1, 0);
glVertex3d(1, -1, 1);
glVertex3d(0, 1, 0);
glVertex3d(-1, -1, 1);
glVertex3d(0, 1, 0);
glVertex3d(-1, -1, -1);
glVertex3d(0, 1, 0);
glVertex3d(1, -1, -1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(1, -1, 1);
glVertex3d(-1, -1, 1);
glVertex3d(-1, -1, -1);
glVertex3d(1, -1, -1);
glEnd();
glPopMatrix();
//黄色の中身が詰まった円錐
glPushMatrix();
glTranslated(2, 2, -3);
glRotated(-70, 1, 0, 0);
glColor3d(1, 1, 0);
glutSolidCone(1, 2, 16, 1);
//紫の中身が詰まったドーナツ
glColor3d(1, 0, 1);
glTranslated(0, 0, 1);
glutSolidTorus(0.2, 0.5, 8, 8);
glPopMatrix();
glPopMatrix();
glFlush();
}

void myInit(char *progname) {
int width = 500, height = 500;
double aspect = (double)width / height;
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(width, height);
glutCreateWindow(progname);
glutKeyboardFunc(myKeyboard);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, aspect, 1, 20);
//視点を変える
glTranslated(-1, -2, -5);
//別の角度から見せる
glRotated(-30, 0, 1, 0);
//隠面処理を行う
glEnable(GL_DEPTH_TEST);
}

この回答は投票によってベストアンサーに選ばれました!

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

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

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

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

閉じる

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

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

閉じる