距离下次区域赛还有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++