/* GOST unit * response function * base unit response arguments */ static VOID GOSTUnitResponse( in1UNIT_GOST *Unit, in1ANIM *Ani ) { MATRIXd R; VEC M; if((Ani->KeysClick[VK_NUMPAD9] || Ani->JsButClick[4]) && !Ani->IsPause) { Unit->Head.Dir = VecNormalize( VecNeg( Unit->Head.Loc ) ); Unit->Head.Right = VecNormalize( VecCrossVec( Unit->Head.Dir, VecSet( 0, 1, 0 ) ) ); Unit->Head.Up = VecCrossVec( Unit->Head.Right, Unit->Head.Dir ); } R = MatrMulMatr( MatrMulMatr( MatrRotateVec( Ani->DeltaTime * Ani->JsR * 30, Unit->Head.Dir.X, Unit->Head.Dir.Y, Unit->Head.Dir.Z ), MatrRotateVec( Ani->DeltaTime * Ani->JsY * 30, Unit->Head.Right.X, Unit->Head.Right.Y, Unit->Head.Right.Z ) ), MatrRotateVec( Ani->DeltaTime * Ani->JsX * 30, Unit->Head.Up.X, Unit->Head.Up.Y, Unit->Head.Up.Z ) ); M = VecSet( Unit->Head.Dir.X * Ani->JsZ * 3 * Ani->DeltaTime, Unit->Head.Dir.Y * Ani->JsZ * 3 * Ani->DeltaTime, Unit->Head.Dir.Z * Ani->JsZ * 3 * Ani->DeltaTime ); if (Ani->JsPOV == 1 || Ani->JsPOV == 2 || Ani->JsPOV == 8) M = VecAddVec( M, VecMulNum( Unit->Head.Dir, Ani->DeltaTime * 3 ) ); if (Ani->JsPOV == 4 || Ani->JsPOV == 5 || Ani->JsPOV == 6) M = VecAddVec( M, VecMulNum( Unit->Head.Dir, -Ani->DeltaTime * 3 ) ); if (Ani->JsPOV == 2 || Ani->JsPOV == 3 || Ani->JsPOV == 4) M = VecAddVec( M, VecMulNum( Unit->Head.Right, Ani->DeltaTime * 3 ) ); if (Ani->JsPOV == 6 || Ani->JsPOV == 7 || Ani->JsPOV == 8) M = VecAddVec( M, VecMulNum( Unit->Head.Right, -Ani->DeltaTime * 3 ) ); Unit->Head.Dir = VectorTransformer( Unit->Head.Dir, R ); Unit->Head.Right = VectorTransformer( Unit->Head.Right, R ); Unit->Head.Up = VectorTransformer( Unit->Head.Up, R ); Unit->Head.Loc = VecAddVec( Unit->Head.Loc, M ); }
/* Camera move by Right-Axes function. * ARGUMENTS: * - Distance to move: * DBL Coef; * RETURNS: None. */ VOID II2_RndCameraMoveRight( ii2CAMERA *Cam, DBL Coef ) { Cam->Dir = VecSubVec(Cam->At, Cam->Loc); Cam->Right = VecCrossVec(Cam->Dir, Cam->Up); Cam->Loc = VecAddVec(Cam->Loc, VecMulNum(VecNormalize(Cam->Right), Coef)); Cam->At = VecAddVec(Cam->At, VecMulNum(VecNormalize(Cam->Right), Coef)); } /* End of 'II2_RndCameraMoveByDir' funciton */
MATR MatrViewLookAt( VEC Loc, VEC At, VEC UpApprox ) { VEC Right, Up, Dir; MATR r; Dir = VecNormalize(VecSubVec(At, Loc)); Right = VecNormalize(VecCrossVec(Dir, UpApprox)); Up = VecCrossVec(Right, Dir); r.A[0][0] = Right.x; r.A[0][1] = Up.x; r.A[0][2] = -Dir.x; r.A[0][3] = 0; r.A[1][0] = Right.y; r.A[1][1] = Up.y; r.A[1][2] = -Dir.y; r.A[1][3] = 0; r.A[2][0] = Right.z; r.A[2][1] = Up.z; r.A[2][2] = -Dir.z; r.A[2][3] = 0; r.A[3][0] = -VecDotVec(Loc, Right); r.A[3][1] = -VecDotVec(Loc, Up); r.A[3][2] = VecDotVec(Loc, Dir); r.A[3][3] = 1; return r; }
/* ‘ункци¤ преобразовани¤ из мировой системы коорлинат в кадр. * ј–√”ћ≈Ќ“џ: * - исходна¤ точка: * VEC Loc, VEC At, VEC Upaprox; * ¬ќ«¬–јўј≈ћќ≈ «Ќј„≈Ќ»≈: * (MATR) ћатрица преоброзаваний камеры. */ MATR II2_VieverCamera( VEC Loc, VEC At, VEC Upaprox ) { VEC Right, Up, Dir; MATR r; Dir = VecNormalize(VecSubVec(At, Loc)); Right = VecNormalize(VecCrossVec(Dir, Upaprox)); Up = VecCrossVec(Right, Dir); r.A[0][0] = Right.X; r.A[0][1] = Up.X; r.A[0][2] = -Dir.X; r.A[0][3] = 0; r.A[1][0] = Right.Y; r.A[1][1] = Up.Y; r.A[1][2] = -Dir.Y; r.A[1][3] = 0; r.A[2][0] = Right.Z; r.A[2][1] = Up.Z; r.A[2][2] = -Dir.Z; r.A[2][3] = 0; r.A[3][0] = -VecDotVec(Loc, Right); r.A[3][1] = -VecDotVec(Loc, Up); r.A[3][2] = VecDotVec(Loc, Dir); r.A[3][3] = 1; /*r.A[0][0] = Right.X; r.A[1][0] = Up.X; r.A[2][0] = -Dir.X; r.A[3][0] = 0; r.A[0][1] = Right.Y; r.A[1][1] = Up.Y; r.A[2][1] = -Dir.Y; r.A[3][1] = 0; r.A[0][2] = Right.Z; r.A[1][2] = Up.Z; r.A[2][2] = -Dir.Z; r.A[3][2] = 0; r.A[0][3] = -VecDotVec(Loc, Right); r.A[1][3] = -VecDotVec(Loc, Up); r.A[2][3] = -VecDotVec(Loc, Dir); r.A[3][3] = 1;*/ return r; } /* End of 'Ani->WorldToScreen' function */
/* Camera rotation by camera-axes-dir function. * ARGUMENTS: * - Angle: * DBL Angle; * RETURNS: None. */ VOID II2_RndCameraRotateDir( ii2CAMERA *Cam, DBL Angle ) { MATR RotMat; Cam->Dir = VecSubVec(Cam->At, Cam->Loc); Cam->Right = VecCrossVec(VecNormalize(Cam->Dir), Cam->Up); II2_RndCameraNormalize(Cam); RotMat = II2_RndCameraGetMatrix(Cam); RotMat = MatrMulMatr(MatrRotateX(Angle), RotMat); Cam->At = VecAddVec(Cam->Loc, VecSet(RotMat.A[0][0], RotMat.A[0][1], RotMat.A[0][2])); } /* End of 'II2_RndCameraRotateDir' funciton */
/* Camera rotation by camera-axes-dir function. * ARGUMENTS: * - Angle: * DBL Angle; * RETURNS: None. */ VOID RK2_RndCameraRotateDir( rk2CAMERA *Cam, DBL Angle ) { rk2MATR4x4 RotMat; Cam->Dir = VecSubVec(Cam->At, Cam->Loc); Cam->Right = VecCrossVec(VecNormalize(Cam->Dir), Cam->Up); RK2_RndCameraNormalize(Cam); RotMat = RK2_RndCameraGetMatrix(Cam); RotMat = MatrMultMatr(MatrRotateX(MatrDefault(), Angle), RotMat); RK2_RndCameraSet(Cam, Cam->Loc, /* Location */ VecSumVec(Cam->Loc, VecSet(RotMat.A[0][0], RotMat.A[0][1], RotMat.A[0][2])), /* At */ Cam->Up); /* Up */ } /* End of 'RK2_RndCameraRotateDir' funciton */
static VOID MP2_UnitResponse( mp2CONTROL *Uni, mp2ANIM *Ani ) { DBL r; VEC Dir = VecNormalize(VecSubVec(View, Uni->Pos)), Right = VecNormalize(VecCrossVec(Dir, VecSet(0, 1, 0))); if (Ani->Keys['T']) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (Ani->Keys['Y']) glPolygonMode(GL_FRONT, GL_LINE); if (Ani->Keys['U']) glPolygonMode(GL_BACK, GL_LINE); /*if (Ani->Keys[VK_SPACE]) MP2_AnimAddUnit(MP2_UnitCreateBall()); */ if (Ani->KeysClick['C']) MP2_AnimAddUnit(MP2_UnitCreateCube(/*Rnd1() * 4, Rnd1() * 4, Rnd1() * 4*/0, 0, 0)); if (Ani->KeysClick['V']) MP2_AnimAddUnit(MP2_UnitCreateSTATICMODEL(/*Rnd1() * 4, Rnd1() * 4, Rnd1() * 4*/0, 0, 0)); if (Ani->KeysClick[VK_RETURN] && Ani->Keys[VK_MENU]) MP2_FlipFullScreen(MP2_Anim.hWnd); /*if (Ani->KeysClick[VK_ESCAPE]) MP2_AnimDoExit();*/ if (Ani->KeysClick['P']) Ani->IsPause = !Ani->IsPause; /* Uni->Pos.Y += Ani->JY * Ani->GlobalDeltaTime; */ Uni->Pos = PointTransform(Uni->Pos, MatrRotate((50 * Ani->JY * Ani->GlobalDeltaTime), Right)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->JX * Ani->GlobalDeltaTime)); if (Ani->Keys[VK_LBUTTON]) { Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->Mdx * Ani->GlobalDeltaTime)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateX(10 * Ani->Mdy * Ani->GlobalDeltaTime)); } View.X += Ani->JZ / 10; View.Z += Ani->JR / 10; Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->Keys[VK_RIGHT] * Ani->GlobalDeltaTime)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(-10 * Ani->Keys[VK_LEFT] * Ani->GlobalDeltaTime)); r = VecLen(Uni->Pos); Uni->Pos = VecMulNum(Uni->Pos, (r + (-Ani->Mdz) * Ani->DeltaTime * 1.0) / r); MP2_RndMatrView = MatrView(VecAddVec(Uni->Pos, View), View, VecSet(0, 1, 0)); }
/* Helpful triangle normal evaluation function. * ARGUMENTS: * - triangle points: * VEC P0, P1, P2; * RETURNS: * (VEC) normal vector value. */ static VEC AK2_TriangleNormal( VEC P0, VEC P1, VEC P2 ) { return VecNormalize(VecCrossVec(VecSubVec(P1, P0), VecSubVec(P2, P0))); } /* End of 'AK2_TriangleNormal' function */