在浙江联通时代畅想公司,我张海波今天了解到了cocos2d中的斜投影方法,不过起初以为OpenGL中貌似没有直接的斜投影方法。那么我们用直接指定矩阵的方法也可以达到目的。不用被4.1开头的非平行平面的斜投影吓到,实际上只需要考虑平行平面的投影效果就可以求取投影矩阵了。
例如上面例子中画的两个方块,如果希望其重合,且红的遮盖绿的。那么由于两个方块实际上是相等大小的。所以只需要考虑正方形中心的变换:(0.1, -0.1, 0.2)【红色的中心】 -> (-0.1, 0.1, -0.2)【绿色的中心】。那么投影线都是平行于这条线的。
假设我们的投影平面是z = 0 平面,容易得到 投影的关系是 Xp = X - Z/2 ; Yp = Y + Z/2,和正投影一样,我们保留z的值来做深度测试,代码如下(仅提供与上面的程序不同的部分):
[cpp] view plaincopyprint?
static const GLfloat PROJECTION_MATRIX [16] = {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, -1, 0,
-0.5, 0.5, 0, 1
};
static void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMultMatrixf(PROJECTION_MATRIX);
std::cout << "print projection " << std::endl;
printMatrix(GL_PROJECTION_MATRIX);
//画两个方块
glColor3f(1, 0, 0); //先是个红的
drawRectangle(GloatPair(-0.5, 0.5), GloatPair(0.7, -0.7), 0.2);
glColor3f(0, 1, 0); //再在背面画个绿色的
drawRectangle(GloatPair(-0.7, 0.7), GloatPair(0.5, -0.5), -0.2);
glFlush();
}
static const GLfloat PROJECTION_MATRIX [16] = {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, -1, 0,
-0.5, 0.5, 0, 1
};
static void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMultMatrixf(PROJECTION_MATRIX);
std::cout << "print projection " << std::endl;
printMatrix(GL_PROJECTION_MATRIX);
//画两个方块
glColor3f(1, 0, 0); //先是个红的
drawRectangle(GloatPair(-0.5, 0.5), GloatPair(0.7, -0.7), 0.2);
glColor3f(0, 1, 0); //再在背面画个绿色的
drawRectangle(GloatPair(-0.7, 0.7), GloatPair(0.5, -0.5), -0.2);
glFlush();
}
使用glMultMatrixf来直接指定矩阵。注意这里的 PROJECTION_MATRIX 实际上是所需要的矩阵的转置。更加复杂的斜投影在这里就不继续研究了。(浙江联通时代畅想张海波的日志)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30029683/viewspace-1339565/ ,如需转载,请注明出处,否则将追究法律责任。