从0开发游戏引擎之使用OpenGL绘制三维球体

简介: 绘制球体的难点主要在于 要在遍历循环中 根据经纬度反复的使用Cos、Sin函数算出球面上的XYZ三个顶点坐标,一直反复计算,最终三角面多的形成了一个球的形状。

绘制球体的难点主要在于 要在遍历循环中 根据经纬度反复的使用Cos、Sin函数算出球面上的XYZ三个顶点坐标,一直反复计算,最终三角面多的形成了一个球的形状。


还是老样子,直接贴代码,感兴趣的先自己看看吧。原理后面有空了统一讲!


Ball.h


#pragma once
namespace U3D
{
  class CBall :public CElement
  {
  private:
    GLSphere *sphere=NULL;
    CCTexture *ballTexture;
  public:
    void draw(float deltaTime);
    GLAABB3D getBoundBox() { return GLAABB3D{Vector3D(-9999,-9999,-99999),Vector3D(9999,9999,9999)};}
    GLSphere *getBall();
    void setBall(Vector3D &center, float radius,char*name="res/其他/地球.png");
    CBall(Vector3D &center, float radius,char*name="res/其他/地球.png");
    CBall();
    ~CBall();
  };
}


Ball.cpp


#include "Engine.h"
namespace U3D
{
  CBall::CBall()
  {
  }
  CBall::CBall(Vector3D &center,float radius,char *name)
  {
    ballTexture = CTextureManager::getInstance()->addTexture(name);
    setBall(center, radius,name);
  }
  void CBall::setBall(Vector3D &center, float radius,char*name)
  {
    ballTexture = CTextureManager::getInstance()->addTexture(name);
    if (sphere == NULL)
    {
      sphere = new GLSphere;
    }
    sphere->Set(center, radius);
  }
  void CBall::draw(float deltaTime)
  {
    Matrix3D scaleMatrix;
    Matrix3D rotateMatrix;
    Matrix3D transMatrix;
    //放缩图片
    scaleMatrix.Scale(scale.x, scale.y, scale.z);
    //水平翻转
    if (flip == true)
      scaleMatrix._11 *= -1;
    //旋转图片
    Matrix3D tempx, tempy, tempz;
    tempy.YRotate(angle.y);
    tempx.XRotate(angle.x);
    tempz.ZRotate(angle.z);
    rotateMatrix = tempx*tempy*tempz;
    // 平移图片到我们的指定位置
    transMatrix.Translate(pos.x, pos.y, pos.z);
    local_matrix = scaleMatrix*rotateMatrix*transMatrix;
    if (parent == NULL)
    {
      world_color = local_color;
      world_matrix = local_matrix;
    }
    else
    {
      sColor col = parent->getWorldColor();
      world_color.r = local_color.r*col.r;
      world_color.g = local_color.g*col.g;
      world_color.b = local_color.b*col.b;
      world_color.a = local_color.a*col.a;
      world_matrix = local_matrix*parent->getWorldMatrix();//行*列矩阵相乘__计算得到新矩阵
    }
    if (visible == false)
      return;
    Vector3D v;
    float radius = sphere->m_radius;
    Vector3D center = sphere->m_center;
    float dtor = PI / 180.0f;
    int dphi = 10; //纬度
    int dtheta = 10; //经度
    glPushMatrix();
    glColor4fv(world_color.color);
    glMultMatrixf(world_matrix.mat);
    glDisable(GL_CULL_FACE);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, ballTexture->getTextureID());
    glBegin(GL_TRIANGLE_STRIP);
    for (int phi = 0; phi <= 180 - dphi; phi += dphi)
    {
      for (int theta = 0; theta <= 360 - dtheta; theta += dtheta)
      {
        v.x = sinf(phi*dtor)*cosf(theta*dtor);
        v.y = cosf(phi*dtor);
        v.z = sinf(phi*dtor)*sinf(theta*dtor);
        glTexCoord2f(asinf(v.x) / PI + 0.5f, asinf(v.y) / PI + 0.5f);
        glVertex3f(radius*v.x + center.x,
          radius*v.y + center.y,
          radius*v.z + center.z);
        v.x = sinf((phi + dphi)*dtor)*cosf(theta*dtor);
        v.y = cosf((phi + dphi)*dtor);
        v.z = sinf((phi + dphi)*dtor)*sinf(theta*dtor);
        glTexCoord2f(asinf(v.x) / PI + 0.5f, asinf(v.y) / PI + 0.5f);
        glVertex3f(radius*v.x + center.x,
          radius*v.y + center.y,
          radius*v.z + center.z);
        v.x = sinf(phi*dtor)*cosf((theta - dtheta)*dtor);
        v.y = cosf(phi*dtor);
        v.z = sinf(phi*dtor)*sinf((theta - dtheta)*dtor);
        glTexCoord2f(asinf(v.x) / PI + 0.5f, asinf(v.y) / PI + 0.5f);
        glVertex3f(radius*v.x + center.x,
          radius*v.y + center.y,
          radius*v.z + center.z);
        if (phi > -180 && phi < 180)
        {
          v.x = sinf((phi + dphi)*dtor)*cosf((theta - dtheta)*dtor);
          v.y = cosf((phi + dphi)*dtor);
          v.z = sinf((phi + dphi)*dtor)*sinf((theta - dtheta)*dtor);
          glTexCoord2f(asinf(v.x) / PI + 0.5f, asinf(v.y) / PI + 0.5f);
          glVertex3f(radius*v.x + center.x,
            radius*v.y + center.y,
            radius*v.z + center.z);
        }
      }
    }
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_CULL_FACE);
    glColor4f(1,1,1,1);
    glPopMatrix();
  }
  GLSphere* CBall::getBall()
  {
    return sphere;
  }
  CBall::~CBall()
  {
  }
}


相关文章
|
6月前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
135 1
Android开发之使用OpenGL实现翻书动画
|
6月前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
70 1
Android开发之OpenGL的画笔工具GL10
|
6月前
|
前端开发 API vr&ar
Android开发之OpenGL绘制三维图形的流程
即将连载的系列文章将探索Android上的OpenGL开发,这是一种用于创建3D图形和动画的技术。OpenGL是跨平台的图形库,Android已集成其API。文章以2D绘图为例,解释了OpenGL的3个核心元素:GLSurfaceView(对应View)、GLSurfaceView.Renderer(类似Canvas)和GL10(类似Paint)。通过将这些结合,Android能实现3D图形渲染。文章介绍了Renderer接口的三个方法,分别对应2D绘图的构造、测量布局和绘制过程。示例代码展示了如何在布局中添加GLSurfaceView并注册渲染器。
191 1
Android开发之OpenGL绘制三维图形的流程
|
6月前
|
XML 前端开发 Java
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
70 1
|
6月前
|
XML Java Android开发
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
76 1
|
6月前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
115 0
|
C++ 计算机视觉 Python
C++ VS OpenGL绘制教室三维立体旋转图像
C++ VS OpenGL绘制教室三维立体旋转图像
124 0
C++ VS OpenGL绘制教室三维立体旋转图像
|
缓存 C++
Opengl ES之FBO
Opengl ES连载系列
142 0
|
存储 编解码 算法
Opengl ES之LUT滤镜(上)
Opengl ES之连载系列
448 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
311 0