注意:本文标注为2.5的原因是因为主要涉及OpenGL概念复习,并没有完全涉及到PhysX物理模拟
上回说到,用PhysX搭建了一个基本的空框架。
今天要说的主要内容是,PhysX和OpenGL中的坐标转换。声明一下有时候我会创建一些之后要用的变量,有可能一开始会看不懂,但坚持下去
最后你会明白的。
最后的结果将是屏幕中出现一个PhysX坐标系的坐标轴。在这过程中我们将会使用到Plane:
Plane将空间分为上下两部分,所有在Plane之上的物体都会和他发生碰撞。
1,创建我们的可视空间
添加一个新的类库
#include <foundation\Mat33.h>
这个类库中有一个函数,是用来将变换矩阵从PhysX中转换到OpenGl的。因为OpenGL和PhysX的世界坐标不太相同
左侧的OpenGL坐标系为笛卡尔坐标系(从左向右x正,从内向外z正,从下向上y正)
右侧PhysX中x和y的正轴方向和OpenGL相反。
关于这个函数的具体实现,我们下一篇文章中会提及。
创建可见的墙体
我们将使用Plane来创建上述物体。
我们先修改一下我们的全局变量:
#define MAX_PATH 16384
char buffer [MAX_PATH]
int start_time = 0,total_frames = 0,state = 1,oldX =0,oldY =0;
float fps =0,rX =0,rY =50,dist =0;
const int WINDOW_WIDTH = 800,WINDOW_HEIGHT =600,OBJ_NUM = 130;
const float Gravity = -9.8;
typedef GLfloat point3[3];
point3 planeVertice[4] = {
{-10,0,10},{-10,0,-10},{10,0,-10},{10,0,10}};
</pre>接下来,我们要使用这些函数来绘制一个网格(作为地面)<p></p><p></p><pre name="code" class="cpp">void drawGrid(int n)
{
glBegin(GL_LINES);
glColor3f(0.7f,0.7f,0.7f);
for(int i = -n;i<=n;i++)
{
glVertex3f((float)i,0,(float)-n);
glVertex3f((float)i,0,(float)n);
glVertex3f((float)-n,0,(float)i);
glVertex3f((float)n,0,(float)i);
}
glEnd();
}
很容易理解,画了一个20x20的网格地面
有了地面不妨再画个墙:
void drawPlane()
{
glBegin(GL_POLYGON);
glNormal3f(0,1,0);
glVertex3fv(planevertice[0]);
glVertex3fv(planevertice[1]);
glVertex3fv(planevertice[2]);
glVertex3fv(planevertice[3]);
glEnd();
}