就有關變換矩陣的問題請教

时间:2021-11-07 16:03:06
我在OpenGL的轉換順序與D3D恰好相反,比如講我想讓一個物件從原點移到右面五米處且物件自身朝向變為原先的正向九十度。
在D3D中我是先讓它乘上自轉矩陣再平移,若反過來的話則平移後的物件仍然沿原先的Y軸轉(繞圈),顯然就不對了。給我的感覺是座標軸始終不變。

OpenGL中相反,應先移動到目標點,再乘上自轉矩陣(不管移到哪裡,它都是按照正常自轉),給我的感覺是物件變化後,座標軸卻使終相對自身不變。

這些是我的感興認識了,手頭沒有書。誰能就原理上講講這些區別的本質!

還有一個困擾了我半天的錯誤,最後發現其原因竟是:OpenGL函式用的是角度值!

8 个解决方案

#1


红皮书的原文是:
  平移:glTranslate(x,y,z)由参数xyz定义了一个矩阵,该矩阵与当前矩阵相乘,是物体在三个坐标轴下发生平移,平移距离的大小为xyz
  旋转:glRotate(a,x,y,z)是一个物体(或其局部坐标系)绕一条 从原点 到x,y,z的线,沿 逆时针方向 旋转,a给出角度值。
    您说得对,我原来也使过(D3d没用过),openGL先平移后旋转和先旋转后平移产生的效果是不一样的。先平移后旋转则旋转时整个物体都会跑得离平移后的位置远远的;先旋转后平移就可以了:)。
    听老师说,openGL和D3d差别好大的,好像哪一个是左手坐标系,另一个是右手坐标系,呵呵,这些厂商真是的,净给我们添麻烦:)。

http://www.cs.utah.edu/~narobins/opengl.html
这里面有一组不错的演示,最后,说一个无关紧要的话题:圣诞快乐:)。

#2


「先平移后旋转则旋转时整个物体都会跑得离平移后的位置远远的;先旋转后平移就可以了:)。」

你講的這是D3D裡的情況吧?我發現OpenGL是先平移再轉才會使它在固定點自轉呀!

#3


要明白OpenGL的变换顺序为什么是这样,我们要看看矩阵运算的两种形式,即顶点在前还是矩阵在前,
A:  Va'=Va*Ta
B:  Vb'=Tb*Vb
其中V是变换前的顶点,V '是变换后的顶点,T是变换矩阵,Va是行向量,Vb是列向量,Ta和Tb互为转置
当需要做多次变换时,变换矩阵的顺序是不一样的。
第一种情况是按变换的顺序排列矩阵,即 Va'=Va*Ta1*Ta2,
而第二种情况则要按变换顺序的反方向排列矩阵,即 Vb'=Tb2*Tb1*Vb
OpenGL就是属于第二种情况,Direct3D我没有用过,估计应该是第一种情况。

#4


还有一点要注意,D3D用的是左手系,OGL用的是右手系,正好在一个分量上差一个符号。
关于变换矩阵,本身就是有基于全局坐标和基于局部坐标两种观点,取决于编程者站的角度。可以参考红宝书第92-94页的解释(今天已经碰到两个问这个问题的了)。

#5


顶楼朋友是*的?那我有必要解释一下红宝书了。《The Official Guide to Learning OpenGL Version 1.2》

#6


我手頭沒有中文書,英文書也買不起。我不是台灣人,是大陸人。

#7


台灣也叫「紅寶書」:)

#8


老豬講的對,D3D就是那樣乘的。

#1


红皮书的原文是:
  平移:glTranslate(x,y,z)由参数xyz定义了一个矩阵,该矩阵与当前矩阵相乘,是物体在三个坐标轴下发生平移,平移距离的大小为xyz
  旋转:glRotate(a,x,y,z)是一个物体(或其局部坐标系)绕一条 从原点 到x,y,z的线,沿 逆时针方向 旋转,a给出角度值。
    您说得对,我原来也使过(D3d没用过),openGL先平移后旋转和先旋转后平移产生的效果是不一样的。先平移后旋转则旋转时整个物体都会跑得离平移后的位置远远的;先旋转后平移就可以了:)。
    听老师说,openGL和D3d差别好大的,好像哪一个是左手坐标系,另一个是右手坐标系,呵呵,这些厂商真是的,净给我们添麻烦:)。

http://www.cs.utah.edu/~narobins/opengl.html
这里面有一组不错的演示,最后,说一个无关紧要的话题:圣诞快乐:)。

#2


「先平移后旋转则旋转时整个物体都会跑得离平移后的位置远远的;先旋转后平移就可以了:)。」

你講的這是D3D裡的情況吧?我發現OpenGL是先平移再轉才會使它在固定點自轉呀!

#3


要明白OpenGL的变换顺序为什么是这样,我们要看看矩阵运算的两种形式,即顶点在前还是矩阵在前,
A:  Va'=Va*Ta
B:  Vb'=Tb*Vb
其中V是变换前的顶点,V '是变换后的顶点,T是变换矩阵,Va是行向量,Vb是列向量,Ta和Tb互为转置
当需要做多次变换时,变换矩阵的顺序是不一样的。
第一种情况是按变换的顺序排列矩阵,即 Va'=Va*Ta1*Ta2,
而第二种情况则要按变换顺序的反方向排列矩阵,即 Vb'=Tb2*Tb1*Vb
OpenGL就是属于第二种情况,Direct3D我没有用过,估计应该是第一种情况。

#4


还有一点要注意,D3D用的是左手系,OGL用的是右手系,正好在一个分量上差一个符号。
关于变换矩阵,本身就是有基于全局坐标和基于局部坐标两种观点,取决于编程者站的角度。可以参考红宝书第92-94页的解释(今天已经碰到两个问这个问题的了)。

#5


顶楼朋友是*的?那我有必要解释一下红宝书了。《The Official Guide to Learning OpenGL Version 1.2》

#6


我手頭沒有中文書,英文書也買不起。我不是台灣人,是大陸人。

#7


台灣也叫「紅寶書」:)

#8


老豬講的對,D3D就是那樣乘的。