旋转、光照、透明
文章目录
1、旋转
1.1、旋转的单位是角度值
1.2 旋转的是整个坐标系
glRotatef()方法的语法格式如下:glRotatef (float angle, float x, float y, float z)
其中,参数angle通常是一个变量,表示对象转过的角度;x表示X轴的旋转方向(值为1表示顺时针、-1表示逆时针方向、0表示不旋转);y表示Y轴的旋转方向(值为1表示顺时针、-1表示逆时针方向、0表示不旋转);z表示Z轴的旋转方向(值为1表示顺时针、-1表示逆时针方向、0表示不旋转)。
例如,要将对象经过X轴旋转n角度,可以使用下面的代码:gl.glRotatef(n, 1, 0, 0);
注意:旋转遵循右手规则,如果向量(x,y,z)点正对着用户的话,旋转是逆时针的。
1.3 如果进行一系列旋转操作,顺序很重要
如果你要还原一个旋转操作,只需要把角度值或者三个坐标值取负就可以,例如glRotatef(angle, x, y, z)
可以被glRotatef(angle, -x, -y, -z)
或者glRotatef(-angle, x, y, z)
复位。
但是如果你像下面这样做了一系列的旋转操作:
gl.glRotatef(90f, 1.0f, 0.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 1.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 0.0f, 1.0f);
取负:
gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);
gl.glRotatef(90f, 0.0f, -1.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 0.0f, -1.0f);
还需要逆序执行,如下:
gl.glRotatef(90f, 0.0f, 0.0f, -1.0f);
gl.glRotatef(90f, 0.0f, -1.0f, 0.0f);
gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);
1.4 平移和旋转
由于平移和旋转操作都是基于网格自己的坐标系统,所以记住平移和旋转操作的顺序是很重要的事情。
如果先对网格进行了平移操作,然后又进行旋转,那么平移是基于当前的网格坐标状态,而旋转则是基于新的坐标。
如果先进行了旋转操作,然后进行平移,那么平移操作将会在旋转之后的坐标基础上进行。
2、缩放
public abstract void glScalef (float x, float y, float z)
缩放,可沿任意坐标轴方向上独立进行。缩放和所有的顶点都乘以一个缩放因子的效果是一样的。在下图中,我们用gl.glScalef(2f, 2f, 2f)进行缩放,这也就相当于所有的顶点坐标都乘以2.