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;
}