Directx11教程(55) 建立球形和锥形物体
本教程中,我们新建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) 建立球形和锥形物体相关推荐
- Directx11 教程(2) 基本的windows应用程序框架(2)
Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...
- Directx11教程四十六之FBX SDK
在之前的DX11入门系列文章中,有篇有关 Directx11教程四十之加载OBJ模型 读取obj模型数据的博客.不过在obj读取的那篇博客我有些坑并没有说,就是我写的那个obj解析器只能解析特定的ob ...
- Directx11教程(14) D3D11管线(2)
Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二)让物体动起来②
第二种方法,CompositionTarget动画,官方描述为:CompositionTarget对象可以根据每个帧回调来创建自定义动画.其实直接点,CompositionTarget创建的动画是基于 ...
- Directx11教程39 纹理映射(9)
Directx11教程39 纹理映射(9) 原文:Directx11教程39 纹理映射(9) 在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理Texture ...
- HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧
前言 所谓高手,也就是熟悉别人制定的游戏规则.并且能在规则内跳舞的人.(随笔,转自王哲的博客) 09年的时候,为了跳槽和兴趣,转型游戏行业,因此去网上找资料学习各种游戏相关的资料.也是缘分吧,看到了深 ...
- 新手教程:建立网站的全套流程与详细解释
新手教程:建立网站的全套流程与详细解释 你要是 Baidu 这个话题,得到的结果八成都是广告--他们都会告诉你,"嘿,我(或某公司)这里可以建网站,傻瓜式的哟,快来投奔我吧!" 新 ...
- dynamic web twain java_扫描识别工具Dynamic Web TWAIN使用教程:建立一个“Hello World”扫描页面...
原标题:扫描识别工具Dynamic Web TWAIN使用教程:建立一个"Hello World"扫描页面 Dynamic Web TWAIN(www.evget.com)是一个专 ...
- Python+OpenCV实用案例应用教程:建立自定义物体检测器
本章将深入探讨物体检测的概念,这是计算机视觉中最常见的挑 战之一.既然在这本教程中已经讲了很多内容了,读到这里,你也许会 想,什么时候才能把计算机视觉应用实践中呢.你是否想过建立一个 系统来检测车辆和 ...
最新文章
- Apache的管理及优化web
- 经典语句,看看让心灵宁静
- 鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?
- Bug--时区问题导致IDEA连接数据库失败
- java servlet深入理解_深入理解 Java Servlet
- CCS6.2.0 安装步骤详解
- Windows实现微信多开+美化图标
- mysql卸载安装pxc_PXC 5.7.14 安装部署
- 高通SDM439平台使能sensor hub的auto detect模式
- 压力测试常用专业名词解释
- C#基础知识(停止更新、移步博客园)
- springboot日志配置logback-spring.xml
- 使用TensorFlow XLA辅助实现BERT预训练加速
- 分享两个小技巧,让你的PPT看起来更高级
- IDEA 2019.3 导入导出设置
- 一个AI小白如何理解近似匹配检索
- 市政管网检测机器人收费标准_淮安市金湖县市政管道机器人检测怎么收费
- GRE 写作经常用到的修辞手法
- 数据库误删了数据再也不用跑路了,
- windows无法访问指定设备路径或文件怎么回事(系统找不到指定路径解决方法)