发信人: jeopardy (子弹头), 信区: Graphics
标 题: Re: opengl中的坐标转化问题
发信站: BBS 水木清华站 (Thu Nov 23 08:48:23 2000)
发信人: pissarro (.。o 唰啊?, 信区: 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);
∶ ~~~~~~~~~~~~~~透视变换的 near和far 坐标是 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中的坐标原点是怎么定义的?可以另外设定吗?
∶ 恳请各位大侠不吝赐教,在下先行谢过!!!
--
坐标呀坐标
最新推荐文章于 2022-02-25 19:38:17 发布