游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2066|回复: 3

四元数转成旋转角度

[复制链接]

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-4-13 11:05:00 | 显示全部楼层 |阅读模式
怎么才能从四元数转换成x,y,z轴的旋转角度呢?

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2009-4-14 09:05:00 | 显示全部楼层

Re:四元数转成旋转角度


//  下面的函数的功能是将摄像机的观察方向绕某个方向轴旋转一定的角度
void RotateView_line(float angle, float x, float y, float z,D3DXVECTOR3 &p1,D3DXVECTOR3 &p2)
{
        //angle:rotate angle
        //x/y/z:转动轴的X/Y/Z(非坐标而是其长度);
        //p1:起始点(移动的轴)
        //p2:终点(移动的轴)

        D3DXVECTOR3 vNewView;

        // 获得观察方向矢量
        D3DXVECTOR3 vView =p2-p1;//(要移动轴的长度)       

        // 计算角度的cos和sin值(转化成弧度)
        float cosTheta = (float)cosf(angle);
        float sinTheta = (float)sinf(angle);

        // 计算新的观察点坐标X
        vNewView.x  = (cosTheta + (1 - cosTheta) * x * x)                * vView.x;//start
        vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta)        * vView.y;
        vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta)        * vView.z;

        // 计算新的观察点坐标Y
        vNewView.y  = ((1 - cosTheta) * x * y + z * sinTheta)        * vView.x;
        vNewView.y += (cosTheta + (1 - cosTheta) * y * y)                * vView.y;
        vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta)        * vView.z;

        // 计算新的观察点坐标Z
        vNewView.z  = ((1 - cosTheta) * x * z - y * sinTheta)        * vView.x;
        vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta)        * vView.y;
        vNewView.z += (cosTheta + (1 - cosTheta) * z * z)                * vView.z;
        p2 = p1 + vNewView;
}




void LHxxSELF_AXISROTATEY(LHxx3DOBJECT *ob,float speed)
{
        //0-1:x; 2-3:y; 4-5:z;
        D3DXVECTOR3 vAxis;//set axis 0

        //使各起始点的位置相同
        ob->LHxxAxisLine[4].LHxxLP=ob->LHxxAxisLine[2].LHxxLP=ob->LHxxAxisLine[0].LHxxLP;

        //y轴长
        vAxis=ob->LHxxAxisLine[3].LHxxLP-ob->LHxxAxisLine[0].LHxxLP;
        //vAxis = Normalize(vAxis);
        D3DXVec3Normalize(&vAxis,&vAxis);//归一化

        //rotate z
        //Rotate axis
        RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,ob->LHxxAxisLine[5].LHxxLP);

        //rotate x
        RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,ob->LHxxAxisLine[1].LHxxLP);
        //rotate ob Vertex

        //CVector3DLL temp=_CVDLL(_DVDLL(ob->LHxxAxisLine[0].LHxxLP)-ob->LHxxMove);
        //RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,_CVDLL(ob->LHxxMove));
        //ob->LHxxMove+=_DVDLL(temp);
}

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-4-14 11:52:00 | 显示全部楼层

Re:四元数转成旋转角度

很感谢leechrockgames的代码
但是我没有看明白怎么将旋转轴和旋转角度,转换到x, y, z三个方向上的旋转角度呢?

1

主题

32

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2009-4-14 19:09:00 | 显示全部楼层

Re:四元数转成旋转角度

看一下ogre里四元数引擎源代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 18:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表