游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3589|回复: 5

旋转并不容易!

[复制链接]

4

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2005-6-17 12:31:00 | 显示全部楼层 |阅读模式


我很困惑,如何控制一个物体始终让它绕自身坐标轴旋转?
我是这么做的:
……
glLoadIdentity()  ;
glRotatef(DY,  0 ,1 ,0) ;
glRotatef(DX,  1 ,0 ,0) ;
glRotatef(DZ,  0 ,0  1) ;
Draw() ;
……
但是旋转几次后,我发现,旋转轴就乱了,原来控制物体绕自身x轴旋转动方向键,现在却使它
绕别的轴(不一定是它自身的坐标轴,但肯定是绝对坐标轴)旋转。
这是为什么?

敬请大家指教!

4

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-6-17 16:35:00 | 显示全部楼层

Re:旋转并不容易!

这个肯定有问题了,你这个旋转是一个混合的效果MyMxMz(x1,x2,x3,x4)T为变换后的坐标,如果你仅仅改变Dx或者Dy或者Dz,你旋转的效果仍然要和另外两个叠加,绕y轴估计没有什么问题,但是绕x轴和z轴就有问题了,剩下的事情你自己去琢磨吧。

190

主题

1801

帖子

2096

积分

金牌会员

Rank: 6Rank: 6

积分
2096
QQ
发表于 2005-6-17 23:19:00 | 显示全部楼层

Re:旋转并不容易!

hi不好意思,白天掉线了,下面这个能解决你的问题

glIdentity();
glLookAt(。。。。。);
if(matrix==null)//初始化矩阵
        matrix=glGetFloatv(GL_MODELVIEW_MATRIX)

glPushMatrix()
......
glPopMatrix()

glLoadMatrix(matrix);
if(DX has changed)
        glrotate(deltaDX....)//delta纯指增量
else if(DY has changed)
        glrotate(deltaDY....)
else if(DZ has changed)
        glrotate(deltaDZ....)
matrix=glGetFloatv(GL_MODELVIEW_MATRIX)

//draw something

2

主题

177

帖子

177

积分

注册会员

Rank: 2

积分
177
发表于 2005-6-18 23:47:00 | 显示全部楼层

Re:旋转并不容易!

欧拉坐标空间会出现这种万向节锁(Gimbal Lock)问题,你需要用四元数来进行旋转,四元数可以比较轻松的进行球面线性插值

4

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-6-19 10:24:00 | 显示全部楼层

Re:旋转并不容易!

我觉得3楼的if else或者case语句就可以解决了,楼上的可否解释一下怎么用四元其次坐标解决这个问题,还有什么是Gimbal Lock,请指教。

42

主题

334

帖子

344

积分

中级会员

Rank: 3Rank: 3

积分
344
发表于 2005-6-22 11:10:00 | 显示全部楼层

Re:旋转并不容易!

你的问题是不是这个。
http://bbs.gameres.com/showthread.asp?threadid=31377
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 03:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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