使用向量点积来实现将模型绕着中心点旋转
如何在三维空间中实现模型绕着中心点旋转?这个问题听起来容易,但是经过我的实践,发现其实还是挺困难的。在研究OpenGL和DirectX的初级阶段,我相信这个问题还是挺伤大家的脑筋的。究竟该如何实现这样的功能呢?我想大家可能需要回过头,复习一下我们高中的知识,通过平面解析几何的类比,大家会找到好方法的。
这里要追溯到我们高中所学的向量和平面解析几何的知识。话说向量a是一个普通的向量,向量b是a相对于中心顺时针旋转α角形成的。已知向量a和b,求α。
方法很简单,首先将这个图片平移,如下:
这里我们可以利用向量的点阵公式,a·b = |a||b|cosα,算出α= arccos(a·b/|a||b|
)。在解析几何中,设a (xa, ya),b (xb, yb),那么a·b = xa xb+ ya yb。|a||b|=√(xa2+ya2)·√(xb2+yb2),这样求解起来就容易了。
现在思路换到三维空间。同理,a·b满足广义的笛卡尔内积形式,这样的话,同样地可以通过上述的公式求出两个三维向量之间的夹角。
设a (xa, ya,za),b (xb, yb,zb),那么a·b = xa xb+ ya yb+ za zb。|a||b|=√(xa2+ya2+za2)·√(xb2+ yb2+zb2),这按照方法求出α。
这样做对向量的旋转有着很大的作用。如果一个圆锥,它的默认的位置是这样的(如下图),那么可以取它的向上的向量up(0,1,0),想让它的开口朝向黄色的线direction(1,1,-1),蓝色的线和黄色的线之间的角度为α,那么我们可以这样运算(本例使用Qt实现)。
// 计算出旋转轴和旋转角度
float angleInRadians = PI - acos( QVector3D::dotProduct( up, direction ) /
direction.length( ) / up.length( ) );
const QVector3D& axis = QVector3D::crossProduct( up, direction );
glPushMatrix( );
glTranslatef( pos.x( ), pos.y( ), pos.z( ) );
glRotatef( angleInRadians * 180 / PI,
axis.x( ), axis.y( ), axis.z( ) );
这里,axis是旋转的轴向量,因为向量up和direction相交于一点(模型的几何中心),那么它们唯一确定一个平面,这个平面的法向量就是up×direction,所以要使up向量旋转到-direction向量上(之所以是-direction是因为要求开口朝上而不是尖尖朝上),就要以axis为轴进行旋转。下面就是执行结果。
我的项目源代码已经上传,需要的朋友们可以下载。
演示程序下载地址:这里 源代码下载地址:这里
分享到:
相关推荐
在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个n维向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),求点积a⋅b=a1b1+a2b2+...+anbn。 【输入】 第一行是一个整数n(1≤n≤1000); 第二行包含n个整数a1,...
在Linux平台上用多线程方法实现浮点向量的点积计算: 点积规则可以自己定,程序中采用的是ai=bi=-1/1/0(按3取余运算),另外,计算程序运行时间. 输入格式为: vec_mul thread_num N 参数: thread_num:线程数,从1到...
本科操作系统实验代码,使用多线程编程实现浮点向量的点积计算。
matlab 函数 R = fnKTheta2R(k,theta),输入单位向量K,角度theta, 输出等效的旋转矩阵R
这是一个MATLAB代码。输入参数为两组不同坐标系中的向量,通过计算实现两组向量之间的旋转。组后将旋转矩阵进行分解求出三个旋转角。
向量空间模型的java实现,希望大家一起探讨
这是一个非常简单的程序,它实现了罗德里格斯的旋转公式。 输入是要绕指定轴旋转指定角度的三维列向量或行向量的数组。 输出是与输入数组具有相同维度的旋转向量数组。
vsm向量空间模型java实现(源码) 已经测试了,可以直接导入eclipse使用。
第十一章向量自回归 ( VAR) 模型和向量误差修正 (VEC)模型
基于支持向量机的MATLAB实现相关代码
matlab开发-旋转使用生成向量。这是一个使用本征向量旋转图片的小程序。
支持向量机等各种算法和模型的优点和缺点.docx支持向量机等各种算法和模型的优点和缺点.docx支持向量机等各种算法和模型的优点和缺点.docx支持向量机等各种算法和模型的优点和缺点.docx支持向量机等各种算法和模型的...
简单向量空间模型可用于文档相似度的计算,也可以用于检索信息,配有详细的注释
GPU上实现的向量点积的性能分析.pdf
北邮计算机系统结构实验三-使用MIPS指令实现求两个数组的点积
【预测模型】基于蚱蜢算法优化支持向量机实现预测分类模型matlab源码.md
代码 基于SVM支持向量机算法的降水量预测模型代码代码 基于SVM支持向量机算法的降水量预测模型代码代码 基于SVM支持向量机算法的降水量预测模型代码代码 基于SVM支持向量机算法的降水量预测模型代码代码 基于SVM支持...
向量数量积 首先输入向量维数 然后输入两个向量的坐标 最后评价程序
bert模型句子向量化
第十一章向量自回归(VAR)模型和向量误差修正(VEC)模型.pptx