使用矩阵和四元数实现三维模型的空间定位

简介:
 通过矩阵变换实现绕三个坐标轴的特定角度的旋转:

//-----------------------------------------------------------------------------
// Desc: 设置世界矩阵
//-----------------------------------------------------------------------------
VOID SetWorldMatrix()
{
    static long curTime=0;
    static float elapsetime=0;
    elapsetime = (timeGetTime()-curTime)/1000.0f;
    curTime = timeGetTime();

    //创建并设置世界矩阵
    float fRoll, fPitch, fYaw;
    fRoll = fPitch = fYaw = 0.0f;

    if (m_bKey['D']) fRoll  -= 3*elapsetime;
    if (m_bKey['A']) fRoll  += 3*elapsetime;

    if (m_bKey['S']) fPitch -= 3*elapsetime;
    if (m_bKey['W']) fPitch += 3*elapsetime;
    
    if (m_bKey['Q']) fYaw   -= 3*elapsetime;
    if (m_bKey['E']) fYaw   += 3*elapsetime;

    //更新网格模型姿态
    static D3DXVECTOR3 vRight, vUp, vLook, vPos;

    vRight.x = g_matWorld._11;
    vRight.y = g_matWorld._12;
    vRight.z = g_matWorld._13;
    vUp.x    = g_matWorld._21;
    vUp.y    = g_matWorld._22;
    vUp.z    = g_matWorld._23;
    vLook.x  = g_matWorld._31;
    vLook.y  = g_matWorld._32;
    vLook.z  = g_matWorld._33;
    vPos.x   = g_matWorld._41;
    vPos.y   = g_matWorld._42;
    vPos.z   = g_matWorld._43;

    D3DXVec3Normalize(&vLook, &vLook);
    D3DXVec3Cross(&vRight, &vUp, &vLook);
    
    D3DXVec3Normalize(&vRight, &vRight);
    D3DXVec3Cross(&vUp, &vLook, &vRight);
    
    D3DXVec3Normalize(&vUp, &vUp);

    static D3DXMATRIX matPitch, matYaw, matRoll;
    
    D3DXMatrixRotationAxis(&matYaw, &vUp, fYaw);
    D3DXVec3TransformCoord(&vLook,  &vLook, &matYaw);
    D3DXVec3TransformCoord(&vRight, &vRight, &matYaw);

    D3DXMatrixRotationAxis(&matRoll, &vLook, fRoll);
    D3DXVec3TransformCoord(&vRight, &vRight, &matRoll);
    D3DXVec3TransformCoord(&vUp,    &vUp, &matRoll);

    D3DXMatrixRotationAxis(&matPitch, &vRight, fPitch);
    D3DXVec3TransformCoord(&vLook, &vLook, &matPitch);
    D3DXVec3TransformCoord(&vUp,   &vUp,  &matPitch);

    g_matWorld._11 = vRight.x;
    g_matWorld._12 = vRight.y;
    g_matWorld._13 = vRight.z;
    g_matWorld._21 = vUp.x ;
    g_matWorld._22 = vUp.y  ;
    g_matWorld._23 = vUp.z;
    g_matWorld._31 = vLook.x;
    g_matWorld._32 = vLook.y;
    g_matWorld._33 = vLook.z;

    //向前移动
    if (m_bKey['F'])
    {
        g_matWorld._41 += 30*elapsetime * vLook.x;
        g_matWorld._42 += 30*elapsetime * vLook.y;
        g_matWorld._43 += 30*elapsetime * vLook.z;
    }

    //向后移动
    if (m_bKey['V']) 
    {
        g_matWorld._41 -= 30*elapsetime * vLook.x;
        g_matWorld._42 -= 30*elapsetime * vLook.y;
        g_matWorld._43 -= 30*elapsetime * vLook.z;
    }
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &g_matWorld );
}

      通过四元数实现绕三个坐标轴的特定角度的旋转:


//-----------------------------------------------------------------------------
// Desc: 设置世界矩阵
//-----------------------------------------------------------------------------
VOID SetWorldMatrix()
{
    static long curTime=0;
    static float elapsetime=0;
    elapsetime = (timeGetTime()-curTime)/1000.0f;
    curTime = timeGetTime();

    //创建并设置世界矩阵 
    float fRoll, fPitch, fYaw;
    fRoll = fPitch = fYaw = 0.0f;

    if (m_bKey['D']) fRoll  -= 3*elapsetime;
    if (m_bKey['A']) fRoll  +=  3*elapsetime;
    if (m_bKey['S']) fPitch -= 3*elapsetime;
    if (m_bKey['W']) fPitch += 3*elapsetime;
    if (m_bKey['Q']) fYaw   -= 3*elapsetime;
    if (m_bKey['E']) fYaw   += 3*elapsetime;

    //更新网格模型姿态
    D3DXQUATERNION qR;
    D3DXMATRIX matRot;
    D3DXQuaternionRotationYawPitchRoll (&qR, fYaw, fPitch, fRoll);    
    D3DXMatrixRotationQuaternion (&matRot, &qR);
    D3DXMatrixMultiply (&g_matWorld, &matRot, &g_matWorld);

    //获取网格模型前向量
    static D3DXVECTOR3 vLook;
    vLook.x = g_matWorld._31;
    vLook.y = g_matWorld._32;
    vLook.z = g_matWorld._33;

    //向前移动
    if (m_bKey['F'])
    {
        g_matWorld._41 += 10*elapsetime * vLook.x;
        g_matWorld._42 += 10*elapsetime * vLook.y;
        g_matWorld._43 += 10*elapsetime * vLook.z;
    }

    //向后移动
    if (m_bKey['V']) 
    {
        g_matWorld._41 -= 10*elapsetime * vLook.x;
        g_matWorld._42 -= 10*elapsetime * vLook.y;
        g_matWorld._43 -= 10*elapsetime * vLook.z;
    }

    g_pd3dDevice->SetTransform( D3DTS_WORLD, &g_matWorld );
}




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/06/13/1219293.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
编解码 JavaScript 定位技术
基于Pix4Dmapper的三维模型重建应用——空间分析选址
基于Pix4Dmapper的三维模型重建应用——空间分析选址
|
2月前
|
存储 编解码 安全
带三维重建和还原的PACS源码 医学影像PACS系统源码
带三维重建和还原的PACS源码 医学影像PACS系统源码 PACS及影像存取与传输系统”( Picture Archiving and Communication System),为以实现医学影像数字化存储、诊断为核心任务,从医学影像设备(如CT、CR、DR、MR、DSA、RF等)获取影像,集中存储、综合管理医学影像及病人相关信息,建立数字化工作流程。系统可实现检查预约、病人信息登记、计算机阅片、电子报告书写、胶片打印、数据备份等一系列满足影像科室日常工作的功能,并且由于影像数字化存储,用户可利用影像处理与测量技术辅助诊断、方便快捷地查找资料或利用网络将资料传输至临床科室,还可与医院HIS、L
48 0
|
2月前
|
存储 数据采集 固态存储
带三维重建和还原功能的医学影像管理系统(pacs)源码
带三维重建和还原功能的医学影像管理系统(pacs)源码
78 0
|
2月前
|
存储 数据可视化 vr&ar
突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息) 实现三维重建与还原
突破传统,重新定义PACS/RIS服务,洞察用户需求,关注应用场景,新一代PACS/RIS系统,系统顶层设计采用集中+分布式架构,满足医院影像全流程业务运行,同时各模块均可独立部署,满足医院未来影像信息化扩展新需求、感受新时代影像服务便捷性、易用性!系统基于平台化设计,与第三方服务自然接入无压力,从功能多样化到调阅速度快;覆盖(放射、超声、内镜、病理、核医学、心血管、临床科室等,是以影像采集、传输、存储、诊断、报告书写和科室管理)为核心应用的模块化PACS/RIS系统,实现了全院级影像信息的合理共享与应用。
56 0
突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息) 实现三维重建与还原
|
2月前
|
存储 数据采集 编解码
【PACS】医学影像管理系统源码带三维重建后处理技术
【PACS】医学影像管理系统源码带三维重建后处理技术
85 0
|
2月前
|
C++
【C++医学影像PACS】CT检查中的三维重建是什么检查?
【C++医学影像PACS】CT检查中的三维重建是什么检查?
97 0
|
2月前
|
数据采集 存储 数据可视化
医院影像PACS系统三维重建技术(获取数据、预处理、重建)
开放式体系结构,完全符合DICOM3.0标准,提供HL7标准接口,可实现与提供相应标准接口的HIS系统以及其他医学信息系统间的数据通信。
142 3
|
2月前
|
存储 编解码 监控
【C++】医学影像PACS三维重建后处理系统源码
系统完全符合国际标准的DICOM3.0标准
47 2
|
存储 数据库 数据安全/隐私保护
基于C++开发,支持三维重建,多平面重建技术的医学影像PACS系统源码
支持非DICOM标准的影像设备的图像采集和处理。 3)支持各种扫描仪、数码相机等影像输入设备。 4)支持各大主流厂商的CT、MR、DSA、ECT、US、数字胃肠、内镜等影像设备; 5)支持所有的DICOM相机,支持各大厂家的激光相机。 6)系统完全支持HL7接口和ICD—10编码,可与HIS系统无缝连接。 7)提供全院级、科室级工作站以及远程会诊工作站,三维重建,多平面重建。
基于C++开发,支持三维重建,多平面重建技术的医学影像PACS系统源码
|
2月前
|
存储
医院PACS系统全套源码 强大的三维重建功能
对非DICOM影像,如超声、病理、心电图等进行了集成,做到了可以同时处理DICOM标准图像和非DICOM图像。
32 1

热门文章

最新文章