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

时间: 2024-08-02 15:30:04

opengl画个球的相关文章

OpenglES2.0 for Android:来画个球吧

OpenglES2.0 for Android:来画个球吧 理解球坐标系 首先看下球的坐标系 ,如图 : (图来自百度百科 ) 设球上有一点 A ,球心为O ,OA在 xOy上的投影与X轴夹角为 φ (范围为 0 到360 ,单位 :度), OA在与Z的夹角为 θ (范围为 0 到 180  ,单位:度 ),球的半径为r,则有 ; r * sin θ = y / sin φ    r * sinθ  = x / cos φ   z = r * cos θ 由此可得 X,Y,Z坐标 我们前面已经知

计算机图形学(二)输出图元_2_ OpenGL画线函数

 OpenGL画线函数 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义.在OpenGL中,和选择一个点位置一样,我们使用glVertex函数选择单个端点的坐标位置.我们使用一对glBegin/g1End来引入一串端点位置.有三个OpenGL符号常量可用于指定如何把这一串端点位置连接成一组直线段.默认情况下,每一符号常量显示白色实线. 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段.通常,这会导致一组未连接的线段,除非重复某些坐标位置.

OPenGL 画球代码

1 #include <GL/glut.h> 2 #include<cstdio> 3 #include<cmath> 4 5 #define PI 3.14159265358979323846 6 #define PI2 6.28318530717958647692 7 #define r 80 8 9 GLsizei width = 600,height = 600; 10 11 int uStepsNum = 25; 12 13 14 void Init() 15

Assignment 2 使用OpenGL画安卓机器人

一. 实现简述 Assignment 2 Report 目标:画一个安卓机器人. 代码结构:在 glutDisplayFunc(drawRobot)中的参数 drawRobot 函数是实 现画机器人的最外层函数,其中包括画脸.画身体.画手和画脚.每个函数又继 续细分画的步骤和方法.如下图所示: 二. 心得体会 这次任务让我对 OpenGl 有了初步认识.通过阅读课本和网上的资料,掌握 使用 OpenGl 的基本功能,比如如何画基本的点.线和多边形.并理解了一些之 前没明白的重要概念,比如 glL

OpenGL画圆

中点画圆 1 #include<gl/glut.h> 2 3 4 void MidPointCirle(int r) 5 { 6 int x,y; 7 float d; 8 x=0;y=r;d=1.25-r; 9 glColor3f(1.0f,1.0f,1.0f); 10 glVertex2i(x,y); 11 while(x<=y) 12 { 13 if(d<0) 14 d+=2*x+3; 15 else 16 { 17 d+=2*(x-y)+5; 18 y--; 19 } 20

用OpenGL画线

. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常会提供一些绘制基本图形的接口,这些基本图形称之为图元,而OpenGL提供了点,线段,三角形三种图元绘制接口,说出来你可能不信,OpenGL就只能绘制这三种图形,本篇博文的主题是画线,OpenGL能直接绘制的图元之一. 用OpenGL绘制线段图元 给出两点的坐标,调用API即可直接画出线段. // 伪

opengl画星星

#include <windows.h> #include <gl/gl.h> #include <gl/glaux.h> #include <math.h> #define pi 3.1415926 #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "glaux.lib

openGL画不断变化位置|大小|角度|颜色的五角星

#include <windows.h> #include <gl/gl.h> #include <gl/glaux.h> #include <math.h> #include <time.h> #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "glaux.lib

【openGL】关于画点

#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math.h> #include <stdio.h> void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.0f); //修改点的尺寸,默认大小为1.0f glBegin(GL_POINTS); glVertex2f(0