在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
这里面有一组不错的演示,最后,说一个无关紧要的话题:圣诞快乐:)。
平移: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是先平移再轉才會使它在固定點自轉呀!
你講的這是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我没有用过,估计应该是第一种情况。
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页的解释(今天已经碰到两个问这个问题的了)。
关于变换矩阵,本身就是有基于全局坐标和基于局部坐标两种观点,取决于编程者站的角度。可以参考红宝书第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
这里面有一组不错的演示,最后,说一个无关紧要的话题:圣诞快乐:)。
平移: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是先平移再轉才會使它在固定點自轉呀!
你講的這是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我没有用过,估计应该是第一种情况。
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页的解释(今天已经碰到两个问这个问题的了)。
关于变换矩阵,本身就是有基于全局坐标和基于局部坐标两种观点,取决于编程者站的角度。可以参考红宝书第92-94页的解释(今天已经碰到两个问这个问题的了)。
#5
顶楼朋友是*的?那我有必要解释一下红宝书了。《The Official Guide to Learning OpenGL Version 1.2》
#6
我手頭沒有中文書,英文書也買不起。我不是台灣人,是大陸人。
#7
台灣也叫「紅寶書」:)
#8
老豬講的對,D3D就是那樣乘的。