坐标呀坐标

来源:互联网 发布:linux网络工程师视频 编辑:程序博客网 时间:2024/04/28 13:49
 

学成知识中心 (摘自:水木BBS)

发信人: jeopardy (子弹头), 信区: Graphics        
  : Re: opengl中的坐标转化问题
 
发信站: BBS 水木清华站
 (Thu Nov 23 08:48:23 2000) 
 
发信人: pissarro (.唰啊?, 信区
: Graphics 
  茅塞顿开!
 
发信站武汉白云黄鹤站 (Fri Nov  3 14:42:30 2000), 站内信件
 
 
  pissarro 的大作中提到
 
 
一、模型变换(Model)和视点变换(View)他们公用模型视景距阵(ModelView) 

 
而在程序中如何区分这两种变换
 
首先要明白,绝对意义的坐标是不存在的。 
坐标只是一个相对的概念,同一个物体对于不同的参照系,就有不同的坐标。 

 
从客观上说,模型变换和视点变换完全是一回事(因此OpenGL中也只有 
一个统一的ModelView Matrix)。 

 
对于同一段变换代码,可以有多种理解方式,因为移动视点也可以看作是 
将整个场景向相反的方向移动
 
 
拿一个最简单的情况来说:
 
 
void myDrawSomeThing() 

        ... 

 
void myDraw() 

        glLoadIdentity(); 
 
        glTranslate(0, 0, -3); 
        myDrawSomeThing(); 

 
有两种理解的方式:
 
 
        1) glTranslate(...)
是模型变换,
 
           
此时,照相机在坐标原点,物体在(0, 0, -3)处。
 
 
        2) glTranslate(...)
都是视点变换,
 
           
此时,照相机在(0, 0, 3)处,而物体在坐标原点。
 
 
不论你如何理解,最后的效果都是一样的,
 
即物体在照相机前方三个单位长度的位置上。
 
 
一般情况下,
如果把一个变换序列当作是是视点变换的话,就要把变换 
的顺序倒过来,而且要把变换的数值取为原来的负值
。比如: 
 
移动到(1, 2, 3)处,再绕X轴旋转60度:
 
 
对于物体来说:变换序列是:
 
        glTranslate(1, 2, 3); 
        glRotate(60, 1, 0, 0); 
 
而对于视点来说:变换序列则是:
 
        glRotate(-60, 1, 0, 0); 
        glTranste(-1, -2, -3); 
 
 
下面的方法可以用来帮助你理解和设置程序中的ModelView的变换:
 
 
1) 
每一个物体都有两个参数

      
位置pos(x, y, z)  
 
      
方向
orientation(rx, ry, rz). 
   
此时物体的方位(即模型变换)可以由如下的代码来设置:
 
void DrawObj(CObj * obj) 

      glPushMatrix(); 
      glTranslate(obj->pos.x, obj->pos.y, obj->pos.z); 
      glRotate(obj->orientation.rx, 1, 0, 0); //
X轴旋转rx
 
      glRotate(obj->orientation.ry, 0, 1, 0); //
Y轴旋转ry
 
      glRotate(obj->orientation.rz, 0, 0, 1); //
Z轴旋转rz
 
      Obj->Draw(); 
      glPopMatrix(); 

 
2) 
把视点当前普通的物体来看待,同样也有位置和方向两个参数
 
   
则,视点变换可以由如下代码完成:
 
void SetEye(CEye * eye) 

      glRotate(-eye->orientation.rz, 0, 0, 1); //
Z轴旋转rz
 
      glRotate(-eye->orientation.ry, 0, 1, 0); //
Y轴旋转ry
 
      glRotate(-eye->orientation.rx, 1, 0, 0); //
X轴旋转rx
 
      glTranslate(-eye->pos.x, -eye->pos.y, -eye->pos.z); 

 
  
注意:设置视点的过程实际就是把设置物体的代码倒来过来,
 
        
并且方向和位置都取了负值。
 
 
3)  
此时整个绘图的过程就可以表示如下:
 
void myDraw() 

    glLoadIdentity(); 
 
        SetEye(eye); 
 
        for all obj(s) do DrawObj(obj); 

 
 
 
 
二、还有OpenGL的坐标体系到底是怎样的? 

 
物体坐标、视点坐标(眼坐标)、世界坐标经常在OpenGL Red Book 
 
出现,他们的区别是什么? 
 
举个例子说明把,假设: 
        
物体A在坐标(0, 0, 10)面向
(0, 0, -∞) 
        
视点C在坐标(0, 0, 100)视线指向原点
(0, 0, 0) 
 
上面的四个个坐标就是世界坐标(也就是它们的实际坐标)
 
 
视点坐标系就是以视点为原点,以视线方向为Z轴正方向,
 
向左为X轴正方向,向上为Y轴正方向
 
(注:此处的视点坐标系为左手坐标系)
 
物体在视点坐标系中的坐标就称为视坐标,此处,物体A的视坐标为
(0, 0, 90) 
 
物体坐标就将某一个物体看作视点的而得出的视坐标系,
 
比如此时视点C在物体A的坐标系中的位置是
(0, 0, -90) 
 
 
 
 
三、请哪位大虾解释以下下面一段代码: 

     glViewport(0, 0, w, h); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 3.0, 20.0); 
     ~~~~~~~~~~~~~~
透视变换的 nearfar 坐标是 3.0-20.0,这是按什么坐标 
 ................... 
来设置的?好象物体要放在 -3.0  -20.0之间才能被视点所看到。Why? 
 
near
far是按照视坐标来设置的, 
即距离视点(3.0-20.0)个单位长度之内的物体是可见的。
 
缺省情况下,照相机位于坐标原点,且指向
(0, 0, -∞) 
按照我们刚才定义的视坐标,只有实际坐标在(-20, -3)之间的物体是可见的。
 
 
 
    glMatrixMode(GL_MODELVIEW); 
    //
书上讲OpenGL缺省时物体和视点都位于原点,且视点指向Z轴的负方向。 

    glTranslatef (0.0, 0.0, -5.0); 
    ~~~~~~~~~~~~ 
               
书上讲 这是为了将物体与视点分离的取景变换。Z坐标取-5.0 
是表示将视点向Z轴负方向移动5个单位。物体不动而视点还指向Z轴的负方向, 
这能看见物体吗?sarah个人理解 这个是按照视点坐标系得理解方法,而视点坐标系Z轴的负方向是和世界坐标系不同的
               
亦或是物体向Z轴负方向移动5个单位,这更容易理解。 
 
 
        
就像上面解释的那样: 
    glTranslatef(0, 0, -5)
如果看作是视点变换点话,应该取负值,所以
 
    
视点位置应该是
(0, 0, 5) 
 
 
 

    auxWireSphere(1.0); 
    ~~~~~~~~~~~~~
是在什么坐标系下绘制球?世界坐标、物体坐标、视点坐标 
 
我好困惑,望大家指点迷津! 
 
可以这样理解:当前绘制的物体的实际坐标(也就是世界坐标)在绘制该物体 
    
之前所有模型变换
注意,不包括视点变换)的效果的总和而定的。 
 
    
比如:你将glTranslate(0, 0, -5)看作模型变换,则物体的坐标就是(0, 0, -5) 
    
如果将glTranslate(0, 0, -5)看作视点变换,则物体的坐标就是(
0, 0, 0); 
 
-- 
**** Without eyes you can not cry **** 
#      
疑虑是潜藏在心中的叛徒
        # 
#      
它使你不敢向前迈步
            # 
#      
它使你失去你本可以赢得的
      # 
#      
美好的事物
                    # 
************************************** 
 
 
-- 
   ○       ○ 
   О      О 
   о     о 
    o     o 
     
  
 
      . . 
 
 
  yangfaliang (flying) 的大作中提到
 
 
opengl中如何将任意方向设为x

 
比如说,如何将(0,0,0)--(1,1,1)所指方向设为x轴方向
 
另外,opengl中的坐标原点是怎么定义的?可以另外设定吗
 
恳请各位大侠不吝赐教,在下先行谢过!!! 
 
 
--
 
 

原创粉丝点击