OpenGL与3D开发-旋转光照透明

本文详细介绍了OpenGL进行3D开发中的关键概念,包括旋转、缩放、光照和透明处理。在旋转部分,讨论了角度单位、坐标系旋转顺序以及平移和旋转的组合。接着探讨了缩放和平移的相互作用,强调了操作顺序的重要性。在光照方面,讲解了真实世界光照的三要素,并展示了在OpenGL中设置光源和材料的方法。最后,阐述了如何实现透明效果,通过混合和源因子、目标因子的概念,以及glBlendFunc函数的应用,创建出透明和混合颜色的视觉效果。
摘要由CSDN通过智能技术生成

旋转、光照、透明

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.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值