www.pudn.com > 地表贴图.zip > Dsn.cpp


// DSN.cpp: implementation of the CLoadDSN class. 
#include "stdafx.h" 
#include "GeoDraw.h" 
#include  "DSN.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
int CLoadDSN::m_MaxTexs=0; 
CLoadDSN::CLoadDSN() 
{ 
	m_bLight=false; 
	minPnt.x=minPnt.y=50000000; 
	minPnt.z=2000; 
	maxPnt.x=maxPnt.y=maxPnt.z=0;	 
} 
 
CLoadDSN::~CLoadDSN() 
{ 
 
} 
void CLoadDSN::ImportDSN(CObject3D* pObj,CBmpFiles** ppTexturelist,CString FileName) 
{ 
	int index=0; 
	int numtris,numtextures; 
	float x,y,z,u,v; 
	char stemp[255]; 
	CPoint3D nor,Pnt[3]; 
	FILE* fp; 
	fp= fopen(FileName, "rt"); 
	if(!fp) return; 
 
	fseek( fp, 0, SEEK_SET); 
	/////////////////////////////////////////////////////////// 
	fscanf(fp,"%s",stemp); 
	while( strcmp(stemp,"NUMTEXTURES") != 0)  fscanf(fp,"%s", stemp); 
	fscanf( fp, "%d",&numtextures); 
	m_MaxTexs=numtextures; 
	//	ppTexturelist =(CBmpFiles**)malloc(sizeof(CBmpFiles)*(numtextures));//  
	for(int k=0; kfname); 
 
	}	 
	/////////////////////////////////////////////////////////////// 
	fscanf(fp,"%s",stemp); 
	while( strcmp(stemp,"NUMPOLLIES" ) !=0)  fscanf(fp,"%s", stemp); 
	fscanf( fp, "%d", &numtris); 
	pObj->pTri= new CTriangle[numtris]; 
	pObj->NumTris = numtris; 
	for (int i= 0; i< numtris; i++) 
	{ 
		/*Readstr(fp,stemp); 
		index=(*stemp-48);*/ 
		fscanf(fp,"%d",&index); 
		pObj->pTri[i].TexIndex=index; 
		for (int j = 0; j < 3; j++) 
		{            
			//if(index>m_MaxTexs) m_MaxTexs=index; 
			fscanf(fp, "%f %f %f %f %f", &x, &y, &z, &u, &v); 
			pObj->pTri[i].Point3v[j].x = x; 
			pObj->pTri[i].Point3v[j].y = y; 
			pObj->pTri[i].Point3v[j].z = z; 
			pObj->pTri[i].Point3v[j].u = u; 
			pObj->pTri[i].Point3v[j].v = v; 
			//计算法向量 
			Pnt[j].x=x; 
			Pnt[j].y=y; 
			Pnt[j].z=z;	 
			if(j%3==0) 
			{ 
				nor=CalcNormal(Pnt);                				 
			} 
			pObj->pTri[i].Point3v[j].dx=nor.dx; 
			pObj->pTri[i].Point3v[j].dy=nor.dy; 
			pObj->pTri[i].Point3v[j].dz=nor.dz; 
			if(xmaxPnt.x) maxPnt.x=x; 
			if(ymaxPnt.y) maxPnt.y=y; 
			if(zmaxPnt.z) maxPnt.z=z; 
		} 
	} 
	fclose(fp); 
} 
 
void CLoadDSN::DrawDSN(CDC* pDC, CObject3D* pObj,UINT m_Texture[],int mode) 
{ 
	GLfloat x_m, y_m, z_m, u_m, v_m; 
	GLubyte clr; 
	CPoint3D nor; 
	CPoint3D texPnt; 
	int numtris,index; 
	numtris=pObj->NumTris; 
	for(int i=0;ipTri[i].TexIndex; 
		glBindTexture(GL_TEXTURE_2D, m_Texture[index]); 
		glBegin(mode); 
		for(int j=0;j<3;j++) 
		{ 
			x_m =pObj->pTri[i].Point3v[j].x; 
			y_m =pObj->pTri[i].Point3v[j].y; 
			z_m =pObj->pTri[i].Point3v[j].z; 
			u_m =pObj->pTri[i].Point3v[j].u; 
			v_m =pObj->pTri[i].Point3v[j].v;			 
 
			nor.dx=pObj->pTri[i].Point3v[j].dx; 
			nor.dy=pObj->pTri[i].Point3v[j].dy; 
			nor.dz=pObj->pTri[i].Point3v[j].dz; 
			//glNormal3f(nor.dx,nor.dy,nor.dz);					 
			clr=CalcRanch(z_m); 
		   if(!m_bLight) 
			mbase.SetColor(RGB(clr,clr,clr)); 
		   else 
			mbase.SetMaterialColor(RGB(clr,clr,clr)); 
			texPnt=CalcTexCoord(pObj->pTri[i].Point3v[j]); 
			glTexCoord2f(texPnt.u,texPnt.v); 
 
			glVertex3f(x_m,y_m,z_m); 
		}	 
		glEnd();		 
	}	 
} 
 
/////////////////////////// 
GLubyte  CLoadDSN::CalcRanch(const float&  height0) 
{ 
	GLubyte  clrID=0; 
	clrID=(GLubyte)10*255*(height0-minPnt.z)/(maxPnt.z-minPnt.z); 
	return clrID; 
} 
 
CPoint3D  CLoadDSN::CalcNormal(CPoint3D Pnt[3]) 
{ 
	GLfloat p1[3], p2[3], p3[3]; 
 
	GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz; 
	CPoint3D nor; 
	p1[0]=Pnt[0].x; p1[1]=Pnt[0].y; p1[2]=Pnt[0].z; 
	p2[0]=Pnt[1].x; p2[1]=Pnt[1].y; p2[2]=Pnt[1].z; 
	p3[0]=Pnt[2].x; p3[1]=Pnt[2].y; p3[2]=Pnt[2].z; 
 
	w0=p1[0]-p1[1]; w1=p2[0]-p2[1]; w2=p3[0]-p3[1]; 
	v0=p1[2]-p1[1]; v1=p2[2]-p2[1]; v2=p3[2]-p3[1]; 
	nx=(w1*v2-w2*v1); 
	ny=(w2*v0-w0*v2); 
	nz=(w0*v1-w1*v0); 
	nr=sqrt(nx*nx+ny*ny+nz*nz); 
	nor.x=nx/nr;  nor.y=ny/nr;  nor.z=nz/nr; 
	return nor; 
} 
 
 
CPoint3D  CLoadDSN::CalcTexCoord(const CPoint3D& Pnt) 
{ 
	CPoint3D pTex; 
    pTex.u=(Pnt.x-minPnt.x)/(maxPnt.x-minPnt.x);//+255*minPnt.x/maxPnt.x; 
	pTex.v=(Pnt.y-minPnt.y)/(maxPnt.y-minPnt.y);//+255*minPnt.y/maxPnt.y; 
	return pTex; 
}