游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4672|回复: 12

关于任意轴旋转的编程与实践

[复制链接]

108

主题

180

帖子

250

积分

中级会员

Rank: 3Rank: 3

积分
250
QQ
发表于 2006-7-14 13:12:00 | 显示全部楼层 |阅读模式
关于如何建立绕任意轴旋转的旋转矩阵的编程与实践



作者:akinggw



前言



最近在看一本3D理论方面的书,叫《3D游戏:…》跟FLY3D有关。虽然看的不是太懂,但还是有那么一点点感觉。关于如何建立绕任意轴旋转的旋转矩阵,这个问题,书上也讲过,然后在网上也看了几篇这样的文章。我觉得这两篇不错,可以看一下。



向量几何在游戏编程中的使用

http://www.86vr.com/scripts/print.asp?did=5771&page=2

3D演讲稿

file:///E:/Documents%20and%20Settings/Administrator/Local%20Settings/Temporary%20Internet%20Files/Content.IE5/JJDBFHSW/281,26,Goldman提出的方法



它们讲的都是些理论的东西,没有实际代码。我在这里就根据这些理论然后来阐述FLY3D相关的代码,很容易懂的。



任意轴旋转



为什么这里要强调任意轴旋转呢?因为基本的旋转包括对X,Y,Z三个轴的旋转。而任意轴旋转就是在任意一个角度,任意一个方向都可以旋转。

对于单一轴的旋转,我在这里就不多说,是地球人都知道了,下面我就说说关于任意轴的旋转。首先,我们阐述一下任意轴旋转的基本理论,很多文章都是用书面的语言阐述的,但《3D演讲稿》中的图形更能说明问题。我们下面看一下:




图注1

上面这张图显示了实现任意轴旋转的组成结构和过程。我想这里不应该我来说了吧,如果不明白,去找一篇理论方面的文章看一下,然后再看看图,就什么都明白了




图注2

这张图显示了如何构造第一张图中提到的三个矢量。如果看不懂也没关系,最主要的是记住后面的那个公式。




图注3

这张图数学地说明了我们的任意轴旋转的实现过程。




图注4

任意轴旋转的公式在这里,我们只要用程序实现上面这个公式就可以了。

下面,我们来看一下FLY3D中是如何实现的:



void flyMatrix::set_rotation( float ang, const flyVector& dir2 )

{

flyVector dir(dir2);

dir.normalize();



ang*=-FLY_PIOVER180;



float fCos=cosf( ang );

float fSin=sinf( ang );



    m[0][0] = ( dir.x * dir.x ) * ( 1.0f - fCos ) + fCos;

    m[0][1] = ( dir.x * dir.y ) * ( 1.0f - fCos ) - (dir.z * fSin);

    m[0][2] = ( dir.x * dir.z ) * ( 1.0f - fCos ) + (dir.y * fSin);



    m[1][0] = ( dir.y * dir.x ) * ( 1.0f - fCos ) + (dir.z * fSin);

    m[1][1] = ( dir.y * dir.y ) * ( 1.0f - fCos ) + fCos ;

    m[1][2] = ( dir.y * dir.z ) * ( 1.0f - fCos ) - (dir.x * fSin);



    m[2][0] = ( dir.z * dir.x ) * ( 1.0f - fCos ) - (dir.y * fSin);

    m[2][1] = ( dir.z * dir.y ) * ( 1.0f - fCos ) + (dir.x * fSin);

    m[2][2] = ( dir.z * dir.z ) * ( 1.0f - fCos ) + fCos;

   

    m[0][3] = m[1][3] = m[2][3] = 0;

    m[3][0] = m[3][1] = m[3][2] = 0;

    m[3][3] = 1;

}

这个函数的作用就是计算任意轴旋转的矩阵,只要这个矩阵计算出来,就可以实现物体的任意轴旋转。

OK,就到这里了吧。



关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如果你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。 如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。




[em21] [em21] [em21]

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2006-7-23 09:19:00 | 显示全部楼层 |阅读模式
推荐大家去看看Geometry Algebra.

sf_20067239194.pdf

327.21 KB, 下载次数:

2

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-7-19 16:40:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

怎么越看越糊涂了

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2006-7-19 20:39:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

算是教程?
任意轴旋转. 用四元数是最简单的.

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-7-22 14:38:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

四元数......顶点也要变成齐次坐标才能变换吧.

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-7-22 22:45:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

四元数 == 3x3 mat 再加一个平移向量就够了

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2006-7-23 09:16:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

旋转还有平移? 楼上还是比较幽默的

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-7-23 16:47:00 | 显示全部楼层

Re: Re:关于任意轴旋转的编程与实践

xpertsoft: Re:关于任意轴旋转的编程与实践

旋转还有平移? 楼上还是比较幽默的


我指的是四元数是绕过原点的轴转的

如果要放位置的话,转好了还得移过去

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-7-23 17:08:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

汗,我在抖课,请不要理我

0

主题

1037

帖子

1037

积分

金牌会员

Rank: 6Rank: 6

积分
1037
发表于 2006-7-23 19:59:00 | 显示全部楼层

Re:关于任意轴旋转的编程与实践

好东西,要打印出来研究一下才行。
to xpersoft:看懂这个要有什么数学基础吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 01:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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