求openGL大神!!为什么加入了了模拟水面之后,导进去的3DS的模型是黑的,跪谢!!

ljf8609390 ljf8609390 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
/////////////////////////////////////////////////////////////////////////////
// CMyWaterView drawing

void CMyWaterView::OnDraw(CDC* pDC)
{
CMyWaterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//////////////////////////////////////////////////////////////////
RenderScene(); //渲染场景;
//////////////////////////////////////////////////////////////////

}

int CMyWaterView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//////////////////////////////////////////////////////////////////
//初始化OpenGL和设置定时器
m_pDC = new CClientDC(this);
SetTimer(1, 20, NULL);
InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////
InitializeTexture();
Init();
return 0;
}


//////////////////////////////////////////////////////////
// 初始化openGL场景;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::InitializeOpenGL(CDC* pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表;
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表;
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}

//////////////////////////////////////////////////////////
// 设置像素格式;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::SetupPixelFormat()
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小;
1, // 版本号 ;
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 ;
PFD_SUPPORT_OPENGL | // 支持 OpenGL ;
PFD_DOUBLEBUFFER, // 双缓存模式 ;
PFD_TYPE_RGBA, // RGBA 颜色模式 ;
24, // 24 位颜色;深度 ;
0, 0, 0, 0, 0, 0, // 忽略颜色位 ;
0, // 没有非透明度缓存 ;
0, // 忽略移位位;
0, // 无累加缓存 ;
0, 0, 0, 0, // 忽略累加位 ;
32, // 32 位深度缓存 ;
0, // 无模板缓存 ;
0, // 无辅助缓存;
PFD_MAIN_PLANE, // 主层 ;;
0, // 保留 ;
0, 0, 0 // 忽略层,可见性和损毁掩模 ;
};
int pixelformat;
pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式;
::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式;
if(pfd.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette(); //设置逻辑调色板;
return TRUE;
}


//画3ds模型;
void CMyWaterView::Draw3ds()
{

glRotatef(90.f,0.0f,0.0f,1.0f);

glRotatef(-90.f,0.0f,1.0f,0.0f);
glTranslatef(-5000.0f,0.5f,3350.5f);
if (m_3dsLoaded)
{
//glColor3f(1.f,0.f,0.f);

m_triList.drawGL();
}
}

BOOL CMyWaterView::OpenFile(LPCTSTR lpszPathName)
{
char* file = new char[strlen(lpszPathName)];
strcpy(file, lpszPathName);

C3dsReader Loader;
BOOL result;
if( m_triList.getNumObjects() > 0 ) m_triList.removeAllObjects();

result = Loader.Reader(file, &m_triList);
if( result)
{
m_3dsLoaded = TRUE;
m_triList.doAfterMath();

}

return result;


}

void CMyWaterView::Init(GLvoid)
{

m_3dsLoaded = FALSE;

camPos[0] = 0.0f;
camPos[1] = 0.0f;
camPos[2] = -100.0f;
camRot[0] = 20.0f;
camRot[1] = -20.0f;
camRot[2] = 0.0f;

scenePos[0] = 0.0f;
scenePos[1] = 0.0f;
scenePos[2] = 0.0f;
sceneRot[0] = 0.0f;
sceneRot[1] = 0.0f;
sceneRot[2] = 0.0f;
mouseprevpoint.x = 0;
mouseprevpoint.y = 0;
mouserightdown = FALSE;
mouseleftdown = FALSE;


m_triList.Init();

::glShadeModel(GL_FLAT);

//::glClearColor(0.0F, 0.0F, 0.0F, 0.0F);

::glClearDepth(1.0F);

::glEnable(GL_DEPTH_TEST);

::glEnable(GL_CULL_FACE);

GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f};
GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f};
GLfloat lightPos[] = {6000.0f,6000.0f,6000.0f, 1.0f};

glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

}


void CMyWaterView::SetCamPos(int axis, int value, BOOL increment, BOOL apply)
{
if(increment)
{
camPos[axis] += (float)value*camPos[axis]/100;
}
else
{
camPos[axis] = (float)value/2;
}

::glMatrixMode(GL_MODELVIEW);
::glLoadIdentity();

RenderScene();

}

void CMyWaterView::SetSceneRot(int axis, int value, BOOL increment, BOOL apply)
{
if(increment)
sceneRot[axis] += (sceneRot[axis] >=360) ? (-360 + value/2): value/2;
else
sceneRot[axis] = (sceneRot[axis] >=360) ? (-360 + value/2): value/2;

RenderScene();
}

//void CMyWaterView::drawGL()
//{
// for (int i=0; i <numobjects; i++)
// {
// objects[i]->drawGL();
// }
//}


//////////////////////////////////////////////////////////
// 场景绘制与渲染;
//////////////////////////////////////////////////////////
BOOL CMyWaterView::RenderScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //清屏;
glPushMatrix();
//glRotated(90,0,1,0); //海面绕y轴旋转90度;
//glScalef(3,1,3); //海面沿X Z轴放大三倍;
glScalef(10,1,10); //海面沿X Z放大10倍;
if (!rgb)
glColor3f(.31, .41, .97); //如果纹理不是彩色则用蓝色海面;
else
glColor3f(1.f,1.f,1.f); //白色;
glTranslatef(0.f,-1.f,0.f); //让平画下一点,否则正好与眼睛同一高度看不见;
glMatrixMode(GL_TEXTURE); //矩阵堆栈切换成纹理矩阵;
glPushMatrix();
glTranslatef(ttrans[0], ttrans[1], 0.); //纹理映射坐标系平移;
glScalef(10.f, 10.f,1.f); //纹理映射坐标系放大;
draw_mesh();
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //矩阵堆栈切换回模型矩阵;

glLoadIdentity();

//DrawAxis();

Draw3ds();
glPopMatrix();

ttrans[0] += .005f; //纹理坐标系的平移量不断变化;
if (ttrans[0] == 1.0f) ttrans[0] = 0.0f; //如果大过1,让其轮回;
ttrans[1] -= .0025f; //纹理坐标系的平移量不断变化;
if (ttrans[1] <= 0.0f) ttrans[1] = 1.0f; //轮回;

::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区;
return TRUE;
}









void CMyWaterView::InitializeTexture()
{


unsigned *image; //纹理图像的像素数据指针;
int width, height, components; //图像的宽度 高度 颜色通道数;
char* filename; //
//filename="ocean.jpg"; //
filename="water1.bw"; //
if (filename)
{
//使用MyTexture的现成方法加载数据;
image = m_Tex->read_texture(filename, &width, &height, &components);
if (image == NULL)
{
AfxMessageBox("不能装入图形文件!");
}
if (components < 3) rgb = 0; //如果不是彩色图像则做这个标志;
} else
{
int i, j;
unsigned char *img;
components = 4; width = height = 512;
image = (unsigned *) malloc(width*height*sizeof(unsigned));
img = (unsigned char *)image;
for (j = 0; j < height; j++)
for (i = 0; i < width; i++)
{
int w2 = width/2, h2 = height/2;
if (i & 32)
img[4*(i+j*width)+0] = 0xff;
else
img[4*(i+j*width)+1] = 0xff;
if (j&32)
img[4*(i+j*width)+2] = 0xff;
if ((i-w2)*(i-w2) + (j-h2)*(j-h2) > 64*64 &&
(i-w2)*(i-w2) + (j-h2)*(j-h2) < 300*300) img[4*(i+j*width)+3] = 0xff;
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, cloud_color);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, components, width,
height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
image);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION); //切换矩阵堆栈为投影矩阵;
glLoadIdentity(); //矩阵重置为单位阵;
gluPerspective(50.,1.,.1,10.); //设置视景体;
//gluPerspective(50.,1.,.1,far_cull = 10.); //设置视景体;
glMatrixMode(GL_MODELVIEW); //矩阵堆栈切换回模型矩阵;
//glLoadIdentity();
//矩阵重置为单位阵;
glTranslatef(0.,0.,-5.5); //把视点与原点拉开距离;




}


void CMyWaterView::draw_mesh(void)
{


if (mesh) //加入一个mesh变量来 控制画网格还是画平面;
{

glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-1.f, 0.f, -1.f);
glTexCoord2f(0, 1); glVertex3f(-1.f, 0.f, 1.f);
glTexCoord2f(1, 1); glVertex3f( 1.f, 0.f, 1.f);
glTexCoord2f(1, 0); glVertex3f( 1.f, 0.f, -1.f);
glEnd();
}
else
{
int i, j;
static float off;
float d = 1.f/MESH;
for(i = 0; i < MESH; i++)
{
glBegin(GL_TRIANGLE_STRIP);
for(j = 0; j < MESH; j++)
{
float s = (float)j*d;
float t = (float)i*d;
float x = -1.0 + 2.f*s;
float z = -1.0 + 2.f*t;
float y = amplitude*sinf(freq*2.f*M_PI*t+off);
glTexCoord2f(s, t); glVertex3f(x, y, z);
s += d; t += d;
x = -1.0 + 2.f*s;
z = -1.0 + 2.f*t;
y = amplitude*sinf(freq*2.f*M_PI*t+off);
glTexCoord2f(s, t); glVertex3f(x, y, z);
off += phase;
}
glEnd();
}
}
}



...全文

相关推荐

OpenGL环境下模型文件的加载(3DS\OBJ)

opengl环境下3D模型加载的例子,

Jianguo_pro

OpenGL 3DS模型导入与场景漫游实战指南

OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。由于其开放性、稳定性和跨平台特性,OpenGL被广泛用于图形处理领域,特别是在游戏开发和科学可视化中。3DS文件格式,最初由Autodesk 3D Studio用于其软件中的一种场景描述文件格式,是游戏开发和3D建模领域广泛使用的文件格式之一。了解其基本结构对于深入研究图形库如OpenGL与3DS模型的交互尤为重要。主块(Main Chunks)

念区

文件夹文件清单一键导出Excel工具

这是一款文件夹文件清单一键导出 Excel 工具,选一个文件夹点一下,整棵目录树就列成一张 Excel 表。自带中文图形界面,双击启动.bat 即用。交付物包含主程序脚本、启动批处理、README 说明文档(md、html、pdf 三种版本)、示例目录和界面截图,解压即用。 功能上覆盖目录盘点的完整流程:选一个文件夹递归扫描所有子目录,文件按相对路径列进 Excel;每行带相对路径、文件名、类型、大小、创建时间和修改时间六项信息;末尾自动合计文件总数和总大小;可按扩展名过滤只保留指定类型的文件,可限制递归深度只扫顶层或指定层数。 几个实用细节:只读文件元数据不动你的原始文件,输出进独立目录同名自动加序号不覆盖;自动跳过隐藏文件和常见缓存目录如 git、node_modules;按钮运行时变灰防重复点击;同时保留命令行模式,脚本党也能直接用。 适合做交接盘点、资料报审、目录整理的行政、IT 和办公族,不用写代码。使用时双击启动.bat,选好要盘点的文件夹,按需填扩展名过滤和递归深度,点导出 Excel 清单,几秒钟后结果就在旁边的输出文件夹里,打开就能直接使用查看。第一次用建议先拿自带的示例目录跑一遍熟悉流程,再扫自己的正式文件夹。

小鹿( ﹡ˆoˆ﹡ )

政府科技管理者在推动科技成果转化时,如何解决技术供需匹配低效的问题?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

科技中介服务机构如何提升技术需求挖掘与服务推荐能力?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论
收藏 已收藏
分享
返回顶部
ljf8609390
其它技术问题 3,881 成员 9,044 内容