三维向量类

原创 2011年01月10日 15:19:00

      还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据《线性代数与空间解析几何》以及《计算机图形学》等课程的相关知识写了一个三维向量类。后来做了些二维和三维的东西发现用向量操作会使很多问题变得简单直观,尤其是在OpenGL编程的时候这种感觉尤为明显。经过这么长时间的使用现在这个类已经比较完善了,早些时候将它上传到了CSDN,近来比较闲索性写个介绍吧,希望对从事三维图形开发的朋友有所帮助,也期待着与大家的交流中会有所提高。

      先把代码贴上,当然有兴趣的朋友也可以在我的资源中下载

      类的定义是这样的

      大家应该都知道所谓向量其实就是一组数,在笛卡尔坐标系中一个向量就是起点在原点的有向线段,虽然向量的起点可以在任意位置,但是标记向量的有序数却还是当起点在原点时终点的坐标。所以m_fVectorX, m_fVectorY, m_fVectorZ就唯一确定了一个向量。当然向量还有一些其他属性,比如模(也就是向量的长度),比如其和各个坐标轴的夹角,所以我做了另外四个变量m_fMod、m_fAngleX、m_fAngleY、m_fAngleZ来保存这些属性。

      生成变量有很多方法,比如直接设置终点坐标、比如通过起点和终点做差,所以我也实现了两个版本的SetVector。当然也有通过模和角度来生成变量的,但这种方法极其不常用,尤其是在三维条件下这个角度其实很不容易计算,所以我也就没有实现相应的方法。获取向量的模是常用的向量操作,我自然也对其进行了实现,GetMod就是返回模的函数。和矢量有关的操作中反向也是比较常用的一个,我也用Invert实现了这个操作。具体应用时,我们可能经常会用到单位向量,MakeUnitVector的功能就是将当前向量变成单位向量。最值得一提的就是Rotate函数,有过三维制作经验的人都应该知道在三维空间中旋转操作是最让人头疼的了,需要进行繁琐的矩阵运算。根据实际使用的经验,我实现了简单易用的Rotate函数,第一个参数fAngle用于指定旋转角度,而第二个参数vtrAxis用于指定旋转轴。这样通过调用这个函数我们就可以轻松实现任意的旋转操作,也可以初始向量到一个特殊方向,通过旋转达到指定方向,这样也省掉了自行计算复杂向量初始参数的麻烦。当然作为一个数学操作单元重载操作符是必须的,加、减、赋值不必多说,向量乘法有两种,叉积和内积,我通过“*”实现了叉积运算而通过“^”号实现了内积运算。各个向量操作主要都是通过坐标实现的,而某些操作实现之后需要相应的修正其他参数,CalculateAngles函数就是重新计算新向量的角度参数的,使用在各个函数的内部。以下是这个类的实现代码:

      我在网上也看过一些向量类,多半只是有坐标参数,没有相应操作。这个类体现出了向量的所有属性,而且封装了我能想到的向量的所有常用操作。尤其是旋转操作功能比较全面,在我实际的三维编程应用中也有很好的效果。这次拿出来和大家分享,希望大家多提宝贵意见。

一个简单的三维向量类

《3D数学基础:图形与游戏开发》中的一个三维向量类,自己做了一些小修改。...
  • clever101
  • clever101
  • 2010年11月30日 23:26
  • 4322

C++实现一个Vector3空间向量类

Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。 本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 +...
  • kenden23
  • kenden23
  • 2013年11月23日 15:05
  • 4070

向量类的实现

向量在实现图形学的算法中有很重要的位置 ,下面是 用C++写的一个向量类,实现了一些 基本的 向量操作。 代码清单: gvector3.h #ifndef GVECTOR3_H #define ...
  • qp120291570
  • qp120291570
  • 2012年10月22日 23:53
  • 5828

六、STL的数值计算---数组(向量)运算---gslice类和gslice_array类模板

3.类gslice和类模板gslice_array gslice: 是general slice的简称。。 3个属性:和slice类似,起始索引,元素数量,元素间距。但是他的元素数量和元素间距也是数组...
  • jingza
  • jingza
  • 2017年08月17日 16:12
  • 195

c++实现三维向量的操作

c++实现三维向量的操作
  • qq_24282081
  • qq_24282081
  • 2017年05月22日 21:57
  • 747

JAVA中向量类Vector

引言  大家都知道在JAVA中如果我们要存储和树立一组同类型的数据的时候,我们一般都采用数组来存储。但是大家知道数组一旦被创建,其长度就固定不变了,所以使用数组的时候需要知道或者说是我们要估算一下数...
  • heqingsong1
  • heqingsong1
  • 2012年04月28日 19:33
  • 5411

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure i...
  • u013490128
  • u013490128
  • 2016年10月15日 11:09
  • 599

3D数学 自定义三维向量类进行运算

3D数学 自定义向量类进行运算设计一个3维向量类,可以实现如下运算: 零向量 负向量 向量大小、长度、模 标量与向量的乘除法 单位向量 向量的加法和减法 距离公式 向量点乘 向量叉乘 由于原理很简单,...
  • sinat_24229853
  • sinat_24229853
  • 2015年07月15日 19:33
  • 974

《关于C++中运算符的重载》

关于运算符重载,刚开始可能会觉得它特别简单,但是随着深入的学习,会发现自己了解的实在很少 比如说在重载“>”运算符时为什么返回值类型后边加&?为什么在传递参数的时候有时候加&有时不加?加&和不加&到...
  • self_realian
  • self_realian
  • 2016年04月18日 14:36
  • 533

三维向量类Vector类封装,包含三维向量一些基本运算

自己封装的三维向量类Vector.h,包含一些常见的三维向量类的操作符重载和一些基本运算,可以直接复制粘贴作为头文件包含在项目文件中。 /*------------------------------...
  • HW140701
  • HW140701
  • 2017年06月19日 17:28
  • 1470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三维向量类
举报原因:
原因补充:

(最多只允许输入30个字)