Beispiel #1
0
        protected Matrix4 straightMissileSpawnTxfm(ISSpaceMissileTarget target,
                                                   Vector3 launcherPos, Vector3 launcherVel,
                                                   int id, int clusterSize)
        {
            const float sideDispersal = 2f;
            float       angle         = (float)Math.PI * 2f / (float)clusterSize * id;
            Vector3     toTarget      = (target.position - launcherPos);
            float       length        = toTarget.Length;

            if (length < 0.0001f)
            {
                toTarget = -Vector3.UnitZ;
            }
            else
            {
                // normalize
                toTarget /= length;
            }
            Quaternion orientQuat  = OpenTKHelper.neededRotationQuat(Vector3.UnitZ, toTarget);
            Matrix4    orientMat   = Matrix4.CreateFromQuaternion(orientQuat);
            Matrix4    disperalMat = Matrix4.CreateTranslation(sideDispersal * (float)Math.Cos(angle),
                                                               sideDispersal * (float)Math.Sin(angle), 0f);

            return(disperalMat * orientMat * Matrix4.CreateTranslation(launcherPos) * Matrix4.CreateTranslation(toTarget * 7f));
        }
Beispiel #2
0
        protected void moveShips(float timeElapsed)
        {
            if (timeElapsed <= 0f)
            {
                return;
            }

            // make the target drone move from side to side
            localTime += timeElapsed;
            //localTime += timeElapsed * 0.3f;
            Vector3 pos = targetDrone.Pos;

            pos.Z           = 30f * (float)Math.Sin(localTime);
            targetDrone.Pos = pos;

            // make the vandal ship orbit missile target
            Vector3 desiredPos;
            Vector3 desiredDir;
            float   angle = localTime * 0.5f;

            //float angle = localTime * 0.01f;
            #if true
            float desiredXOffset = 100f * (float)Math.Cos(angle);
            float desiredYOffset = 20f * (float)Math.Sin(angle * 0.77f);
            float desiredZOffset = 80f * (float)Math.Sin(angle * 0.88f);
            #else
            float desiredXOffset = 100f * (float)Math.Cos(angle);
            float desiredYOffset = 100f * (float)Math.Sin(angle);
            float desiredZOffset = 0f;
            #endif

            Vector3 desiredOffset = new Vector3(desiredXOffset, desiredYOffset, desiredZOffset);

            var target = getTargetObject();
            if (missileLauncher != MissileLaunchers.VandalShip || target == null || target == vandalShip)
            {
                desiredPos = new Vector3(100f, 0f, 0f);
                desiredDir = -Vector3.UnitX;
            }
            else if (target == main3dScene.ActiveCamera)
            {
                desiredPos = main3dScene.ActiveCamera.Pos + -main3dScene.ActiveCamera.Dir * 300f;
                Quaternion cameraOrient = OpenTKHelper.neededRotationQuat(Vector3.UnitZ, -main3dScene.ActiveCamera.Up);
                desiredPos += Vector3.Transform(desiredOffset * 0.1f, cameraOrient);
                desiredDir  = (target.Pos - vandalShip.Pos).Normalized();
            }
            else
            {
                //float desiredZOffset = 5f * (float)Math.Sin(angle + 0.2f);
                desiredPos = target.Pos + desiredOffset;
                desiredDir = (target.Pos - vandalShip.Pos).Normalized();
            }

            Vector3     desiredMotion = desiredPos - vandalShip.Pos;
            const float vel           = 100f;
            float       displacement  = vel * timeElapsed;
            Vector3     vandalNewPos;
            if (displacement > desiredMotion.LengthFast)
            {
                vandalNewPos = desiredPos;
            }
            else
            {
                vandalNewPos = vandalShip.Pos + desiredMotion.Normalized() * displacement;
            }

            vandalVelocity = (vandalNewPos - vandalShip.Pos) / timeElapsed;
            vandalShip.Pos = vandalNewPos;

            Quaternion vandalOrient = OpenTKHelper.neededRotationQuat(Vector3.UnitZ, desiredDir);
            vandalShip.Orient(desiredDir, Vector3.Transform(Vector3.UnitY, vandalOrient));
        }