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用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...
随机推荐
- Windows Phone开发(9):关于页面状态
原文:Windows Phone开发(9):关于页面状态 按照一般做法,刚学会如何导航,还是不够的,因为要知道,手机里面的每个页面,就如同Web页面一样,是无状态的. 啥是无状态?如果我们玩过Web开 ...
- Ubuntu 组态 Tomcat而每天的错误解决
统环境:Ubuntu 14.10 安装版本号:apache-tomcat-7.0.54.tar.gz 安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.54.tar.gz ...
- IOS设计模式学习(20)命令
1 前言 在面向对象中,把指令封装在各种命令对象中.命令对象可以被传递而且在指定时刻被不同的客户端复用.这一概念精心设计而来的设计模式叫做命令(Command)模式. 2 详述 2.1 简述 命令对象 ...
- Zoj 3545 Rescue the Rabbit(ac自己主动机+dp)
标题效果: 鉴于DNA有一个正确的顺序值.请构造一个长度I的DNA在这个序列使DNA正确的顺序值极大.它被认为是负的输出噼啪. .. IDEAS: 施工顺序是,ac己主动机上走,求最大要用到dp dp ...
- Jenkins详细安装与构建部署使用教程(转)
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1.持续的软件版本发布 ...
- CSS: 解决Div float后,父Div无法高度自适应的问题
在用CSS+DIV的布局中,常常会发现,当一个DIV float之后,假设他的高度超过了其父DIV的高度时,其父DIV的高度并不会对应的进行调整.要解决问题(也叫做闭合(清除)浮动),我们有四种办法: ...
- HttpClient文件上传下载
1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...
- SPOJ TWOPATHS Two Paths
题目意思:给一棵树,找到俩个不相交的通路,使得这俩个通路的长度和乘机最大: 解法: 小哥一看呵呵 这不就是枚举点 然后求俩边的树的直径在相乘求个最大值的题么! 呵呵 这个N 有100000 当时就不玩 ...
- Microsoft Fakes进行单元测试
使用Microsoft Fakes进行单元测试(1) 一:什么是单元测试 单元测试是对软件进行准确性验证的步骤.单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试.一般最小工作单元就 ...
- 认识Backbone (五)
Backbone.Router(路由)/ Backbone.history(历史) Backbone.Router 为客户端路由提供了许多方法,并能连接到指定的动作(actions)和事件(even ...