对于旋转,让我觉得头昏眼花,所以决定好好的理一下头绪,好好地转一下。
相关代码段:
1.
float heading;
float xpos;
float zpos;
GLfloat yrot;
GLfloat walkbias = 0;
GLfloat lookupdown = 0.0f;
GLfloat z = 0.0f;
相关释义:
xpos、zpos 分别为游戏者(以后用A来指代)相对于房屋中心坐标系的x方向和z方向位移;yrot 为A相对于房屋坐标系的y轴正方向的旋转角度,逆时针方向为正;lookupdown则为房屋坐标系绕它的x 轴正方向相对于A逆时针旋转的角度。
2.
函数int DrawScene(GLvoid)中
GLfloat xtrans = -xpos; //房屋坐标系相对于A的x方向的位移
GLfloat ztrans = -zpos; //房屋坐标系相对于A的z方向的位移
GLfloat ytrans = -walkbias-0.25f; //房屋坐标系相对于A的y方向的位移
GLfloat sceneroty = 360.0f – yrot; //房屋坐标系绕y轴正方向相对于A的旋转角度
3.
if (keys[VK_PRIOR])
z-=0.02f;
……
if (keys[VK_UP])
{
xpos -= (float)sin(heading*piover180) * 0.05f;
zpos -= (float)cos(heading*piover180) * 0.05f;
if (walkbiasangle >= 359.0f)
walkbiasangle = 0.0f;
walkbiasangle+= 10;
}
……
if (keys[VK_RIGHT])
{
heading -= 1.0f;
yrot = heading;
}
……
if (keys[VK_PRIOR])
lookupdown-= 1.0f;
……
上面键的处理都是对称的, 故只写出一半。
不解之处:
1)
2)
4.
按’->’键,后(左前右后):
按前移箭头后(左前右后)
按向上键(PgUp)后(左前右后):
好了,Lesson10就写到这里。下次准备自己做一个3D的环境,当然应该不会太顺手,具体想法:
初步版:
1)除了前进、后退,左右转、上下转外,还有左移和右移;当然,原作者的上下跳动感不应该不考虑;
2)一个回字形的走廊,带一个入口;
3)使用墙壁和地板砖纹理;
改进版:
1)最好在某个地方放一盏灯。