Интересно как это реализовать? чтоб вторая камера снимала что-то, и то что снимает отображалось на текстуре в реал тайм?
Камера.
В этом уроке мы научимся создавать класс - камера.
Для этого мы сначала попробуем разобраться с командой библиотеки Glu - GluLookAt. В нашем случаи Glu.gluLookAt.Она принимает три набора
аргументов, которые задают точку наблюдения, прицельную точку (точку, на которую
направлена камера) и направление, которое следует считать верхним.
Пример:
Вроде бы все просто. Теперь создадим отдельный класс в нашем приложении - Camera. Сразу подключим пространства и создадим Vertex3D - структуру, где будут храниться X,Y,Z векторов.
В этом уроке мы научимся создавать класс - камера.
Для этого мы сначала попробуем разобраться с командой библиотеки Glu - GluLookAt. В нашем случаи Glu.gluLookAt.Она принимает три набора
аргументов, которые задают точку наблюдения, прицельную точку (точку, на которую
направлена камера) и направление, которое следует считать верхним.
Пример:
Glu.gluLookAt(Position.x, Position.y, Position.z, //Позиция самой камеры View.x, View.y, View.z, //Куда смотрим Up.x, Up.y, Up.z); //Верх камеры |
Вроде бы все просто. Теперь создадим отдельный класс в нашем приложении - Camera. Сразу подключим пространства и создадим Vertex3D - структуру, где будут храниться X,Y,Z векторов.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Tao.FreeGlut; using Tao.OpenGl; using Tao.Platform.Windows; namespace Engine { class Camera { private struct Vector3D { public float x, y, z; }; } } |
И снова я) Создал новый класс, камера, вроде бы все окей, работаю через gluLookAt, крутит, вертит, перемещается, но не могу додумать как сделать стрэйф (движение камеры влево или вправо)
Объявляю:
В инициализации:
В таймере:
Считываю клаву:
Вот сам класс:
А как стрейф сделать не пойму( может кто знает?
Объявляю:
CCamera cam = new CCamera(); |
В инициализации:
cam.Position_Camera(0, 5, -10, 0, 0, 0, 0, 1, 0); |
В таймере:
Glu.gluLookAt(cam.mPos.x, cam.mPos.y, cam.mPos.z, cam.mView.x, cam.mView.y, cam.mView.z, cam.mUp.x, cam.mUp.y, cam.mUp.z); Gl.glPushMatrix(); //модели Gl.glPopMatrix(); |
Считываю клаву:
private void AnT_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) cam.Move_Camera(0.03f); if (e.KeyCode == Keys.S) cam.Move_Camera(-0.03f); if (e.KeyCode == Keys.A) cam.Rotate_Position(0.03f, 0, 1, 0); if (e.KeyCode == Keys.D) cam.Rotate_Position(-0.03f, 0, 1, 0); label2.Text = e.KeyCode.ToString(); } |
Вот сам класс:
public struct Vector3D { public float x, y, z; }; class CCamera { public Vector3D mPos; public Vector3D mView; public Vector3D mUp; static float currentRotX; static float lastRotX; public void Rotate_Position(float angle, float x, float y, float z) { mPos.x = mPos.x - mView.x; mPos.y = mPos.y - mView.y; mPos.z = mPos.z - mView.z; Vector3D vVector = mPos; Vector3D AVector; float SinA = (float)Math.Sin(angle); float CosA = (float)Math.Cos(angle); // Найдем новую позицию X для вращаемой точки AVector.x = (CosA + (1 - CosA) * x * x) * vVector.x; AVector.x += ((1 - CosA) * x * y - z * SinA) * vVector.y; AVector.x += ((1 - CosA) * x * z + y * SinA) * vVector.z; // Найдем позицию Y AVector.y = ((1 - CosA) * x * y + z * SinA) * vVector.x; AVector.y += (CosA + (1 - CosA) * y * y) * vVector.y; AVector.y += ((1 - CosA) * y * z - x * SinA) * vVector.z; // И позицию Z AVector.z = ((1 - CosA) * x * z - y * SinA) * vVector.x; AVector.z += ((1 - CosA) * y * z + x * SinA) * vVector.y; AVector.z += (CosA + (1 - CosA) * z * z) * vVector.z; mPos.x = mView.x + AVector.x; mPos.y = mView.y + AVector.y; mPos.z = mView.z + AVector.z; } public void Move_Camera(float speed) { Vector3D mmView; mmView.x = mView.x - mPos.x; mmView.y = mView.y - mPos.y; mmView.z = mView.z - mPos.z; Vector3D vVector = mmView; // Get the view vector // Двигаем камеру со скоростью speed mPos.x = mPos.x + vVector.x * speed; mPos.z = mPos.z + vVector.z * speed; mView.x = mView.x + vVector.x * speed; mView.z = mView.z + vVector.z * speed; } public void Move() { mPos.x = mPos.x + 1; mView.x = mView.x + 1; } public void Rotate_View(float speed) { Vector3D mmView; mmView.x = mView.x - mPos.x; mmView.y = mView.y - mPos.y; mmView.z = mView.z - mPos.z; Vector3D vVector = mmView; // Получаем вектор View mView.z = (float)(mPos.z + Math.Sin(speed) * vVector.x + Math.Cos(speed) * vVector.z); mView.x = (float)(mPos.x + Math.Cos(speed) * vVector.x - Math.Sin(speed) * vVector.z); } public void Position_Camera(float pos_x, float pos_y, float pos_z, float view_x, float view_y, float view_z, float up_x, float up_y, float up_z) { mPos.x = pos_x; mPos.y = pos_y; mPos.z = pos_z; mView.x = view_x; mView.y = view_y; mView.z = view_z; mUp.x = up_x; mUp.y = up_y; mUp.z = up_z; } }; |
А как стрейф сделать не пойму( может кто знает?
Что-то я запутался, есть у меня класс Objects, определяю его как массив
объявляю переменную,
чтоб узнать сколько объектов создал и по этой переменной создавать цикл, потом прицепляю к кнопке создания нового объекта
Objects[] mObject = new Objects[999]; |
объявляю переменную,
intcreatedObjects; |
чтоб узнать сколько объектов создал и по этой переменной создавать цикл, потом прицепляю к кнопке создания нового объекта
И снова добрый вечер) в этот раз проблема является производительности, неизвестно по каким причинам, при более 1 объекта (простейшего, к прим. куб) в сцене, увеличивается нагрузка на цп. Вот рисую 10 текстурированных кубиков и тормозит очень сильно =(
Добрый день, хочу реализовать с помощью OpenGL (Tao Framework) программу которая б создавала атомы в пространстве по указанным координатам (как бы кристаллическую решетку) и можно было манипулировать этими объектами (вращать, передвигать), также надо это сделать компонентом, чтоб можно было просто в другие проекты вставлять, и все это нужно для моего универа. Суть проблемы в том, что вроде все правильно, а работает с глюками. Создает атомы, по координатам, вращает, но через несколько поворотов/созданий, исчезают все атомы кроме первого созданного атома, я пока не понимаю почему так происходит. Работаю без таймера, графика рисуется и обновляется по событию (к примеру кнопки вращения или добавления нового атома).