游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7341|回复: 19

新手问题:变换矩阵顺序问题

[复制链接]

3

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-9-29 11:34:00 | 显示全部楼层 |阅读模式
我做一个D3D的练习时,发现这样一个问题,想很久也没想明白:
        //绕Y轴侧身旋转角度
sideangle += 0.02f;
if (sideangle >= 0.7854f)//如果大于等于45度
sideangle = 0.7854f;
//绕Z轴平转角度
angle += 0.02f;
if (angle >= 6.2832f)//如果大于等于360度
angle = 0.0f;
        D3DXMATRIX World,ySideRot,zFlateRot;
        D3DXMatrixIdentity(&World);
        D3DXMatrixRotationY(&ySideRot,sideangle);
D3DXMatrixRotationZ(&zFlateMov,angle);
World = World * ySideRot * zFlateRot;//先绕Y轴,再绕Z轴?
        Device->SetTransform(D3DTS_WORLD,&World);//设置世界坐标矩阵
如果按照上面倒数第二条代码中的顺序变换矩阵,物体同时绕Y轴和Z轴旋转,它的Z轴方向垂直屏幕向里,而当我把顺序改为:
        World = World * zFlateRot * ySideRot ;//先绕Z轴,再绕Y轴?
物体也同时绕Y轴和Z轴旋转,但当绕Y轴旋转到固定值后,它的Z轴方向与垂直屏幕方向有一个角度,它将一直绕这条倾斜的Z轴旋转。这是为什么?

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2008-9-29 11:50:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

楼主这样旋转啊……
我通常是
D3DXMatrixRotationY(&World,sideangle);
D3DXMatrixRotationZ(&World,angle);
这样比较方便一点,楼主的问题我以前也有过,具体好像是角度变化引起的,你在纸上画一下看看应该可以调正确的

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-9-29 11:53:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

闪~~

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2008-9-29 12:49:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

把几个旋转用按键设置一下,然后自己调下程序感受下几种旋转次序变化就知道了
并且感受深刻的理解其中

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2008-9-29 20:33:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

2楼挺热心,不过基础不行。
3楼号称研究拓扑和测度论,不过实际上么,呵呵。
4楼和没说一样。

我用一些不那么专业的语言描述一下吧。

World = World * ySideRot * zFlateRot;//这种顺序表示ySideRot和zFlateRot是在一个绝对的坐标系中描述的变换。定义矩阵的坐标系本身始终不变。变换顺序从左向右读。就是说,先绕绝对坐标系y轴转,然后绕绝对坐标系z轴转。

World = World * zFlateRot * ySideRot;//这种顺序表示ySideRot和zFlateRot是在一个局部的坐标系中描述的变换。每进行一次变换,描述变换矩阵的坐标系本身也会跟着一起变换。变换顺序从左向右读。就是说,先绕相对坐标系(因为之前没有变换过,此时绝对坐标系和局部坐标系相同)y轴旋转,然后绕相对坐标系(此时局部坐标系已经随之前的y轴转动一起变换了)转动。因为第一次的y轴旋转改变了局部z轴的朝向,所以你看到的就是绕一个歪掉的方向旋转。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2008-9-29 20:37:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

    这两种变换的原理其实可以用矩阵的基变换(我说的不是用正交基变换描述线性变换,说的是在不同基下描述相同的矩阵)来证明,第一种顺序叫坐标变换,第二种叫框架变换,也有叫局部坐标系变换的。不过说起来有介绍这种原理的图形学书籍不太多,也不怪你不知道。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2008-9-29 20:40:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

归纳一下,任何N个仿射变换矩阵叠加,都有正反两种理解。行矩阵约定下,左到右是绝对坐标系描述的变换,从右到左是局部坐标系描述的变换。

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2008-9-30 09:00:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

楼上的提醒看看文档才发现D3DXMatrixRotationY是返回一个旋转矩阵……不是吧矩阵旋转再返回-__-我SB了……

楼上在5楼的说法我有点不理解,RealTimeRending好像有说过类似的问题,楼上说的在什么资料上的??我找来看看。

3

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2008-9-30 23:16:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

5楼的厉害,但我还是没明白绝对坐标系和相对坐标系的判定条件是什么?

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2008-10-1 16:23:00 | 显示全部楼层

Re:新手问题:变换矩阵顺序问题

   好热闹,5楼为什么说World = World * ySideRot * zFlateRot表示在绝对坐标系中变换?什么是绝对坐标系?RotationY和RotationZ都势必改变model的局部坐标系的朝向。不管你先乘或后乘。但不同的是由于矩阵乘法不满足交换率,所以zRot * yRot 一般不等于 yRot * zRot 。
  
  另楼主的World矩阵乘是没必要的,World = ySideRot * zFlateRot 就可以表示先绕y再绕z旋转。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 05:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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