glcolor3fを用いての色変更について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SINA

glcolor3fを用いての色変更について

#1

投稿記事 by SINA » 12年前

とても初歩的な質問で非常に申し訳ないのですが現在openglでの一人称視点でのプログラムを作っています
一人称視点のプログラムは問題なくテスト的にラインを引いてみたりポリゴンを出しているのですがglcolor3fを使って床の線の
色を変えることができません。色々調べてみたのですが解決には至りませんでした。どうぞよろしくお願いします。
コード自体は一人称視点のプログラムです。

コード:

/*↑:進む ←:左を見る →:右を見る ↓:後ろへ下がる*/
#include "glut.h"
#include <GL/gl.h>
#include<math.h>
#define PI 3.14159265358979

double X=0;
double Y=0;
double Z=0;
double vecZ=0;//向いているZ方向
double vecX=0;//向いてるX方向
double n=0;//アングル

void glid()//線
{
	glBegin( GL_LINES );
	glColor3f(1.0, 0.0, 0.0);//赤色に指定
	for(int i=-50;i<50;i++)
	{
		glVertex3f(-40.0, -2.0, i); //始点
		glVertex3f(+40.0, -2.0, i); //終点
		glVertex3f(i,-2.0, -40.0); //始点
		glVertex3f(i,-2.0, 40.0); //終点
	}
	glEnd();
}
void table(double size)
{
	 glBegin(GL_POLYGON);      //上面
        glNormal3f(0, 1, 0);
        glVertex3f(-1, -0.50, +1);
        glVertex3f(+1, -0.50, +1);
        glVertex3f(+1, -0.50, -1);
        glVertex3f(-1, -0.50, -1);
    glEnd();

    glBegin(GL_POLYGON);      //下面
        glNormal3f(0, -0.75, 0);
        glVertex3f(-1, -0.75, +1);
        glVertex3f(+1, -0.75, +1);
        glVertex3f(+1, -0.75, -1);
        glVertex3f(-1, -0.75, -1);
    glEnd();

	glBegin(GL_QUAD_STRIP); //前面
	glNormal3f(0, 0, 1);
	glVertex3f(-1, -0.50, +1);
	glVertex3f(-1, -0.75, +1);
	glVertex3f(+1, -0.50, +1);
	glVertex3f(+1, -0.75, +1);

	glNormal3f(+1, 0, 0); //右側面
	glVertex3f(+1, -0.50, -1);
	glVertex3f(+1, -0.75, -1);

	glNormal3f(0, 0, -1); //裏面
	glVertex3f(-1, -0.50, -1);
	glVertex3f(-1, -0.75, -1); 

	glNormal3f(-1, 0, 0); //左側面
	glVertex3f(-1, -0.50, +1);
	glVertex3f(-1, -0.75, +1); 
	glEnd();

}
void Prism(int N) // N角柱描関数
{ 
	int n=N;
	double rad=2*PI/n;
	//上面を描画 (GL_POLYGON)

	glBegin(GL_POLYGON);
		glNormal3f(0,0,1);
		for(int i=0;i<=n;i++)
		{
			glVertex3f(cos(rad*i), 2,sin(rad*i));  //i点_目U
		}
		glEnd();

	//下面を描画 (GL_POLYGON)
	glBegin(GL_POLYGON);
		glNormal3f(0,-1,0);
		for(int i=0;i<=n;i++)
		{
			glVertex3f(cos(rad*i), -2,sin(rad*i));  //i点_目U
		}
		glEnd();
	//側面を描画 (GL_QUAD_STRIP)
	glBegin(GL_QUAD_STRIP);
		for(int i=0;i<=n;i++)
		{
			glNormal3f(cos(rad*i),0,sin(rad*i));  //i点_目U

			glVertex3f(cos(rad*i),2,sin(rad*i));
			glVertex3f(cos(rad*i),-2,sin(rad*i));
			glVertex3f(cos(rad*(i+1)),2,sin(rad*(i+1)));
			glVertex3f(cos(rad*(i+1)),-2,sin(rad*(i+1)));
		}
		glEnd();
}
//===== キーボードハンドラ
void KeyboardHandler( int key, int x, int y )
{  //※他のキーについては省略
	double rad2=2*PI/360;
	vecZ=(Z+(-sin(rad2*n)))-Z;
	vecX=(X+(-cos(rad2*n)))-X;
	if(key ==GLUT_KEY_UP)
    {
		Z=Z-vecZ;
		X=X-vecX;
    }
	else if(key ==GLUT_KEY_DOWN)
    {
		Z=Z+0.7*vecZ;
		X=X+0.7*vecX;//0.7をかけているのは進んでる感を出すため
    }
	if(key==GLUT_KEY_LEFT)
	{
		n=n-4;
	}
	if(key==GLUT_KEY_RIGHT)
	{
		n=n+4;
	}
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(45, 1.0, 1.0, 40.0);
	 gluLookAt(X, Y, Z,   X+cos(rad2*n), Y, Z+sin(rad2*n),   0, 1, 0);
	 
     glMatrixMode(GL_MODELVIEW);
     //再描画
     glutPostRedisplay();
}

void display( void )
{
	//glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
	glid();
	glPopMatrix();
	
	glPushMatrix();
	glTranslatef(1, 1, 10);
	glRotatef(90, 1, 0, 0);
	glutSolidSphere(2, 20, 20);
	glPopMatrix();
	
    glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glPushMatrix();
	glTranslatef(8, 0, 0);
	table(10);//机
	glPopMatrix();

	glPushMatrix();
	glTranslatef(8,-1.25,0);
	glScalef(0.2,1.25/4,0.2);
	Prism(12);
	glPopMatrix();

	glPushMatrix();
	glTranslatef(8, -0.30, 0.5);
	glutSolidTeapot(0.2);
	glPopMatrix();

	glPushMatrix();
	glNormal3f(1, 1, 1);
    glFlush();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitWindowPosition(0, 0); 
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
    glutCreateWindow("test11146");
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1.0, 1.0, 20.0);
	
    glShadeModel(GL_FLAT);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);

    float light_position[] = {5.0, 10.0, 2.0, 0.0};
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
	glutSpecialFunc(KeyboardHandler);//特殊キーを使うのでこの宣言
    glutDisplayFunc(display);
	glutPostRedisplay();
    glutMainLoop();
}

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: glcolor3fを用いての色変更について

#2

投稿記事 by ISLe » 12年前

ライトが有効なときglColor系は反映されません。

マテリアル(材質)パラメータで設定する必要があります。

GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);

SINA

Re: glcolor3fを用いての色変更について

#3

投稿記事 by SINA » 12年前

なるほどライトを使う際にはその様な注意が必要なのですね
お早い返事ありがとうございました

閉鎖

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