Пример #1
0
        private void SetViewByMouse()
        {
            var middleX = form.AnTWidth / 2;
            var middleY = form.AnTHeight / 2;

            // Если курсор остался в том же положении, мы не вращаем камеру
            if (Math.Abs(newMousePosition.X - middleX) < 2 && Math.Abs(newMousePosition.Y - middleY) < 2)
            {
                return;
            }

            form.SetCursorPosition(new Point(middleX, middleY));

            // Теперь нам нужно направление (или вектор), куда сдвинулся курсор.
            // Его рассчет - простое вычитание. Просто возьмите среднюю точку и вычтите из неё
            // новую позицию мыши: VECTOR = P1 - P2; где P1 - средняя точка (400,300 при 800х600).
            // После получения дельты X и Y (или направления), я делю значение
            // на 1000, иначе камера будет жутко быстрой.
            var angleY = (middleX - newMousePosition.X) / 1000.0f;
            var angleZ = (middleY - newMousePosition.Y) / 1000.0f;


            lastRotX = currentRotX;                 // Сохраняем последний угол вращения
            // и используем заново currentRotX

            currentRotX += angleZ;

            var vAxis = VectorHelper.Cross(camera.View - camera.Position, camera.Up);

            vAxis = VectorHelper.Normalize(vAxis);

            // Если текущее вращение больше 1 градуса, обрежем его, чтобы не вращать слишком быстро
            if (currentRotX > 1.0f)
            {
                currentRotX = 1.0f;

                // врощаем на оставшийся угол
                if (lastRotX != 1.0f)
                {
                    // Вращаем камеру вокруг нашей оси на заданный угол
                    camera.RotateView(1.0f - lastRotX, vAxis.X, vAxis.Y, vAxis.Z);
                }
            }

            // Если угол меньше -1.0f, убедимся, что вращение не продолжится
            else if (currentRotX < -1.0f)
            {
                currentRotX = -1.0f;
                if (lastRotX != -1.0f)
                {
                    // Вращаем
                    camera.RotateView(-1.0f - lastRotX, vAxis.X, vAxis.Y, vAxis.Z);
                }
            }
            // Если укладываемся в пределы 1.0f -1.0f - просто вращаем
            else
            {
                camera.RotateView(angleZ, vAxis.X, vAxis.Y, vAxis.Z);
            }

            // Всегда вращаем камеру вокруг Y-оси
            camera.RotateView(angleY, 0, 1, 0);
        }
Пример #2
0
        private void Draw()
        {
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();                                                                                // Reset The matrix

            cameraManager.Look();
            Gl.glEnable(Gl.GL_LIGHTING);
            Painter.DrawParticles(_tickCount);

            Painter.CreateSkyBox(0, 0, 0, 400, 200, 400);

            Gl.glEnable(Gl.GL_TEXTURE_2D);

            Gl.glBindTexture(Gl.GL_TEXTURE_2D, TextureManager.Instance.TextureImages[TextureName.Ground].Id);

            Gl.glBegin(Gl.GL_QUADS);                  // Начинаем рисовать квадрат
            // При наложении текстуры нужно указывать _текстурные_координаты_.
            // Для простой квадратной текстуры координаты распологаются так:

            /*
             * 0,1 -------------1,1
             |       |
             |       |
             |       |
             |       |
             | 0,0 ------------- 1,0
             |
             | Первая цифра - U (X)-координата, Вторая - V (Y). То есть чтобы растянуть
             | текстуру полностью, указываем единицы, чтобы повторить текстуру 2
             | раза - указываем двойки, и т.д.
             |
             | Одно замечание к текстурам .jpg - их Y (V)-координаты необходимо переворачивать.
             */

            var vectorList = new List <Vector3D>
            {
                new Vector3D {
                    X = -16f, Y = 0f, Z = -16f
                },
                new Vector3D {
                    X = 16f, Y = 0f, Z = 16f
                },
                new Vector3D {
                    X = 16f, Y = 0f, Z = 16f
                }
            };

            var normal = VectorHelper.Normalize(vectorList);

            Gl.glNormal3f(normal.X, normal.Y, normal.Z);
            Gl.glTexCoord2f(0, 16f); Gl.glVertex3f(-16f, 0, -16f);          // Низ лево
            Gl.glTexCoord2f(16f, 16f); Gl.glVertex3f(16f, 0, -16f);         // Низ право
            Gl.glTexCoord2f(16f, 0); Gl.glVertex3f(16f, 0, 16f);            // Верх право
            Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-16f, 0, 16f);             // Низ право


            Gl.glEnd();                // Закончили рисовать
            Gl.glDisable(Gl.GL_TEXTURE_2D);

            if (modelManager.isLoad)
            {
                modelManager.DrawModels();
            }


            // обновляем элемент AnT
            AnT.Invalidate();
        }