打光
去老師的網址: https://jsyeh.org/3dcg10/
windows.zip ~> 解壓縮至windows裡 \ transformation.exe
data.zip ~> 解壓縮到windows裡 \ data \ 模型
打開Light Material.exe(打光)
(左上)左鍵旋轉 ; 右鍵換模型
(右下)右鍵換材質
fv = float vector(陣列)
glLightfv(GL_LIGHTO , GL_POSITION , 陣列) / / /第幾個燈 , 設位置
實作:
安裝好freeglut , lib裡最長的檔名要改成 libglut32.a
codeblocks裡打開GLUT專案 , 要先按 . . . 選擇桌面 , 第二個要選放freeglut
從範例用 ctrl - F 找 light
幫茶壺打上陰影
#include<GL/glut.h>
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week06");
glutDisplayFunc(display);
///下為複製的程式碼,要放glutCreateWindow()後才有效!!!!
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
把上禮拜最後的程式拿來用(light+motion+mouse+keyboard)
#include <GL/glut.h>///簡化程式
#include<stdio.h>
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
float x=150, y=150, z=0 , scale=1.0;
int oldX=0 ,oldY=0;
void display()
{
glClearColor(0.5,0.5,0.5,1);///RGBA,A為半透明功能目前未開
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前先清理畫面
glPushMatrix();///備份矩陣
glTranslatef( (x-150)/150.0 ,-(y-150)/150.0 , z);
glScalef(scale, scale,scale);///縮放
glColor3f(1,1,0);///設定色彩
glutSolidTeapot(0.3);
glPopMatrix();///還原
glutSwapBuffers();///畫好後換出來
}
void keyboard( unsigned char key, int mouseX,int mouseY)
{
}
void mouse( int button, int state,int mouseX,int mouseY)
{
oldX = mouseX;
oldY = mouseY;
}
void motion(int mouseX,int mouseY)
{
if(mouseX-oldX > 0) scale *= 1.01;
if(mouseX-oldX < 0) scale *= 0.99;
///x+=(mouseX-oldX); y+=(mouseY-oldY);
oldX = mouseX; oldY = mouseY;
display();
}
int main (int argc, char** argv)
{
glutInit( &argc, argv);///送給glutInit 初始化
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("第5周程式!");
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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, high_shininess);
glutKeyboardFunc(keyboard);
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutMainLoop();
}
![]() |
用鍵盤指令縮放旋轉移動
#include <GL/glut.h>
#include <stdio.h>
const GLfloat light_ambient[]={0.0f,0.0f,0.0f,0.0f};
const GLfloat light_diffuse[]={1.0f,1.0f,1.0f,1.0f};
const GLfloat light_specular[]={1.0f,1.0f,1.0f,1.0f};
const GLfloat light_position[]={2.0f,5.0f,-5.0f,0.0f};
const GLfloat mat_ambient[]={0.7f,0.7f,0.7f,1.0f};
const GLfloat mat_diffuse[]={0.8f,0.8f,0.8f,1.0f};
const GLfloat mat_specular[]={1.0f,1.0f,1.0f,1.0f};
const GLfloat high_shininess[]={100.0f};
float x=150,y=150,z=0,scale=1.0,angle=0.0;
int oldx=0,oldy=0,now=1;
void display()
{
glClearColor(0.5,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslated((x-150)/150.0,-(y-150)/150.0,z);
glScalef(scale,scale,scale);
glRotatef(angle,0,1,0);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void keyboard(unsigned char key,int mousex,int mousey)
{
if(key=='1'||key=='w'||key=='W')now=1;
if(key=='2'||key=='e'||key=='E')now=2;
if(key=='3'||key=='r'||key=='R')now=3;
}
void mouse(int button ,int state,int mousex,int mousey)
{
oldx=mousex;oldy=mousey;
}
void motion(int mousex,int mousey)
{
if(now==1){
x+=(mousex-oldx);y+=(mousey-oldy);
}
else if(now==2){
angle+=(mousex-oldx);
}
else if(now==3){
if(mousex-oldx>0)scale*=1.01;
if(mousex-oldx<0)scale*=0.99;
}
oldx=(mousex);oldy=mousey;
display();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week0 kight keyboard");
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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, high_shininess);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
.png)
.png)
.png)
.png)
沒有留言:
張貼留言