图形学光照实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
for(int i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
deltax += 2;
deltay += 4;
x++;
y--;
}
CirclePt( x0, y0, x, y, mColor);
}
}
//根据中点圆算法填充圆域
void FlatCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);
glBegin(GL_POINTS);
{
for(int i=-x;i<=x;i++)
{
glVertex2i (i+x0,y+y0);
H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);
H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
}
//根据Phong模型计算光强
glVertex2i ( -x+x0, y+y0);//-x,y
glVertex2i ( x+x0, -y+y0);//x, -y
glVertex2i ( -x+x0, -y+y0);//-x, -y
glVertex2i ( y+x0, x+y0);//y, x
glVertex2i ( y+x0, -x+y0);//y, -x
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
CirclePt( x0, y0, x, y, mColor);
while(x<y)
{
if(d<0)
{
d += deltax;
deltax += 2;
deltay += 2;
x++;
}
else
{
d += deltay;
return 0;
}
程序运行的图形如下:
}
}
}
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0f, 1.0f, 1.0f);
Color clr;
clr.Ir = 180, clr.Ig = 180, clr.Ib = 180;
MidCircle(80, 240, 70, clr);
}
else
{
d += deltay;
deltax += 2;
deltay += 4;
x++;
y--;
}
for(i=-x;i<=x;i++)
{
glVertex2i (i+x0,y+y0);
glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
glVertex2i (i+x0,x+y0);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("球体模型!");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
FlatCircle(280, 240, 70, clr);
Sphere(540, 240, 70);
glFlush();
}
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
3.通过实验设计修改例子intercontrol.c的参数,分别达到以下要求:
(1)按下键盘上的”V”键,三角形就沿着45度角向上平移4.0f距离;
(2)按下键盘上的”B”键,三角形就沿着45度角向下平移4.0f距离;
4.通过实验掌握例子slight.c,并验证OpenGL简单光照明模型;
2、实验方案
return mColor;
}
//根据计算的光强按球体的结果着色
void Sphere(int x0, int y0, int r)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glBegin(GL_POINTS);
}
while(x<y)
{
if(d<0)
{
d += deltax;
deltax += 2;
deltay += 2;
x++;
}
else
{
d += deltay;
deltax += 2;
deltay += 4;
x++;
y--;
}
for(i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
N.fy=(y-y0)*1.0/r;
N.fz = z*1.0/r;
theta = N.fx * light.fx + N.fy * light.fy + N.fz * light.fz;
if(theta<0)
theta=0;
alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;
if(alpha<0)
{
mColor=Phong(x0,y0,r,i+x0,x+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,x+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-x+y0);
glVertex2i ( -y+x0, x+y0);//-y, x
glVertex2i ( -y+x0,-x+y0);//-y, -x
glEnd();
}
//中点圆生成算法
void MidCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
计算机学院专业学号姓名协作者教师评定实验三opengl交互式控制及简单光照明模型1实验目的与要求通过实验掌握opengl中的交互式控制
计算机学院专业班学号
姓名协作者无教师评定
实验三OpenGL交互式控制及简单光照明模型
1、实验目的与要求
1.通过实验掌握OpenGL中的交互式控制;
2.通过实验掌握例子intercontrol.c,并验证OpenGL交互式控制方法;
#include <math.h>
struct Vector
{
float fx, fy, fz;
};
struct Color
{
float Ir, Ig, Ib;
};
float KaIa;//环境光强度
float Kd, n;
Vector H,light;
Color mLight, mColor;
GLboolean bLight = false;
glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
glVertex2i (i+x0,x+y0);
glVertex2i (i+x0,-x+y0);
}
while(x<y)
{
if(d<0)
{
d += deltax;
deltax += 2;
deltay += 2;
x++;
alpha=0;
mColor.Ir=KaIa+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n);
mColor.Ig=KaIa+mLight.Ig*Kd*theta+mLight.Ig*Ks*pow(alpha,n);
mColor.Ib=KaIa+mLight.Ib*Kd*theta+mLight.Ib*Ks*pow(alpha,n);
}
for(i=-y;i<=y0,y0,r,i+x0,x+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,x+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-x+y0);
//利用圆的八向对称性生成圆上的点
void CirclePt(int x0, int y0, int x, int y, Color mColor)
{
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);
glBegin(GL_POINTS);
glVertex2i ( x+x0, y+y0);//x,y
请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。
实验:OpenGL简单光照明模型,设计一个球体模型,产生光照效果。
3、实验结果和数据处理
实验:OpenGL简单光照明模型
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
light.fz = sqrt(1-(light.fx*light.fx)-(light.fy*light.fy));
eye.fx=0;eye.fy=0;eye.fz=1;
H.fx=light.fx+eye.fx;
H.fy=light.fy+eye.fy;
H.fz=light.fz+eye.fz;
mo=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz);
Color Phong(int x0, int y0, int r, int x, int y)
{
Vector N;
float z,alpha,theta,Ks;
Ks=1.0-Kd;
z=sqrt((float)(r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0)));
N.fx=(x-x0)*1.0/r;
glVertex2i (i+x0,-x+y0);
}
}
}
glEnd();
}
//初始化设定
void Init()
{
float mo;
Vector eye;
mLight.Ir = 0;
mLight.Ig = 175;
mLight.Ib = 0;
KaIa=80;
Kd = 1;
n = 10;
light.fx=0.50;light.fy=0.50;
相关文档
最新文档