OpenGL 球体世界
一、类似公自转
二、核心代码
//图形渲染
void RenderScene()
{
//清楚缓存区:颜色缓存区、深度缓存区、模版缓存区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); //设置颜色:地板、甜甜圈、球体
GLfloat vFloorColor[] = {0.0f, 1.0f, 0.0f, 1.0f};
GLfloat vTorusColor[] = {1.0f, 0.0f, 0.0f, 1.0f};
GLfloat vSphereColor[] = {0.0f, 0.0f, 1.0f, 1.0f}; //基于当前时间动画:当前时间*60s
static CStopWatch rotTime;
float yRot = rotTime.GetElapsedSeconds()*60.0f; //获取观察者矩阵并入栈
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.PushMatrix(mCamera); //设置光源矩阵
M3DVector4f vLightPos = {0.0f, 10.0f, 5.0f, 1.0f};
M3DVector4f vLightEyePos;
//将光源矩阵和观察者矩阵相乘的结果放在vLightEyePos中
m3dTransformVector4(vLightEyePos, vLightPos, mCamera); //使用管线控制器,平面着色器进行渲染
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vFloorColor);
floorBatch.Draw(); //在模型视图矩阵堆栈中绘制以下图形:先压栈,绘制完毕后再出栈——始终对栈顶矩阵图形渲染 //绘制随机球体
for (int i = ; i < NUM_SPHERES; i++) {
modelViewMatrix.PushMatrix();
//模型视图矩阵堆栈栈顶矩阵与随机球体矩阵相乘的结果放入栈顶
modelViewMatrix.MultMatrix(spheres[i]);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix(), vLightEyePos, vSphereColor);
//可与公转球体使用同一个容器类对象
sphereBatch.Draw(); modelViewMatrix.PopMatrix();
} //设置甜甜圈平移距离(z轴负方向2.5)和旋转角度;
modelViewMatrix.Translate(0.0f, 0.0f, -2.5f);
modelViewMatrix.PushMatrix();
modelViewMatrix.Rotate(yRot, 0.0f, 0.1f, 0.0f);
//使用点光源着色器渲染
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix(), vLightEyePos, vTorusColor);
torusBatch.Draw();
modelViewMatrix.PopMatrix(); //设置公转球体:反方向旋转,在x轴上平移0.8
modelViewMatrix.Rotate(yRot *-2.0f, 0.0f, 1.0f, 0.0f);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vSphereColor);
sphereBatch.Draw(); modelViewMatrix.PopMatrix(); //后台渲染完成后交给前台
glutSwapBuffers();
//基于时间动画:实时刷新窗口
glutPostRedisplay();
}
//图形定位
void SetupRC()
{
//设置窗口背景颜色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
//初始化管线控制器
shaderManager.InitializeStockShaders();
//开启深度测试:图形间重叠部分无须重复绘制
glEnable(GL_DEPTH_TEST); //提交甜甜圈数据:三角形批次类对象、外圈半径、内圈半径、主半径三角形对数x、小半径三角形对数y(尽量:x=2*y,更圆滑)
gltMakeTorus(torusBatch, 0.4f, 0.15f, , );
//提交公转球体数据:三角形批次类对象、半径、底部到顶部三角形带的数量、一条三角形带中的三角形对数(一般指球体中间那条,为最大数)
gltMakeSphere(sphereBatch, 0.1f, , ); //线段模式,325个顶点
floorBatch.Begin(GL_LINES, );
for (GLfloat x = -20.0f; x <= 20.0f; x+=0.5f) {
/*
1.一个格子四个顶点,格子方向朝屏幕里面;
2.只绘制x和z轴方向上的顶点;
3.y轴坐标保持不变,负值,展示随机球体悬浮效果;
*/
floorBatch.Vertex3f(x, -0.55f, 20.0f);
floorBatch.Vertex3f(x, -0.55f, -20.0f);
floorBatch.Vertex3f(20.0f, -0.55f, x);
floorBatch.Vertex3f(-20.0f, -0.55f, x);
}
floorBatch.End(); //随机悬浮球体:y值不变,x、z值随机
for (int i = ; i < NUM_SPHERES; i++) {
GLfloat x = (GLfloat)(((rand()%)-)*0.1f);
GLfloat z = (GLfloat)(((rand()%)-)*0.1f);
spheres[i].SetOrigin(x, 0.0f, z);
}
}
三、效果


OpenGL 球体世界的更多相关文章
- three.js通过canvas实现球体世界平面地图
概况如下: 1.SphereGeometry实现自转的地球: 2.THREE.CatmullRomCurve3实现球体线条地图点确定: 3.THREE.Math.degToRad,Math.sin,M ...
- 第10课 OpenGL 3D世界
加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...
- 学习OpenGL简单易懂网站
帅炸天的教程:欢迎来到OpenGL的世界
- 现代OpenGL教程 01 - 入门指南
原文链接传送门 译序 早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNormal等固定管线API.后来工作需要接触DirectX9,shader也只是可选项而已,跟固定管线一起 ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)
在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...
- iOS 使用Quartz和OpenGL绘图
http://blog.csdn.net/coder9999/article/details/7641701 第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Qu ...
- OpenGL ES2.0 入门经典例子
原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...
- (转载)Cocos2dx-OpenGL ES2.0教程:使用VBO索引(4)
在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
随机推荐
- x86项目中读取注册表Register数据项的方法
x86项目中使用Registry读取key/value的时候,会出现重定向的问题,解决方法如下: public static string GetMachineGuid() { string guid ...
- 使用office打印到文件功能进行打印测试
大家在日常的支持工作中常会遇到各种打印问题,所以进行一些打印测试也在所难免.但是每次跑来跑去浪费了宝贵的时间,打印又浪费了纸张资源.我们也会想到安装虚拟打印机,但因为没有合适的软件,结果是我们只 ...
- get_digits
# coding=utf-8# 一.def digits(n): list1 = [] for each in n: list1.append(each) return list1print(digi ...
- CSS 实例之文字的凸起与凹陷
一些页面会有一些凹凸文字效果,这个主要是设置背景+文字阴影来达成这个效果的.文字阴影使用方法如下: text-shadow: 水平位置 垂直位置 模糊距离 阴影颜色 具体代码如下: body { ba ...
- 安装android-sdk,gradle mac 篇
安装包管理器 Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...
- iPhone 应用开发的5个贴士
[编者按]本文作者为来自 Redbytes Software 的开发者 James Richard,主要介绍开发 iPhone 应用过程中大有益处的五个贴士.文章系国内 ITOM 管理平台 OneAP ...
- zTree设置异步加载后展开
//不能直接配置展开属性 因为没有数据,需要添加回调函数,异步加载成功展开 callback: { onAsyncSuccess: zTreeOnAsyncSuccess } //异步加载成功回调函数 ...
- commonjs详解
marked here a well written artical http://javascript.ruanyifeng.com/nodejs/module.html
- C#关于微信昵称中存在的表情图标乱码解决
//在获取微信用户信息时加密保存到数据库 System.Web.HttpUtility.UrlEncode("需要加密的字段") //前端在展示是解码 <script typ ...
- Jboss Jmx-Console和 Jboss web-console安全设置
1.介绍 如果你暴露你的JBoss服务器通过网络(如通过启动服务器使用选项B 0.0.0.0或者通过改变jboss.bind.address首次出现0.0.0.0在.../jboss/server/d ...