Directx11教程(55) 建立球形和锥形物体

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

程序执行后的界面如下:

image

线框模式界面如下:

image

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

       在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA基础学习之路(十一)引用传递

引用传递&#xff1a; 不同栈内存可以指向同一块堆内存&#xff0c;不同栈内存可以对一块堆内存进行修改 范例一&#xff1a; class Message {private int num 10;public Message(int num) {this.num num;}public void setNum(int num) {this.num num;}public int getNum() …

oracle 压缩导出 导入,EXP直接导出压缩问津,IMP直接导入压缩文件的方法

在10G之前&#xff0c;甚至在10G的Oracle环境中&#xff0c;有很多数据量不大&#xff0c;重要性不太高的系统依然采用EXP/IMP逻辑导出备份方式&#xff0c;或者&#xff0c;作为辅助备份方式。通常情况下&#xff0c;我们都是这样操作的&#xff1a;1.exp导出2.gzip压缩3.gzip…

Confluence 6 针对你的数据库类型确定校验 SQL

不同的数据库通常要求不同的 SQL 校验查询。校验查询通常需要尽可能的简单&#xff0c;这个查询在链接从数据库连接池中取出的时候都会被执行一次。 针对不同的数据库类型&#xff0c;我们推荐先的校验查询 SQL&#xff1a; MySQLselect 1Microsoft SQL Serverselect 1Oraclese…

c#oracle数组超出,c# – ODP.net填充数据集时的Oracle Decimal Number精度问题.异常:算术运算导致溢出...

我在c#.net 2(Visual Studio 2005 SP1)中工作,尝试使用来自Oracle10g数据库的select * from table的结果填充数据集. .net框架,IDE和数据库不能在此客户端站点更改.我使用ODP.net提供商连接,dll版本是2.102.2.20当我运行fill命令时,我得到一个例外&#xff1a;算术运算导致溢出…

php常见数据类型转换与判断

2019独角兽企业重金招聘Python工程师标准>>> 强制类型转换问题&#xff1a; &#xff08;array&#xff09; false > array(0>) &#xff08;array&#xff09; true > array(0>1) &#xff08;array&#xff09; null >array( ) 进行类型转…

Maven deploy部署jar到远程私服仓库

一、配置私服账号密码 修改maven配置文件&#xff0c;在$MAVEN_HOME/conf/setting.xml中增加如下配置&#xff1a; 注意&#xff0c;这里配置的id为releases何snapshots&#xff0c;当然可以改为其他&#xff0c;先记得这里有过id的配置&#xff0c;后面有用 二、配置远程发布到…

sublime怎么编译php,让sublime编译php、js

一、PHP1、将PHP程序设置到环境变量中&#xff0c;以使在任意目录下都可执行php命令。关于这个&#xff0c;linux下和windows下分别又不同的方法&#xff0c;可以网上搜索到。2、创建PHP编译系统添加 PHP 的 build system&#xff0c;如图所示&#xff0c; Tools->Build Sys…

HDU-Yuna's confusion 树状数组 Or Multiset

比赛的时候竟然没有想到这题可以用树状数组过&#xff0c;由于数字的区间比较小&#xff0c;所以直接开设一个树状数组&#xff0c;定义sum(i) 表示小于i的数的总数。那么判定一个数是否有的条件就是计算sum(i1) sum(i) 便可以了&#xff0c;查找第K大的数&#xff0c;也就可以…

linux系统etc什么意思,etc.是什么意思 linux下的etc是什么意思

Etc是Electronic the collection的缩写&#xff0c;指电子不停车收费系统&#xff0c;是指车辆在通过收费站时通过车上安装的Etc车载系统与收费站之间微波通讯&#xff0c;进行车辆识别&#xff0c;再联合网络和银行进行自动扣费的一种新型收费模式。电子不停车收费系统(英语&a…

《几何与代数导引》例2.7.3

求$yz$面上二次曲线\begin{equation}\begin{cases}\frac{z^2}{c^2}-\frac{y^2}{a^2}1\\x0\\\end{cases}\end{equation}绕$z$轴旋转所得的二次曲面的方程.解&#xff1a;对于二次曲面上的任意点$p(x,y,z)$.都存在相应的二次曲面上的点$(x_0,y_0,z_0)$,使得\begin{equation}(x-x_…

【Leetcode】【Longest Palindromic Substring】【最长回文子串】【C++】

题目&#xff1a;给定字符串&#xff0c;求其最长的回文子串说明&#xff1a;给定字符串长度为1000以内。思路&#xff1a;for循环遍历字符串&#xff0c;求以i为中心的回文子串长度。与最长回文子串长度max_len比较&#xff0c;若大于max_len&#xff0c;则更新max_len。说明&…

万里长征,始于足下——菜鸟程序员的学习总结

最近一直的谈论如何学习&#xff0c;如何做笔记&#xff0c;学习方法是否正确&#xff1f;&#xff08;发现问题——创新的原动力&#xff09;为什么开始系统化学习了&#xff0c;反而暴露许许多多的问题&#xff1f;细想也并不是很多&#xff0c;这都是过去的遗留问题&#xf…

linux命令添加文件权限,linux 的常用命令及文件权限管理

一些常规命令# 切换目录cd /www/app# 显示当前目录绝对路径pwd# tab键可以自动补全路径&#xff0c;命令&#xff1b;及提示选择&#xff0c;自动补全、避免输入错误、tab# 创建文件夹mkdir test# 创建文件touch 123.txt# 创建文件并打开vi 123.txt# 查看文件、more 之后&#…

SSM整合笔记

SSM整合笔记 1&#xff0c;创建maven项目 创建maven项目过程省略 ps&#xff1a;如果创建完maven项目之后项目报错&#xff0c;可能是没有配置Tomcat 2&#xff0c;在pom.xml里面导入相应的jar的依赖 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi…

linux jetty 安装目录结构,Linux下Jetty 9安装部署

Jetty简介Jetty是一个开源的servlet容器&#xff0c;它为基于Java的web内容&#xff0c;例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的&#xff0c;它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象&#xff0c;可以迅速为一些独立运行(sta…

[AX]AX2012开发新特性-全文索引

全文索引在索引中识别字符串字段中使用空格隔开的单词&#xff0c;不像普通索引仅仅使用字符串的第一个单词&#xff0c;这样能加快对字符串字段的搜索。AX2012支持每个表有一个且只能有一个全文索引&#xff0c;索引可以包含多个字段&#xff0c;对字段字符串长度没有限制&…

Bootstrap 学习笔记8 下拉菜单滚动监听

代码部分&#xff1a; <nav class"navbar navbar-default"><a href"#" class"navbar-brand">web开发</a><ul class"nav navbar-nav"><li><a href"#html5">HTML5</a></li>&…

怎么在linux的cmd中运行c项目,如何在cmd窗口编译运行c语言程序?

/这个很简单&#xff0c;只需要下载一个C/C编译器&#xff0c;添加一下环境变量&#xff0c;之后就能在cmd窗口中编译运行C语言程序了&#xff0c;下面我简单介绍一下实现过程&#xff0c;主要内容如下&#xff1a;1.下载C/C编译器&#xff0c;这里可以下载MinGW&#xff0c;包…

HTML基础DW使用教程

1、打开文件拓展名&#xff1a; 方法一.打开计算机→组→文件夹和搜索选项→查看&#xff0c;把隐藏拓展名的勾取掉。 方法二.打开计算机→文件夹选项→查看&#xff0c;把隐藏拓展名的勾取掉。 2.桌面新建一个记事本&#xff0c;把.txt后缀改成HTML。 3.右键打开方式&#xff…

eclipse中设置svn的commit快捷键

这样还没有完成&#xff0c;网上大多只有这一步 点Windows>>customize Perspective 勾上svn就可以了.......转载于:https://blog.51cto.com/2820354/963916