一人称視点のプログラムは問題なくテスト的にラインを引いてみたりポリゴンを出しているのですが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();
}