当前位置:编程学习 > C/C++ >>

矩阵中的数学旋转公式 转换到 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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,