opengl 扳回一球
本文介绍了使用两种方法opengl画一个球体,一个是一个球形点位置计算,然后绘制出,还有一个glut套件自带功能。
一、直接绘制法
直接贴代码,解释都写在凝视里了。绘制时先移动好坐标系。然后调用这方法画即可。
<span style="font-family:SimSun;font-size:12px;">//球心坐标为(x。y。z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份
void drawSphere(GLfloat xx, GLfloat yy, GLfloat zz, GLfloat radius, GLfloat M, GLfloat N)
{
float step_z = PI/M; <span style="white-space: pre;"> </span>//z方向每次步进的角度
float step_xy = 2*PI/N; <span style="white-space: pre;"> </span>//x,y平面每次步进的角度
float x[4],y[4],z[4]; <span style="white-space: pre;"> </span>//用来存坐标 float angle_z = 0.0; <span style="white-space: pre;"> </span>//起始角度
float angle_xy = 0.0;
int i=0, j=0;
glBegin(GL_QUADS);
for(i=0; i<M; i++)
{
angle_z = i * step_z; <span style="white-space: pre;"> </span>//每次步进step_z for(j=0; j<N; j++)
{
angle_xy = j * step_xy; <span style="white-space: pre;"> </span>//每次步进step_xy
<span style="white-space: pre;"> </span>//整个的过程能够想象3D打印机,一层一层的画出来
x[0] = radius * sin(angle_z) * cos(angle_xy); <span style="white-space: pre;"> </span>//第一个小平面的第一个顶点坐标
y[0] = radius * sin(angle_z) * sin(angle_xy);
z[0] = radius * cos(angle_z); x[1] = radius * sin(angle_z + step_z) * cos(angle_xy); <span style="white-space: pre;"> </span>//第一个小平面的第二个顶点坐标,以下相似
y[1] = radius * sin(angle_z + step_z) * sin(angle_xy);
z[1] = radius * cos(angle_z + step_z); x[2] = radius*sin(angle_z + step_z)*cos(angle_xy + step_xy);
y[2] = radius*sin(angle_z + step_z)*sin(angle_xy + step_xy);
z[2] = radius*cos(angle_z + step_z); x[3] = radius * sin(angle_z) * cos(angle_xy + step_xy);
y[3] = radius * sin(angle_z) * sin(angle_xy + step_xy);
z[3] = radius * cos(angle_z);
<span style="white-space: pre;"> </span>//至此得到一个平面的4个顶点
for(int k=0; k<4; k++)
{
glVertex3f(xx+x[k], yy+y[k],zz+z[k]); <span style="white-space: pre;"> </span>//画出这个平面
} <span style="white-space: pre;"> </span>
} <span style="white-space: pre;"> </span>//循环画出这一层的平面,组成一个环
} <span style="white-space: pre;"> </span>//z轴++,画出剩余层
glEnd(); <span style="white-space: pre;"> </span>//OK
}</span>
二、glut工具箱函数
void glutWireSphere(GLdouble radius, GLint slices,
GLint stacks); 丝状球
void glutSolidSphere(GLdouble radius, GLint slices,
GLint stacks); 实心球
我们以丝状球为例。
函数原型:
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
參数介绍:
radius
球体的半径
slices
以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴。类似于经线)
stacks
环绕在Z轴周围的线的条数(类似于地球上纬线)
相对于半径,后两个參数赋予较大的值。 渲染出来的球体表面看不出来线条。
此时众多线条已经构成比較紧密的球面。
在vs2012等高版本号的IDE中执行会出现安全性错误“error LNK2026 模块对于 SAFESEH 映像是不安全的”
解决方法:http://jingyan.baidu.com/article/47a29f24334312c01423992e.html
版权声明:本文博主原创文章,博客,未经同意不得转载。
opengl 扳回一球的更多相关文章
- 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现
[OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 【转】OPENGL基本API概述
本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核 ...
- OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )
实验平台:Win7,VS2010 先上结果截图: 本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...
- OpenGL管线(用经典管线代说着色器内部)
图形管线(graphics pipeline)向来以复杂为特点,这归结为图形任务的复杂性和挑战性.OpenGL作为图形硬件标准,是最通用的图形管线版本.本文用自顶向下的思路来简单总结OpenGL图形管 ...
- OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)
实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- opengl纹理映射总结
大概步骤: 1.创建纹理对象,并为他指定一个纹理. 2.确定纹理如何应用到每个像素上. 3.启用纹理贴图 4.绘制场景,提供纹理和几何坐标 过滤:由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应, ...
- SharpGL学习笔记(十四) 材质:十二个材质球
材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...
随机推荐
- 使用require.js和backbone实现简单单页应用实践
前言 最近的任务是重做公司的触屏版,于是再园子里各种逛,想找个合适的框架做成Web App.看到了叶大(http://www.cnblogs.com/yexiaochai/)对backbone的描述和 ...
- 使用 Cordova+Visual Studio 创建跨平台移动应用(2)
目前开发移动应用有三种模式:Native.Hybird.Web,若要开发跨平台的移动应用,又希望与本地API交互,那么Hybird是一个非常好的选择. 作为一个.Net程序员,可以使用熟悉 ...
- 客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23597229 今天将在Android 使用Fragment,ViewPagerI ...
- 【程序员联盟】官网上线啦!coderunity.com
内容简介 欢天喜地,[程序员联盟]官网上线咯(此处应该有鸡蛋丢过来...) [程序员联盟]官网 大家也许会问:“这几天小编都没出文章,跑哪里happy去啦?是不是偷懒去了?” 小编:“臣妾冤枉啊.” ...
- 【Linux探索之旅】第二部分第四课:文件操纵,鼓掌之中
内容简介 1.第二部分第四课:文件操纵,鼓掌之中 2.第二部分第五课预告:用户和权限 文件操纵,鼓掌之中 既然上一课我们学习了Linux中的文件组织方式,那么现在就该是玩弄,啊不,是操纵它们的时候了. ...
- 数据结构 - 双链表(C++)
// ------DoublyLinkedList.h------ template <class T> class DNode { private: // 指向左.右结点的指针 DNod ...
- HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp
题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子 2.每一个节点的值为2^0, 2^1 ··· 2^(n-1) 随意两个节点值不能同样 3 ...
- 使用JavaScript检测浏览器
假设你真的需要检测浏览器的类型,使用JavaScript非常easy达到. View Demo Download Source from GitHub JavaScript有一个navigator的标 ...
- MVC 使用IBatis.net
IBatis.net在asp.net MVC下的使用 IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版 ...
- Hybrid app 发展历程
距离上一篇<基于微信 js-sdk 的简单应用>已经快一年了,说来真是惭愧.上次不久之后便换了工作,一直处于比较忙的状态.其次后面酣畅一段时间都没有从事移动相关的工作.直到今年3月份开始, ...