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); }
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(); }