利用OpenGL自编程实现球体源码——网格小demo


这是一个利用VS2013开发的OpenGL小程序,通过自己编写函数实现三维的球体的绘制。主要涉及的知识点有:全屏切换,键盘响应以及场景绘制。里面包含所有的源码以及注解,如果有OpenGL的环境以及相应的库文件是可以直接运行的。如果想自己创建项目进行编写,另外还需要额外配置的是:右键项目名->配置属性->链接器->输入->附加依赖项->添加opengl32.lib glu32.lib。利用OpenGL自编程实现球体源码——网格小demo
资源截图
代码片段和文件信息
#include “stdafx.h“

#pragma warning(disable:4305) //禁止将单精度浮点数转化为双精度浮点数

enum Ref_Plain { XOY YOZ XOZ };

struct Vertex{
float x y z;
};

struct HalfQuarterSphere{
Vertex topVertex;// 1/8圆的穹顶点
Vertex **pVertexs;//其余顶点
int numCircles;//纬线数量
int numLine;//经线数量连接南北两极
float radius;//半径
};

HalfQuarterSphere hqSphere;

void generateHalfQuarterSphere(int numCir/*纬线数*/ int numLin/*经线数*/ HalfQuarterSphere &hqSphere float R){//生成1/8球体所有的顶点
hqSphere.numCircles = numCir;
hqSphere.numLine = numLin;
hqSphere.radius = R;
hqSphere.topVertex.z = R;
hqSphere.topVertex.x = hqSphere.topVertex.y = 0;
//申请内存块
hqSphere.pVertexs = new Vertex*[numCir];
for (int i = 0; i < numCir; i++){
hqSphere.pVertexs[i] = new Vertex[numLin];
}
float cirAngleSegment = HALF_PI / (numLin - 1);//每道纬线的间距
float cirAngleOffset = 0;
float zOffset = 0;
float angleOffset = 0;
float linAngleSegment = HALF_PI / (numCir - 1);//每道相邻经线在XOY平面投影线的夹角

//初始化纬线与XOZ平面的交点
float curR = 0;
int boundLine = numLin - 1;
for (int i = numCir - 1; i >= 0; i--){
zOffset = R*sin(angleOffset);
//初始化当前纬线与始经线,末经线的交点
curR = hqSphere.pVertexs[i][0].x = hqSphere.pVertexs[i][boundLine].y = sqrt(R*R - zOffset*zOffset);
hqSphere.pVertexs[i][0].y = hqSphere.pVertexs[i][boundLine].x = 0;
hqSphere.pVertexs[i][0].z = hqSphere.pVertexs[i][boundLine].z = zOffset;
cirAngleOffset = cirAngleSegment;
//初始化当前纬线与其余经线的交点
for(int j = 1; j < boundLine; j++){
hqSphere.pVertexs[i][j].x = curR*cos(cirAngleOffset);
hqSphere.pVertexs[i][j].y = curR*sin(cirAngleOffset);
hqSphere.pVertexs[i][j].z = zOffset;
cirAngleOffset += cirAngleSegment;
}
angleOffset += linAngleSegment;
}
}

void flipHalfQuarterSphere(HalfQuarterSphere &hqSphere Ref_Plain rp){
switch (rp){
case XOY://Z坐标取反
hqSphere.topVertex.z = -hqSphere.topVertex.z;
for (int i = 0; i < hqSphere.numCircles; i++){
for (int j = 0; j < hqSphere.numLine; j++){
hqSphere.pVertexs[i][j].z = -hqSphere.pVertexs[i][j].z;
}
}
break;
case YOZ://X坐标取反
hqSphere.topVertex.x = -hqSphere.topVertex.x;
for (int i = 0; i < hqSphere.numCircles; i++){
for (int j = 0; j < hqSphere.numLine; j++){
hqSphere.pVertexs[i][j].x = -hqSphere.pVertexs[i][j].x;
}
}
break;
case XOZ://Y坐标取反
hqSphere.topVertex.y = -hqSphere.topVertex.y;
for (int i = 0; i < hqSphere.numCircles; i++){
for (int j = 0; j < hqSphere.numLine; j++){
hqSphere.pVertexs[i][j].y = -hqSphere.pVertexs[i][j].y;
}
}
break;
}
}

void renderHalfQuarterSphere(const HalfQuarterSphere &hqSphere){//绘制1/8球
glBegin(GL_TRIANGLE_FAN);//以穹点为中心画三角形扇
glNormal3f(hqSphere.topVertex.x hqSphere.topVertex.y hqSphere.topVertex.z);
glVertex3f(hqSphere.topVertex.x hqSphere.topVertex.y hqSphere.topVertex.z);
for (int i = 0; i < hqSphere.numLine; i++){
glNormal3f(hqSphere.pVertexs[0][i].x hqSphere.pVertexs[0][i].y hqSphere.pVertexs[0][i].z);
glVertex

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6354  2019-03-12 18:18  SphereSphereCGfxOpenGL.cpp
     目录           0  2019-03-12 18:17  Sphere
     目录           0  2019-03-11 19:50  SphereDebug
     文件       56320  2019-03-12 18:16  SphereDebugSphere.exe
     文件      531596  2019-03-12 18:16  SphereDebugSphere.ilk
     文件     1371136  2019-03-12 18:16  SphereDebugSphere.pdb
     目录           0  2019-03-12 18:17  SphereSphere
     文件         411  2019-03-11 19:10  SphereSphereCGfxOpenGL.h
     目录           0  2019-03-12 18:16  SphereSphereDebug
     文件       26377  2019-03-12 18:16  SphereSphereDebugCGfxOpenGL.obj
     文件        1150  2019-03-11 19:50  SphereSphereDebugSphere.Build.CppClean.log
     文件        1791  2019-03-12 18:16  SphereSphereDebugSphere.log
     文件       17888  2019-03-12 15:56  SphereSphereDebugSphere.obj
     文件     7471104  2019-03-11 19:50  SphereSphereDebugSphere.pch
     文件        6776  2019-03-11 19:50  SphereSphereDebugSphere.res
     目录           0  2019-03-12 18:16  SphereSphereDebugSphere.tlog
     文件       14676  2019-03-12 18:16  SphereSphereDebugSphere.tlogCL.read.1.tlog
     文件        1978  2019-03-12 18:16  SphereSphereDebugSphere.tlogCL.write.1.tlog
     文件         161  2019-03-12 18:16  SphereSphereDebugSphere.tlogSphere.lastbuildstate
     文件        2040  2019-03-12 18:16  SphereSphereDebugSphere.tlogcl.command.1.tlog
     文件        1552  2019-03-12 18:16  SphereSphereDebugSphere.tloglink.command.1.tlog
     文件        3318  2019-03-12 18:16  SphereSphereDebugSphere.tloglink.read.1.tlog
     文件         706  2019-03-12 18:16  SphereSphereDebugSphere.tloglink.write.1.tlog
     文件         464  2019-03-11 19:50  SphereSphereDebugSphere.tlog
c.command.1.tlog
     文件        2584  2019-03-11 19:50  SphereSphereDebugSphere.tlog
c.read.1.tlog
     文件         202  2019-03-11 19:50  SphereSphereDebugSphere.tlog
c.write.1.tlog
     文件      240121  2019-03-11 19:50  SphereSphereDebugstdafx.obj
     文件      437248  2019-03-12 18:16  SphereSphereDebugvc120.idb
     文件      552960  2019-03-12 18:16  SphereSphereDebugvc120.pdb
     文件        2244  2019-03-11 19:09  SphereSphereReadMe.txt
     文件         716  2019-03-11 19:09  SphereSphereResource.h
............此处省略16个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)