opengl:世界(openGL篇)来源: 发布时间:星期四, 2009年2月12日 浏览:236次 评论:0
记得在97年我用FoxPro编程完成了中国象棋这个游戏后(现在看来非常幼稚、呆板) ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() <<世界>>摘录部分(动力学篇的运动学1): 运用计算机摸拟客观世界中物体 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 设两点坐标为A(x0,y0,z0),B(x1,y1,z1)从A点到B点 ![]() PositionB=PositionA+DirectionA_B*Speed*Time;  (1) 公式中DirectionA_B为运动方向单位向量 ![]() ![]() ![]() 如果物体以 ![]() ![]() PositiomB=PositionA+DirectionA_B*Speed*Time+DirectionA_B*Acceleration*Time*Time*0.5   (2) 公式中Acceleration为物体沿A-B方向 ![]() 当然对于 ![]() ![]() ![]() ![]() ![]() PositiomB=PositionA+Direction_Speed*Speed*Time+Direction_ Acceleration*  Acceleration*Time*Time*0.5 (3) 公式中Direction_Speed为速度方向单位向量 ![]() ![]() ![]() ![]() C语言 ![]() GLUquadricObj *ball;//定义 2次几何体 float time1;//时间变量 ![]() ![]() //定义坐标结构 struct vector {   float  x;//向量方向坐标   float  y;   float  z; float  value;//向量大小值 } //定义单位向量 vector unitVector(vector vectorDirection) { float unit_length; unit_length=sqrt(vectorDirection.x*vectorDirection.x+vectorDirection.y*  vectorDirection.y+ vectorDirection.z* vectorDirection.z); vectorDirection.x/= unit_length; vectorDirection.y/= unit_length; vectorDirection.z/= unit_length; ![]() } vector  positionB;//下 ![]() void DrawBall ![]() {    vector positionA={-4,4,0}; vector Direction_Speed={1,0,0};//速度方向沿X轴正方向    vector Direction_Acceleration={0,-1,0};//加速度方向沿Y轴负方向 float  Speed=2.0f;//初速度大小 float  Acceleration=0.68f;//加速度大小    Direction_Speed= unitVector (Direction_Speed);//速度矢量单位化    Direction_Acceleration= unitVector (Direction_Acceleration);//加速度矢量单位化 positionB.x=positionA.x+Direction_Speed.x*Speed*time1+0.5* Direction_Acceleration.x*Acceleration*time1*time1; positionB.y=positionA.y+Direction_Speed.y*Speed*time1+0.5* Direction_Acceleration.y*Acceleration*time1*time1; positionB.z=positionA.z+Direction_Speed.z*Speed*time1+0.5* Direction_Acceleration.z*Acceleration*time1*time1;    glTranslatef(positionB.x,positionB.y,positionB.z);//更新到下 ![]()    ball=gluNewQuadric ![]() gluQuadricDrawStyle(ball,GLU_LINE);//采用线框方式画物体 gluSphere(ball,0.3f,20,20);//画球体    time1 ![]() } 在上面 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 假设物体受到n个恒定不变 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() vector Force_F[n];//定义n个力 vector ResultantForce;//定义合力 for( ![]() ![]() {    ResultantForce= ResultantForce+Force_F[n]; } 如果存在变力 ![]() ![]() ![]() 2、物体碰撞摸拟 客观世界中物体 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 1表示入射光线 ![]() ![]() N表示平面法线 ![]() 按照反射定律:入射光和反射光有关 平面法线对称 ![]() 现在我们判断入射光和平面是否存在交点 ![]() 假定入射光 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 入射光线方程为:P(t)=P0+N0*t  (1) 平面方程为:p*N=D (2) 光线和平面不相交无处乎存在两种情况: 是入射向量和平面相平行 ![]() 是入射向量和平面法线向量方向相反 ![]() 如果上述两种情况均不存在 ![]() ![]() 把(1)式代入(2)式可得到:(P0+N0*t)*N=D   (3) 解出时间t=(D-P0*N)/N0*N (4) 把(4)式代入(1)式可得到交点坐标: P(t)=P0+(P*N-P0*N)*N0/N0*N             (5) C语言实现算法如下: vector RayVectorN0;//入射光线方向向量 vector RayPositionP0;//入射光初位置坐标 vector PlanNormalN;//平面法线向量 vector PlanPo ![]() ![]() //计算交点坐标并反回交点坐标 vector GetIntersectionPo ![]() {    vector Pt;    float  PdotN_P0dotN;    float  N0_dot_N;    PdotN_P0dotN =(P.x*N.x+P.y*N.y+P.z*N.z)-(P0.x*N.x+P0.y*N.y+P0.z*N.z);    N0_dot_N=N0.x*N.x+N0.y*N.y+N0.z*N.z;    Pt.x=P0.x+ PdotN_P0dotN / N0_Dot_N*N0.x;    Pt.y=P0.y+ PdotN_P0dotN / N0_Dot_N*N0.y;    Pt.z=P0.z+ PdotN_P0dotN / N0_Dot_N*N0.z;     ![]() } 现在已计算出入射光线和平面 ![]() ![]() ![]() ![]() ![]() 现在反射光线向量就等于N1和N2 ![]() 量 ![]() N2= (N0*N)*N   N1=N0-N2; 所以:P2= N0-2(N0*N)*N; 根据上面 ![]() ![]() ![]() ![]() ![]() ![]() 速度方向满足光线反射定律 ![]() ![]() ![]() ![]() 减系数 ![]() 现在我们来讨论刚性球体和平面发生完全弹性碰撞 ![]() ![]() 球体沿N0方向运动 ![]() ![]() ![]() ![]() 球体从P0到P1 ![]() ![]() ![]() ![]() ![]() ![]() 沿速度方向 ![]() 平面方程:Q*N=D 由上面 ![]() (Q0+N0*t)*N=D 解得时间t=(D-Q0*N)/N0*N; ![]() ![]() t=(D-(P0-r*N)*N)/N0*N=(D-P0*N+r)/N0*N; 现在就已得到了球体和平面在Q1点发生碰撞 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 碰撞例子3: 0
相关文章读者评论发表评论 |