這是我寫的原程式,需要給太陽地球月亮添加紋理,但是在沒搞出來,出各位大神幫幫忙。
#include <GL/glut.h>
#include <math.h>
float seta = 200;
float mx=0,my=0,mz=50,rx=0,ry=0,rz=0;//平移和旋轉
float mspeed=5,rspeed=1;
static int oldrx=0,oldry=0;//旋轉
static int oldmx=0,oldmy=0;//平移
static int oldpx=0,oldpy=0;
bool a=false,b=false;
int specialKey;
void myDisplay(void);
void Mouse(int button, int state, int x, int y) //處理滑鼠點擊
{
if(state==GLUT_DOWN) //第一次滑鼠按下時,記錄滑鼠在視窗中的初始坐標
{
if(button==GLUT_RIGHT_BUTTON){
oldrx=x,oldry=y;
b = true;
}
else if(button==GLUT_LEFT_BUTTON){
oldmx=x,oldmy=y;
a = true;
}
}
else if(state==GLUT_UP)//滑鼠松開
{
if(button==GLUT_LEFT_BUTTON)
{
a= false;
}
else if(button==GLUT_RIGHT_BUTTON)
{
b=false;
}
}
}
void onMouseMove(int x,int y) //處理滑鼠拖動
{
if((a==true)&&(b==true))//左右鍵
{
mz+=(y-oldmy)*mspeed/10;
oldmx=x,oldmy=y;
}
else if(a==true)//左鍵
{
my+=-(y-oldmy)*mspeed;
mx+=(x-oldmx)*mspeed;
oldmx=x,oldmy=y;
}
else if(b==true)//右鍵
{
ry+=-(x-oldrx);
rx+=-(y-oldry);
oldrx=x,oldry=y;
}
}
void myTimerFunc(int val)
{
++seta;
if( seta >= 360 )
seta = 0;//每年為360天,超過360從0再開始
myDisplay();
glutTimerFunc(1,myTimerFunc,0);
}
void myKeyboardFunc(unsigned char key,int x, int y)
{
switch(key)
{
case 'W':
my+=mspeed;
break;
case 'S':
my-=mspeed;
break;
case 'A':
mx-=mspeed;
break;
case 'D':
mx+=mspeed;
break;
case 'Q':
mz+=mspeed;
break;
case 'E':
mz-=mspeed;
break;
case 'I':
rx+=rspeed;
break;
case 'K':
rx-=rspeed;
break;
case 'J':
ry+=rspeed;
break;
case 'L':
ry-=rspeed;
break;
case '1':
mspeed+=2;
break;
case '2':
mspeed-=2;
break ;
case '3':
rspeed+=0.5;
break;
case '4':
rspeed-=0.5;
break;
}
}
void SetRC()
{
glShadeModel(GL_FLAT);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
float amb[4]={0.8,0.0,0.0,1}; //紅色環境光
float dif[4]={1.0,1.0,1.0,1}; //白色漫射光和反射光
float spe[4]={1.0,1.0,1.0,1}; //黑色鏡面反射
glLightfv(GL_LIGHT0,GL_AMBIENT,amb);
glLightfv(GL_LIGHT0,GL_DIFFUSE,dif);
glLightfv(GL_LIGHT0,GL_SPECULAR,amb);
glEnable( GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glPolygonMode(GL_BACK,GL_LINE);
}
void SetView()
{
glRotatef(-ry,0,1,0); //h
glRotatef(-rx,1,0,0); //p
glRotatef(-rz,0,0,1); //r
glTranslatef(-mx,-my,-mz);
}
void RenderWorld()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0,5,-25);
glRotatef(seta,0,1,0);
glPopMatrix();
//太陽
glPushMatrix();
glTranslatef(0,-100,-600);
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glColor3f(1,0,0);
glRotatef(seta*2,0,1,0);
glRotatef(90,1,0,0);
glutSolidSphere(70,100,100);
float pos[4]={0,0,0,1}; //以太陽為光源
glLightfv(GL_LIGHT0,GL_POSITION,pos); //設定光源位置
glPopMatrix();
//地球
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glColor3f(0,0,1);
glRotatef(seta,0,1,0);//公轉
glTranslatef(175,0,0);
glRotatef(seta,0,1,0);//自轉
glRotatef(90,1,0,0);
glutSolidSphere(16,200,200);//地球
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glColor3f(1,1,0);
glRotatef(seta*6, 0, 0, -1);
glTranslatef(35,0,0);
glRotatef(seta*1,0,1,0);//月球自轉
glutSolidSphere(4.5,60,60);
glPopMatrix();//月球
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
SetView();
RenderWorld();
//模型控制
glPopMatrix();
glutSwapBuffers();
}
void myReshape(int w,int h)
{
GLfloat nRange = 100.0f;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,GLfloat(w)/h,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 800);
glutCreateWindow("太陽地球月亮系");
glutDisplayFunc(&myDisplay);
glutMouseFunc(Mouse);
glutMotionFunc(onMouseMove);
glutTimerFunc(1,myTimerFunc,0);
glutReshapeFunc(&myReshape);
glutKeyboardFunc(&myKeyboardFunc);
SetRC();
glutMainLoop();
return 0;
}
這是三張紋理圖,求幫助了


uj5u.com熱心網友回復:

這是地球那張圖
uj5u.com熱心網友回復:
你只是用glutSolidSphere()函式在場景中繪制了球體,并沒有進行紋理設定與加載啊!另外你可以用自動紋理,看一下相關的OpenGL的書吧。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98789.html
上一篇:連接錯誤
下一篇:有誰熟悉CRC模擬演算法么,寫出來的C++代碼不能運行abnormal program termination,可以幫忙改下代碼么
