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用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...
随机推荐
- 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...
- ZeroBrane Studio远程调试Lua程序(转)
环境: ZeroBrane Studio安装在Windows 7上,而要调试的程序运行在CentOS上: 设置: 在windows 7上,打开ZeroBrane Studio,打开需要调试的文件,例如 ...
- _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
- 学习FFmpeg API – 解码视频
本文转载 视频播放过程 首先简单介绍以下视频文件的相关知识.我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的 ...
- Android应用性能測试
Android内存限制 java虚拟机有内存使用上限的限制 adb shell进入手机,这此參数被纪录在/system/build.prop中,假设想直接查看能够使用adb shell getprop ...
- 慎重使用MySQL auto_increment
在使用MySQL中,常常会在表中建立一个自增的ID字段,利用自增ID可以高速建立索引,也是MySQL官方比較推荐的一种方式,可是,这样的方式在大量数据且配置主从时,可能会出现因为自增ID导致同步失败的 ...
- 升级到tomcat8时Artifact SpringMvcDemo:war exploded: Server is not connected. Deploy is not
The method getDispatcherType() is undefined for the type HttpServletRequest 升级到tomcat8 http://segmen ...
- Directx11学习笔记【五】 基本的数学知识----向量篇
本文参考dx11龙书 Chapter1 vector algebra(向量代数) 要想学好游戏编程,扎实的数学知识是尤为重要的,下面将对dx11龙书中有关向量的数学知识做一下总结. 在数学中,几何向量 ...
- java 二维码原理以及用java实现的二维码的生成、解码(转)
http://blog.csdn.net/songylwq/article/details/8643948 http://sjsky.iteye.com/blog/1136934 http://bbs ...
- 最新jhost免费jsp云空间会员邀请码
jhost支持jsp.php的免费云空间,邀请码用于激活空间服务: 邀请码:20141003104317_149661 有效期:2014-10-03 http://w ...