zoukankan      html  css  js  c++  java
  • 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

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    django常用命令集合 待完善
    InSAR 数据
    InSAR 处理流程和原理
    InSAR 处理软件
    InSAR 参考书目,文献推荐
    InSAR
    小程序测试方案
    【非原创】测试环境的目的
    【非原创】测试的职责
    api自动生成思路
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4812367.html
Copyright © 2011-2022 走看看