图形学glTranslatef glScalef glRotated 坐标系基底向量变换的理解

这篇博客探讨了OpenGL中glTranslatef、glScalef和glRotated函数如何实现坐标系的线性变换。作者强调理解这些函数的关键在于将物体的变换视为坐标系的变换,而非物体本身。glTranslatef改变坐标系原点,glScalef调整基底向量长度,glRotated围绕给定向量进行旋转。文章通过实例解释了在不同变换顺序下,如何处理平移量和缩放比例的问题,强调了坐标系变换的重要性。
摘要由CSDN通过智能技术生成

距离下次区域赛还有6天,而我还在图形学摸鱼的这个事情,甚是微妙。。。。估计被人喷死了。不管了,先来整理一波图形学几个基础变换在OpenGL中的个人理解。
课没有听能够误打误撞弄对真的是非常感慨。
先记录下来的是三个函数的理解,我并不知道OpenGL底层的顺序,但是宏观上使用起来是合乎我自己的逻辑顺序的。

还有物体发生的线性变换,看成是物体所在的坐标系发生了线性变换。

glTranslatef(dx, dy, dz) 就是认为当前坐标系的原点从当前坐标系偏移到(0+dx, 0+dy, 0+dz)上
glScalef(sx, sy, sz)认为当前坐标系的基底向量放大的倍数,就是假设原本的描述x这个分量的向量如果为(1, 0, 0)经过这个函数以后会变成(sx, 0, 0);当然我们是学习过线性代数的,基底只要线性无关就可以了,如果原来描述x的基底为(a, b, c)之后就变成了(asx, bsy, c*sz),还有我们通俗意义上面描述的xyz其实算是标量,只不过大多数情况下的基底为(1,0,0)(0,1,0)(0,0,1),很多情况其实无需细分,可在多次坐标系偏移的时候问题就会出现,等下置后讨论。
glRotated(angle, cx, cy, cz)绕着向量(cx, cy, cz)逆时针旋转,这里是角度制,要旋转90度,angle=90。
在这里插入图片描述

其实学完了以后图形暗示地非常明显,一根线以及矩形的组合显然是一个块,而且手臂的旋转角度也设计地非常相似,就是说重点不在于具体图形的绘制,而在于坐标系的变换。
只枚举从身体的坐标系扩展到右手手臂的情况。
初始条件下绘制身体模块,此时原点已经放置在了圆的最下方,x轴与圆相切,y轴过圆心。
在这里插入图片描述
平移到需要的位置
在这里插入图片描述
坐标系逆时针旋转90度
在这里插入图片描述
最后还需要根据需要缩放x和y的值,而且得同比例缩放,否则以人的视野看的话,难免会出现矩形变成平行四边形的情况。
刚刚上面没有涉及到的问题就来了,就是再次平移的量的问题,假设身体的线段与矩形的组合纵坐标之差为len,在绘制第一个右手臂的时候进行了缩放,假如缩放的比例为s,偏移差是slen还是就是len呢?跟室友syf讨论了一下之后果断排除了一起讨论的错误结论s*len之后得到了正确答案len。 *
因为最初的len在坐标系线性变化了以后在我们看来长度确实是变成了s*len,但是这个结果是len这个标量乘以缩放以后的单位长度s得到的。所以其实是新的坐标系的刻度比原来的密集了而已,但是你要说以当前的坐标系平移还是平移了len。
接下来基本看看图想象一下大概也差不多了。
在这里插入图片描述

void display() {
   
	glClear(GL_COLOR_BUFFER_BIT);
	glClearColor(0, 0, 0, 0);
	glColor4f(0, 1, 1, 0);
	glLoadIdentity();

	for (int i = 0; i < N; i ++)
	{
   
		point[i] = Point(R * cos(2 * PI * i / N), R * sin(2 * PI * i / N));
	}
	glColor3f(1.0f, 1.0f, 0);
	glScalef(0.2f, 0.2f, 0.2f);
	glTranslatef(0, 3.0f, 0);
	glBegin(GL_LINE_LOOP);
	for (int i = 0; i < N-1; i++
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值