矩阵中的数学旋转公式 转换到 C++中函数 替换DirectX 9.0中D3DXMatrixRotationAxis函数
首先看下数学公式:由上面的数学公式,我们转换的C++函数:
[cpp]
//-----------------------------------------------------------------------------
// Name: setupRotate()
// Desc: 绕x,y,z轴旋转,axis:1表示绕x轴,2表示y轴,3表示z轴
//-----------------------------------------------------------------------------
VOID setupRotate(D3DXMATRIXA16 *returnMatrix,int axis, float theta)
{ www.zzzyk.com
float s, c;
s = sin(theta),c=cos(theta);
switch (axis) {
case 1: // Rotate about the x-axis
returnMatrix->_11 = 1.0f; returnMatrix->_12 = 0.0f; returnMatrix->_13 = 0.0f; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = 0.0f; returnMatrix->_22 = c; returnMatrix->_23 = s; returnMatrix->_24 = 0.0f;
returnMatrix->_31 = 0.0f; returnMatrix->_32 = -s; returnMatrix->_33 = c; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
case 2: // Rotate about the y-axis
returnMatrix->_11 = c; returnMatrix->_12 = 0.0f; returnMatrix->_13 = -s; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = 0.0f; returnMatrix->_22 = 1.0f; returnMatrix->_23 = 0.0f; returnMatrix->_24 = 0.0f;
returnMatrix->_31 = s; returnMatrix->_32 = 0.0f; returnMatrix->_33 = c; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
case 3: // Rotate about the z-axis
returnMatrix->_11 = c; returnMatrix->_12 = s; returnMatrix->_13 = 0.0f; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = -s; returnMatrix->_22 = c; returnMatrix->_23 = 0.0f; returnMatrix->_24 = 0.0f;
returnMatrix->_31 = 0.0f; returnMatrix->_32 = 0.0f; returnMatrix->_33 = 1.0f; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
default:
// bogus axis index
assert(false);
}
}
//-----------------------------------------------------------------------------
// Name: setupRotate()
// Desc: 绕自定义轴旋转
//-----------------------------------------------------------------------------
VOID setupRotate(const D3DXVECTOR3 &axis, D3DXMATRIXA16 *returnMatrix, float theta)
{
//要旋转的向量轴必须是单位向量,不然物体会变形
//assert(fabs(axis*axis - 1.0f) < .01f);
float s, c;
s = sin(theta),c=cos(theta);
// 计算出一些重复利用的子表达式。
float a = 1.0f - c;
float ax = a * axis.x;
float ay = a * axis.y;
float az = a * axis.z;
returnMatrix->_11 = ax*axis.x + c;
returnMatrix->_12 = ax*axis.y + axis.z*s;
returnMatrix->_13 = ax*axis.z - axis.y*s;
returnMatrix->_14 = 0.0f;
returnMatrix->_21 = ay*axis.x - axis.z*s;
returnMatrix->_22 = ay*axis.y + c;
returnMatrix->_23 = ay*axis.z + axis.x*s;
returnMatrix->_24 = 0.0f;
returnMatrix->_31 = az*axis.x + axis.y*s;
returnMatrix->_32 = az*axis.y - axis.x*s;
returnMatrix->_33 = az*axis.z + c;
returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f;
returnMatrix->_42 = 0.0f;
returnMatrix->_43 = 0.0f;
returnMatrix->_44 = 1.0f;
}
可能会有人对上面函数中的D3DXMATRIXA16和D3DXVECTOR3不理解,他们其实是Direct3D中表示4维矩阵和3维向量的结构体,可是我们数学公式里涉及到的是3维矩阵,可以看下下面的转换,因为要设计到矩阵相乘,故只能4维矩阵跟4维矩阵相乘,故把3维的转换成4维的了。
具体使用上面两个函数的例子:
[cpp]
// 旋转
D3DXMATRIXA16 matWorld;
//自定义旋转的轴
D3DXVECTOR3 axis(1.0f/sqrt(3), 1.0f/sqrt(3), 1.0f/sqrt(3));
D3DXMatrixIdentity( &matWorld );
/*DirectX 官方API*/
//D3DXMatrixRotationY( &matWorld, timeGetTime()/500.0f );
/*使用自定义旋转函数1*/
//setupRotate(&matWorld,2,timeGetTime()/500.0f);
/*使用自定义旋转函数2*/
setupRotate(axis,&matWorld,timeGetTime()/500.0f);
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
旋转效果:
我稍微修改了下自定义旋转的轴,改成一个非单位向量,(1.0f, 1.0f, 0.0f),旋转效果(变形的飞起,哈哈):
完整代码(看的麻烦的同学,可以拉到底下载整个项目来看):
[cpp]
//-----------------------------------------------------------------------------
// File: Lights.cpp
// Copyright (c) Microsoft Corporation & Waitingfy.com. All rights reserved.
//-----------------------------------------------------------------------------
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <strsafe.h>
#include <math.h>
#include <assert.h>
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice &nbs
补充:软件开发 , C++ ,
上一个:C++学习笔记汇总
下一个:AMPS:单向链表源码解读
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊