本教程中,我们新建2个model class,SphereModelClass以及CylinderModelClass,分别用来表示球形和锥形物体。

程序执行后的界面如下:

线框模式界面如下:

从线框模式可以看出,球形是由三个因素决定:半径、经度线、纬度线。

在SphereModelClass.cpp中,我们看到,初始化顶点缓冲和索引缓冲的函数为:InitializeBuffers(ID3D11Device* device,  float radius, int numSlices, int numStacks),它多了三个参数,分别表示半径、经度切片的数量、纬度切面的数量。具体构建球形顶点的操作在函数buildStacks(vertices, indices)中,主要就是把经纬度切片的数目转化成球坐标系中的角度,求出球坐标系中顶点,再转化到笛卡尔坐标系中。

代码如下:

void SphereModelClass::buildStacks(VertexList& vertices, IndexList& indices)
    {
    float phiStep = PI/m_NumStacks;

int numRings = m_NumStacks-1;

// 对于每个纬度环,计算顶点.
    for(int i = 1; i <= numRings; ++i)
        {
        float phi = i*phiStep;

// 环上的顶点
        float thetaStep = 2.0f*PI/m_NumSlices;
        for(int j = 0; j <= m_NumSlices; ++j)
            {
            float theta = j*thetaStep;

VertexType v;

// 球坐标到笛卡尔坐标的转化
            v.position.x = m_Radius*sinf(phi)*cosf(theta);
            v.position.y = m_Radius*cosf(phi);
            v.position .z = m_Radius*sinf(phi)*sinf(theta);

D3DXVec3Normalize(&v.normal, &v.position);

//球的纹理坐标
            v.texture.x = theta / (2.0f*PI);
            v.texture.y = phi / PI;

v.Kd    = D3DXVECTOR4(0.2, 0.2, 0.1,1.0);
            v.Ks = D3DXVECTOR4(0.2, 0.2, 0.2,1.0);
            vertices.push_back( v );
            }
        }

// 球的极点: 会出现纹理坐标扭曲
     VertexType t1;
     t1.position = D3DXVECTOR3(0.0f, -m_Radius, 0.0f);
     t1.normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
     t1.texture = D3DXVECTOR2(0.0f, 1.0f);
     t1.Kd = D3DXVECTOR4(0.2, 0.2, 0.1,1.0);
     t1.Ks = D3DXVECTOR4(0.2, 0.2, 0.2,1.0);
    
     vertices.push_back( t1 );

t1.position = D3DXVECTOR3(0.0f, m_Radius, 0.0f);
     t1.normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
     t1.texture = D3DXVECTOR2(0.0f, 0.0f);

vertices.push_back(t1 );

int northPoleIndex = (int)vertices.size()-1;
    int southPoleIndex = (int)vertices.size()-2;

int numRingVertices = m_NumSlices+1;

// 计算索引(不考虑极点)
    for(int i = 0; i < m_NumStacks-2; ++i)
        {
        for(int j = 0; j < m_NumSlices; ++j)
            {
            indices.push_back(i*numRingVertices + j);
            indices.push_back(i*numRingVertices + j+1);
            indices.push_back((i+1)*numRingVertices + j);

indices.push_back((i+1)*numRingVertices + j);
            indices.push_back(i*numRingVertices + j+1);
            indices.push_back((i+1)*numRingVertices + j+1);
            }
        }

//北极点索引
    for(int i = 0; i < m_NumSlices; ++i)
        {
        indices.push_back(northPoleIndex);
        indices.push_back(i+1);
        indices.push_back(i);
        }

//南极点索引
    int baseIndex = (numRings-1)*numRingVertices;
    for(int i = 0; i < m_NumSlices; ++i)
        {
        indices.push_back(southPoleIndex);
        indices.push_back(baseIndex+i);
        indices.push_back(baseIndex+i+1);
        }
    }

在CylinderModelClass.cpp中,我们看到InitializeBuffers(ID3D11Device* device,  float topRadius, float bottomRadius,     float height, int numSlices, int numStacks),它多出了5个参数,分别表示锥体的顶部圆半径、底部圆半径,高度、经度切片的数量、纬度切片的数量。

具体计算顶点缓冲和索引缓冲由个函数组成,这三个函数的具体代码请参考源文件:

buildStacks(vertices, indices);
buildTopCap(vertices, indices);
buildBottomCap(vertices, indices);

完整的代码请参考:

工程文件myTutorialD3D11_50

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1150-58.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

Directx11教程(55) 建立球形和锥形物体相关推荐

  1. Directx11 教程(2) 基本的windows应用程序框架(2)

    Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...

  2. Directx11教程四十六之FBX SDK

    在之前的DX11入门系列文章中,有篇有关 Directx11教程四十之加载OBJ模型 读取obj模型数据的博客.不过在obj读取的那篇博客我有些坑并没有说,就是我写的那个obj解析器只能解析特定的ob ...

  3. Directx11教程(14) D3D11管线(2)

    Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...

  4. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二)让物体动起来②

    第二种方法,CompositionTarget动画,官方描述为:CompositionTarget对象可以根据每个帧回调来创建自定义动画.其实直接点,CompositionTarget创建的动画是基于 ...

  5. Directx11教程39 纹理映射(9)

    Directx11教程39 纹理映射(9) 原文:Directx11教程39 纹理映射(9) 在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理Texture ...

  6. HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧

    前言 所谓高手,也就是熟悉别人制定的游戏规则.并且能在规则内跳舞的人.(随笔,转自王哲的博客) 09年的时候,为了跳槽和兴趣,转型游戏行业,因此去网上找资料学习各种游戏相关的资料.也是缘分吧,看到了深 ...

  7. 新手教程:建立网站的全套流程与详细解释

    新手教程:建立网站的全套流程与详细解释 你要是 Baidu 这个话题,得到的结果八成都是广告--他们都会告诉你,"嘿,我(或某公司)这里可以建网站,傻瓜式的哟,快来投奔我吧!" 新 ...

  8. dynamic web twain java_扫描识别工具Dynamic Web TWAIN使用教程:建立一个“Hello World”扫描页面...

    原标题:扫描识别工具Dynamic Web TWAIN使用教程:建立一个"Hello World"扫描页面 Dynamic Web TWAIN(www.evget.com)是一个专 ...

  9. Python+OpenCV实用案例应用教程:建立自定义物体检测器

    本章将深入探讨物体检测的概念,这是计算机视觉中最常见的挑 战之一.既然在这本教程中已经讲了很多内容了,读到这里,你也许会 想,什么时候才能把计算机视觉应用实践中呢.你是否想过建立一个 系统来检测车辆和 ...

最新文章

  1. Apache的管理及优化web
  2. 经典语句,看看让心灵宁静
  3. 鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?
  4. Bug--时区问题导致IDEA连接数据库失败
  5. java servlet深入理解_深入理解 Java Servlet
  6. CCS6.2.0 安装步骤详解
  7. Windows实现微信多开+美化图标
  8. mysql卸载安装pxc_PXC 5.7.14 安装部署
  9. 高通SDM439平台使能sensor hub的auto detect模式
  10. 压力测试常用专业名词解释
  11. C#基础知识(停止更新、移步博客园)
  12. springboot日志配置logback-spring.xml
  13. 使用TensorFlow XLA辅助实现BERT预训练加速
  14. 分享两个小技巧,让你的PPT看起来更高级
  15. IDEA 2019.3 导入导出设置
  16. 一个AI小白如何理解近似匹配检索
  17. 市政管网检测机器人收费标准_淮安市金湖县市政管道机器人检测怎么收费
  18. GRE 写作经常用到的修辞手法
  19. 数据库误删了数据再也不用跑路了,
  20. windows无法访问指定设备路径或文件怎么回事(系统找不到指定路径解决方法)

热门文章

  1. sanic官方文档解析之下载和Configuration
  2. 题解-BOI 2004 Sequence
  3. MUI主界面菜单同时移动主体部分不出滚动条解决
  4. iOS WebView 加载本地资源(图片,文件等)
  5. Discuz!$_G变量的使用方法
  6. windows bat 批处理 !vm 合并快播文件
  7. USACO 2.4.1 The Tamworth Two
  8. java 注解默认值
  9. mongodb 部署
  10. 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书