// TestView.cpp : implementation of the CTestView class
//
#include "stdafx.h"
#include "Test.h"
#include "TestDoc.h"
#include "TestView.h"
#include "math.h"//数学头文件
#define ROUND(a) int(a+0.5)//四舍五入
#define PI 3.1415926//圆周率
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestView
IMPLEMENT_DYNCREATE(CTestView, CView)
BEGIN_MESSAGE_MAP(CTestView, CView)
//{{AFX_MSG_MAP(CTestView)
ON_WM_ERASEBKGND()
ON_COMMAND(IDR_Light, OnLight)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
ON_BN_CLICKED(IDC_CHECK4, OnCheck4)
ON_BN_CLICKED(IDC_CHECK5, OnCheck5)
ON_BN_CLICKED(IDC_CHECK6, OnCheck6)
ON_BN_CLICKED(IDC_CHECK7, OnCheck7)
ON_BN_CLICKED(IDC_CHECK8, OnCheck8)
ON_BN_CLICKED(IDC_CHECK9, OnCheck9)
ON_BN_CLICKED(IDC_CHECK10, OnCheck10)
ON_BN_CLICKED(IDC_CHECK11, OnCheck11)
ON_BN_CLICKED(IDC_CHECK12, OnCheck12)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestView construction/destruction
CTestView::CTestView()
{
// TODO: add construction code here
Chk1=Chk2=Chk3=Chk4=Chk5=Chk6=false;
Chk7=Chk8=Chk9=Chk10=Chk11=Chk12=false;
r=100;//球半径
R=300;Fei=90;Thta=90;D=800;//视点参数
LightA.red=1.0f;LightA.green=1.0f;LightA.blue=1.0f;
LightD.red=1.0f;LightD.green=1.0f;LightD.blue=1.0f;
n=5;//高光指数
}
CTestView::~CTestView()
{
}
BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTestView drawing
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
AfxGetMainWnd()->SetWindowText("球的光照模型");
GetMaxX();
GetMaxY();
InitParameter();
ReadPoint();
ReadFace();
DrawGlobe();
}
/////////////////////////////////////////////////////////////////////////////
// CTestView printing
BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTestView diagnostics
#ifdef _DEBUG
void CTestView::AssertValid() const
{
CView::AssertValid();
}
void CTestView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CTestDoc* CTestView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));
return (CTestDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTestView message handlers
void CTestView::GetMaxX()//获得屏幕宽度
{
CRect Rect;
GetClientRect(&Rect);
MaxX=Rect.right;
}
void CTestView::GetMaxY()//获得屏幕高度
{
CRect Rect;
GetClientRect(&Rect);
MaxY=Rect.bottom;
}
void CTestView::ReadPoint()//读入点坐标
{
double afa,beta;
for(int i=0;i<37;i++)
{
afa=i*5*PI/180;
for(int j=0;j<72;j++)
{
beta=j*5*PI/180;
P[i][j].x=r*sin(afa)*cos(beta);
P[i][j].y=r*sin(afa)*sin(beta);
P[i][j].z=r*cos(afa);
}
}
}
void CTestView::ReadFace()//读入面坐标
{
for(int i=0;i<36;i++)
{
for(int j=0;j<72;j++)
{
F[i][j].p[0]=P[i][j];
F[i][j].p[1]=P[i+1][j];
if(j==71)
{
F[i][j].p[2]=P[i+1][0];
F[i][j].p[3]=P[i][0];
}
else
{
F[i][j].p[2]=P[i+1][j+1];
F[i][j].p[3]=P[i][j+1];
}
}
}
}
void CTestView::DrawGlobe()
{
CRect Rect;
GetClientRect(&Rect);
CDC MemDC;
CBitmap Bitmap,*OldBitmap;
Bitmap.LoadBitmap(IDB_BITMAP2);
MemDC.CreateCompatibleDC(GetDC());
OldBitmap=MemDC.SelectObject(&Bitmap);
MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);
for(int i=0;i<36;i++)
{
for(int j=0;j<72;j++)
{
for(int m=0;m<4;m++)
{
P1[m].x=F[i][j].p[m].x;
P1[m].y=F[i][j].p[m].y;
P1[m].z=F[i][j].p[m].z;
Pdown[m].x=F[i+1][j].p[m].x;
Pdown[m].y=F[i+1][j].p[m].y;
Pdown[m].z=F[i+1][j].p[m].z;
if(j==71)
{
Pright[m].x=F[i][0].p[m].x;
Pright[m].y=F[i][0].p[m].y;
Pright[m].z=F[i][0].p[m].z;
Pdownright[m].x=F[i+1][0].p[m].x;
Pdownright[m].y=F[i+1][0].p[m].y;
Pdownright[m].z=F[i+1][0].p[m].z;
}
else
{
Pright[m].x=F[i][j+1].p[m].x;
Pright[m].y=F[i][j+1].p[m].y;
Pright[m].z=F[i][j+1].p[m].z;
Pdownright[m].x=F[i+1][j+1].p[m].x;
Pdownright[m].y=F[i+1][j+1].p[m].y;
Pdownright[m].z=F[i+1][j+1].p[m].z;
}
}
bool First=true;
P3d Pt[3];//四边形划分为两个三角形面片
Pt[0]=P1[0];Pt[1]=P1[1];Pt[2]=P1[3];
Triangle(&MemDC,Pt,First);//绘制上三角形面片
First=false;
Pt[0]=P1[1];Pt[1]=P1[2];Pt[2]=P1[3];
Triangle(&MemDC,Pt,First);//绘制下三角形面片
First=true;
}
}
CClientDC dc(this);
dc.BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
}
void CTestView::Triangle(CDC *mdc,P3d *p,bool First)//三角形面片
{
Vector vP10(P1[0]),vP11(P1[1]),vP12(P1[2]);//三角形平面片点矢量
Vector vPd0(Pdown[0]),vPd1(Pdown[1]),vPd2(Pdown[2]);
Vector vPr0(Pright[0]),vPr1(Pright[1]),vPr2(Pright[2]);
Vector vPdr0(Pdownright[0]),vPdr1(Pdownright[1]),vPdr2(Pdownright[2]);
Vector VectorN1=NormalVector(vP10,vP11,vP12);//主面片法矢量
Vector VectorNd=NormalVector(vPd0,vPd1,vPd2);//下面片法矢量
Vector VectorNr=NormalVector(vPr0,vPr1,vPr2);//右面片法矢量
Vector VectorNdr=NormalVector(vPdr0,vPdr1,vPdr2);//下右面片法矢量
Vector N1,Nd,Nr,Ndr;
N1=VectorN1.Unit();Nd=VectorNd.Unit();Nr=VectorNr.Unit();Ndr=VectorNdr.Unit();
Vector LPosition(lightP.position),Lv=LPosition.Unit();
MyRGB Ambientc=lightP.ambient;
MyRGB Ambientd=lightP.ambient;
MyRGB Ambientdr=lightP.ambient;
MyRGB Ambientr=lightP.ambient;
Vector vP0(p[0]),Uv;
Vector VisualP(R*k[5],R*k[6],R*k[4]);//视点矢量球坐标
Vector VisualV=VisualP-vP0;//视矢量
Uv=VisualV.Unit();
if(Chk1)//环境光
{
if(First)
{
p[0].c=Ambientc;
p[1].c=Ambientd;
p[2].c=Ambientr;
}
else
{
p[0].c=Ambientd;
p[1].c=Ambientdr;
p[2].c=Ambientr;
}
}
double c0,c1,c2,dist[3];//c0常数衰减因子,c1线性衰减因子,c2二次衰减因子,dist定点与光源的距离
double f[3];
c0=0.65;c1=0.00002;c2=0.000001;
for(int i=0;i<3;i++)
{
dist[i]=sqrt((p[i].x-Positionx)*(p[i].x-Positionx)
+(p[i].y-Positiony)*(p[i].y-Positiony)
+(p[i].z-Positionz)*(p[i].z-Positionz));
f[i]=1.0/(c0+c1*dist[i]+c2*dist[i]*dist[i]);
f[i]=Min(f[i]);
}
double dCosc,dCosd,dCosr,dCosdr;
dCosc=Dot(Lv,N1);dCosd=Dot(Lv,Nd);dCosr=Dot(Lv,Nr);dCosdr=Dot(Lv,Ndr);
dCosc=(dCosc<0.0f)?0.0f:dCosc;
dCosd=(dCosd<0.0f)?0.0f:dCosd;
dCosr=(dCosr<0.0f)?0.0f:dCosr;
dCosdr=(dCosdr<0.0f)?0.0f:dCosdr;
MyRGB Diffusec=lightP.diffuse*dCosc;
MyRGB Diffused=lightP.diffuse*dCosd;
MyRGB Diffuser=lightP.diffuse*dCosr;
MyRGB Diffusedr=lightP.diffuse*dCosdr;
if(Chk2)//漫反射光
{
if(First)
{
p[0].c=Ambientc+Diffusec*f[0];
p[1].c=Ambientd+Diffused*f[1];
p[2].c=Ambientr+Diffuser*f[2];
}
else
{
p[0].c=Ambientd+Diffused*f[0];
p[1].c=Ambientdr+Diffusedr*f[1];
p[2].c=Ambientr+Diffuser*f[2];
}
没有合适的资源?快使用搜索试试~ 我知道了~
球的光照模型完整实现代码(图形学)
共73个文件
h:15个
cpp:14个
obj:14个
2星 需积分: 50 71 下载量 67 浏览量
2018-01-21
16:53:14
上传
评论 15
收藏 3.57MB ZIP 举报
温馨提示
此为计算机图形学球的光照模型的课程设计,内有完整代码可直接运行,运行环境为VC6.0,本次课程设计通过构建MFC工程实现了操作界面的可视化,绘制了一个球体,并可通过菜单选项控制显示效果,进行光照模型、材质、光源位置等选择。
资源推荐
资源详情
资源评论
收起资源包目录
球的光照模型.zip (73个子文件)
球的光照模型
球的光照模型
P3d.h 530B
TestView.cpp 22KB
Light.cpp 839B
Edge.cpp 510B
Test.opt 56KB
resource.h 2KB
Test.dsw 531B
Debug
Vector.obj 20KB
Bucket.obj 4KB
vc60.pdb 364KB
Test.pdb 497KB
MyRGB.obj 12KB
Test.exe 1.43MB
MyFace.obj 5KB
MFC42D.DLL 908KB
MSVCRTD.DLL 376KB
vc60.idb 249KB
StdAfx.obj 103KB
Test.pch 5.24MB
Test.obj 23KB
WINMM.DLL 64KB
TestView.obj 108KB
MainFrm.obj 21KB
P3d.obj 4KB
MFCO42D.DLL 780KB
Light.obj 7KB
Test.res 1.07MB
TestDoc.obj 15KB
Test.ilk 360KB
Edge.obj 6KB
P2d.obj 4KB
LightDlg.obj 10KB
MyRGB.cpp 1KB
TestView.h 4KB
Bucket.h 564B
Test.rc 12KB
LightDlg.h 1KB
MyRGB.h 761B
Test.clw 3KB
P2d.h 524B
MyFace.cpp 524B
Test.dsp 6KB
P3d.cpp 503B
Test.cpp 4KB
RES
Test.rc2 396B
Toolbar.bmp 2KB
TestDoc.ico 1KB
Help.ico 4KB
Bitmap.bmp 869KB
EXIT.ICO 5KB
KLD.bmp 198KB
APP.ICO 10KB
Thumbs.db 24KB
DRAW.ICO 766B
Test.ico 1KB
Bucket.cpp 524B
Light.h 645B
MainFrm.h 2KB
P2d.cpp 503B
Test.h 1KB
StdAfx.cpp 206B
Test.aps 1.09MB
Vector.h 979B
LightDlg.cpp 816B
Vector.cpp 2KB
Test.ncb 1.05MB
MyFace.h 528B
TestDoc.h 1KB
MainFrm.cpp 3KB
StdAfx.h 1KB
Edge.h 618B
Test.plg 1KB
TestDoc.cpp 2KB
共 73 条
- 1
资源评论
- weixin_405719472019-12-02fatal error C1853: 'Debug/Test.pch' is not a precompiled header file created with this compiler Error executing cl.exe.
reb0rn初代
- 粉丝: 68
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功