OPENGL中1、先旋转后平移 2、先平移后旋转 有什么区别啊???

bobosoft2003 2006-01-13 05:04:35
我需要进行图形的旋转、平移操作;但是 1 与 2 的执行结果不一样,怎样解决啊???

代码如下:

1、 先旋转后平移
''旋转
For Loopi = 1 To ViewTrans.ItemNum
Select Case ViewTrans.ItemsMode(Loopi)
Case TransRotate
glRotatef Val(ViewTrans.ItemsPara(Loopi, 1)), ViewTrans.ItemsPara(Loopi, 2), ViewTrans.ItemsPara(Loopi, 3), ViewTrans.ItemsPara(Loopi, 4)
Case Else
End Select
Next


''平移
For Loopi = 1 To ViewTrans.ItemNum
Select Case ViewTrans.ItemsMode(Loopi)
Case TransPad
wPadDis.X = wPadDis.X + ViewTrans.ItemsPara(Loopi, 1)
wPadDis.Y = wPadDis.Y + ViewTrans.ItemsPara(Loopi, 2)
wPadDis.Z = wPadDis.Z + ViewTrans.ItemsPara(Loopi, 3)
Case Else
End Select
Next
glTranslatef wPadDis.X, wPadDis.Y, wPadDis.Z

''绘制
DrawRectCoord


2、 先平移后旋转

''平移
For Loopi = 1 To ViewTrans.ItemNum
Select Case ViewTrans.ItemsMode(Loopi)
Case TransPad
wPadDis.X = wPadDis.X + ViewTrans.ItemsPara(Loopi, 1)
wPadDis.Y = wPadDis.Y + ViewTrans.ItemsPara(Loopi, 2)
wPadDis.Z = wPadDis.Z + ViewTrans.ItemsPara(Loopi, 3)
Case Else
End Select
Next
glTranslatef wPadDis.X, wPadDis.Y, wPadDis.Z

''旋转
For Loopi = 1 To ViewTrans.ItemNum
Select Case ViewTrans.ItemsMode(Loopi)
Case TransRotate
glRotatef Val(ViewTrans.ItemsPara(Loopi, 1)), ViewTrans.ItemsPara(Loopi, 2), ViewTrans.ItemsPara(Loopi, 3), ViewTrans.ItemsPara(Loopi, 4)
Case Else
End Select
Next

''绘制
DrawRectCoord
...全文
1656 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxfeng 2006-02-10
  • 打赏
  • 举报
回复
楼主基础薄弱啊
bobosoft2003 2006-01-20
  • 打赏
  • 举报
回复
zzwu(未名)

我不是要对图元的实际值进行平移和旋转,我只是通过OPENGL对整体的绘制场景进行平移和旋转,
bobosoft2003 2006-01-20
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心) 非常感谢!!
我按照你的思路,处理一下!!
寻开心 2006-01-20
  • 打赏
  • 举报
回复
这个例子
用数字1,2,3,4,5选择物体,鼠标移动控制旋转运动
http://www.cs.unc.edu/~wardk/comp236/robot2_wardk.cpp
寻开心 2006-01-20
  • 打赏
  • 举报
回复
1 计算物体的包围盒,找到包围盒的中心点 boxC
2 对物体施加一个变换矩阵,把物体移动-boxC的距离(物体回到了原点)
3 旋转物体
4 对物体再次施加一个变换矩阵,把物体移动会到boxC的位置

你需要理解3d当中的变换矩阵,变换矩阵不一定是对整个场景的,也可以是对单个物体的
在渲染物体之前单独设置这个矩阵,然后再恢复原来的矩阵就可以了
zzwu 2006-01-19
  • 打赏
  • 举报
回复
抱歉,前面记号有错,应为

画个图, 就可以清楚了:

设有下面图中的一个点为P,也就是x轴上坐标为2的点P(2,0):

|
+
|
+
|
+
|
0-----+-----*-----+-----
P

如果作平移T(1,0),可得P1(3,0):

|
+
|
+
|
+
|
0-----+-----+-----*-----
P1

再作逆时针90度旋转R,得P2(0,3):

|
*P2
|
+
|
+
|
0-----+-----+-----+-----

反之,若先作逆时针90度旋转R,可得P1'=(0,2)


|
+
|
*P1'
|
+
|
0-----+-----+-----+-----

再作平移T,得P2'(1,2):
|
+
|
+-----*P2'
|
+
|
0-----+-----+-----+-----

显然P2'与P2的位置不同.


zzwu 2006-01-19
  • 打赏
  • 举报
回复
将P(x,y) 旋转角度t的公式为:

x' = x cos t - y sin t
y' = x sin t + y cos t

其中P'(x',y')就是旋转后的点的坐标.
zzwu 2006-01-19
  • 打赏
  • 举报
回复
画个图, 就可以清楚了:

设有下面图中的一个点为P,也就是x轴上坐标为2的点P(2,0):

|
+
|
+
|
+
|
0----+----*----+-----
P

如果作平移T(1,0),可得P1(3,0):

|
+
|
+
|
+
|
0----+----+----*-----
P1

再作逆时针90度旋转R,得P2(0,3):

|
*P2
|
+
|
+
|
0----+----+----+-----

反之,若先作逆时针90度旋转R,可得P2'=(0,2)


|
+
|
P2'
|
+
|
0----+----+----+-----

再作平移T,得P3'(1,2):
|
+
|
+----P2'
|
+
|
0----+----+----+-----

显然P2'与P2的位置不同.

bobosoft2003 2006-01-19
  • 打赏
  • 举报
回复
我就是具体的代码实现一直想不明白啊!!!!!!!!!!!!
bobosoft2003 2006-01-19
  • 打赏
  • 举报
回复
syy64(太平洋) :
我是个新手,能不能给个简单代码算法啊
先谢谢拉
syy64 2006-01-19
  • 打赏
  • 举报
回复
也可以这么理解:把坐标系原点移到物体的中心位置,目的都是一样的,就是为了在旋转的时候去掉平移的影响,只是单纯的旋转,旋转过后再平移回去,就是要将整个坐标系恢复到原状。
bobosoft2003 2006-01-19
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心):
您的解决方案是:
1 把物体移动到原点
2 旋转
3 再移动回原来的位置

我有几各疑问:
1 平移后,整个的坐标系都发生了平移,原点的位置也平移了,后面的操作还是在已经发生移动的坐标系下发生的;我怎样才能实现“把物体移动到原点”,这里的原点怎么理解???
bobosoft2003 2006-01-19
  • 打赏
  • 举报
回复
谢谢各位,知道了,但是我的问题还没有解决,
happy__888([顾问团]寻开心) 您知道到我真正需要解决的问题,你说的我还是高不清楚,麻烦你再详细点啊,能不能具体到代码的程度啊,谢谢啊,
寻开心 2006-01-16
  • 打赏
  • 举报
回复
用矩阵乘法的不满足交换率解释更合理
poseidon_319 2006-01-16
  • 打赏
  • 举报
回复
楼上的兄弟说得很队,平移,旋转都是矩阵相乘的结果,矩阵运算不满足交换律 也就是平移矩阵A,旋转矩阵B,先平移后旋转AB不等于先旋转后平移BA,
弟十六 2006-01-16
  • 打赏
  • 举报
回复
内部最终将转换为平移和旋转矩阵相乘的操作,而矩阵乘法是不满足交换律的,所以从原理上绝对不能调换操作顺序,但矩阵乘法满足结合律,所有操作都可以联合成一个最终矩阵,然后作用在顶点上,这和用顶点按顺序乘矩阵的结果是一样的。
寻开心 2006-01-13
  • 打赏
  • 举报
回复
glRotatef是让物体围绕一个向量来旋转,别忘记向量是没有位置的,只表示一个方向
而这个函数是假定这个轴是经过原点的

所以直接使用这个函数的效果就是物体在围绕经过原点的,指定方向的轴在旋转

而你期望的是,围绕经过你指定的一个点,和经过这个点的指定方向的轴来旋转
这个是需要前面说的几个动作合成来完成的
寻开心 2006-01-13
  • 打赏
  • 举报
回复
其实主要是你没有理解glRotatef函数的意义,它是围绕坐标轴旋转的,

拿一个中心在原点的物体来说,先旋转再移动,看起来物体是围绕自身的中心在转
先移动,再旋转,看起来,物体是围绕空间的某个轴(非自身的轴)在转动

你这个问题应该和前面的一个提问关联的:如何任意位置的物体,围绕自身转轴旋转
解决方案就是:
把物体移动到原点
旋转
再移动回原来的位置
syy64 2006-01-13
  • 打赏
  • 举报
回复
那差别大了,旋转的基点不一样。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧