您好,登錄后才能下訂單哦!
glutSolidSphere是GLUT工具包中的一個函數(shù),該函數(shù)用于渲染一個球體。球體球心位于
原點。在OpenGL中默認的原點就是窗口客戶區(qū)的中心。
1 怎么將球體進行移動?
可以使用glPushMatrix,glPopMatrix保存一個移位矩陣,就可以移動球體
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};
GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};
GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };
GLfloat mat_shininess[] = { 76.800003}; //材質(zhì)RGBA鏡面指數(shù),數(shù)值在0~128范圍內(nèi)
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半徑為 1,40 條緯線,50 條經(jīng)線
glPopMatrix();
glFlush ();
2 已經(jīng)設(shè)置材質(zhì),光照,球體還是黑色的平面圖?
必須設(shè)置投影矩陣,建立裁剪的矩陣區(qū)域,才能夠看到立體,這時候需要調(diào)用glOrtho
/* 定義 GLUT 的 reshape 函數(shù),w、h 分別是輸出圖形的窗口的寬和高*/
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
if (w <= h)
glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,
1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //創(chuàng)建平行視景體
else
glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )
w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( ) ;
}
代碼
# include < GL/glut.h >
/* 初始化材料屬性、光源屬性、光照模型,打開深度緩沖區(qū)等 */
void init(void)
{
GLfloat light_position [ ] = { 0., 1.5, 1.5, 0.0 };
glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //設(shè)置背景色為藍色
glShadeModel ( GL_SMOOTH );
glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
}
/*調(diào)用 GLUT 函數(shù),繪制一個球*/
void display ( void )
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
{
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
GLfloat mat_ambient[] = { 0.021500, 0.174500, 0.021500, 0.550000};
GLfloat mat_diffuse[] = { 0.075680, 0.614240, 0.075680, 0.550000};
GLfloat mat_specular[] = { 0.633000, 0.727811, 0.633000, 0.550000 };
GLfloat mat_shininess[] = { 76.800003}; //材質(zhì)RGBA鏡面指數(shù),數(shù)值在0~128范
圍內(nèi)
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半徑為 1,40 條緯線,50 條經(jīng)線
glPopMatrix();
glFlush ();
}
{
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
GLfloat mat_ambient[] = { 0.247250, 0.199500, 0.074500, 1.000000};
GLfloat mat_diffuse[] = { 0.751640, 0.606480, 0.226480, 1.000000};
GLfloat mat_specular[] = { 0.628281, 0.555802, 0.366065, 1.000000 };
GLfloat mat_shininess[] = { 51.200001}; //材質(zhì)RGBA鏡面指數(shù),數(shù)值在0~128范
圍內(nèi)
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glutSolidSphere (1.0, 40, 50); //半徑為 1,40 條緯線,50 條經(jīng)線
glPopMatrix();
}
glFlush ();
}
/* 定義 GLUT 的 reshape 函數(shù),w、h 分別是輸出圖形的窗口的寬和高*/
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
if (w <= h)
glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,
1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //創(chuàng)建平行視景體
else
glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )
w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( ) ;
}
int main(int argc, char** argv)
{
glutInit (&argc, argv); // GLUT 環(huán)境初始化
glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH); // 顯示模式初始化
glutInitWindowSize (300, 300); // 定義窗口大小
glutInitWindowPosition (100, 100); // 定義窗口位置
glutCreateWindow ( argv [ 0 ] ); // 顯示窗口,窗口標題為執(zhí)行函數(shù)名
init( );
glutDisplayFunc ( display ); // 注冊 OpenGL 繪圖函數(shù)(一種特殊的調(diào)用方式,下
同)
glutReshapeFunc ( reshape ); // 注冊窗口大小改變時的響應(yīng)函數(shù)
glutMainLoop( ); // 進入 GLUT 消息循環(huán),開始執(zhí)行程序
return 0;
}
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。