Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение проекционной плоскости 
:(
    Опции темы
Elfet
  Дата 31.5.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



У меня есть такой вот класс камеры:
Код

class Camera
    {
        public Camera()
        {
            point = new Vector(0, 0, 0);
            loakAt = new Vector(0, 1, 0);
            viewAngle = 30f;
            rotationAngle = 0f;
            aspect = 4f / 3f;
            projectionDistance = 4;
        }

        public Camera(Vector point, Vector loakAt, float viewAngle, float rotationAngle, float aspect, float projectionDistance)
        {
            this.point = point;
            this.loakAt = loakAt;
            this.viewAngle = viewAngle;
            this.rotationAngle = rotationAngle;
            this.aspect = aspect;
            this.projectionDistance = projectionDistance;
        }

        private Vector point;

        private Vector loakAt;

        private float viewAngle;

        private float rotationAngle;

        private float aspect;

        private float projectionDistance;

        public Vector[] GetProjectionPlane()
        {
            Vector[] plane = new Vector[4];

            return plane;
        }

    }

где
        private Vector point; - точка расположения камеры

        private Vector loakAt; - вектор куда направлена камера

        private float viewAngle; - угол раствора (или как это называется?)

        private float rotationAngle; - угол поворота вокруг вектора направления

        private float aspect; - соотношение сторон

        private float projectionDistance; - растояние до проецируемой плоскости.

Мне нужно получить четыре вершины проекционной плоскости (функция GetProjectionPlane()) для того что бы в дальнейшем проецировать на неё smile
Помогите пожалуйста с этой функцией!

Это сообщение отредактировал(а) Elfet - 31.5.2007, 21:41


--------------------
PM MAIL WWW Skype   Вверх
Bitter
Дата 1.6.2007, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



А зачем функция? Сам сделай.
У тебя есть угол обзора по горизонтали и расстояние от камеры до плоскости (расстояние это ты задаешь в проекционной матрице). Тригонометрия. Из этих данных находишь гипотенузу прямоугольного треугольника A и гепотенузу В (см рисунок). Эти гипотенузы представляют из себя вектора, по которым можешь построить начальные точки плоскости (они обозначены кружочками).
Ну а дальше по этим точкам строишь конечные точки (обозначены крестиками). Вот код на Делфи, думаю разберешься. 

Код

procedure TGameCamera.CalcNormals;
var aa,B:single;
    NewPoint1,NewPoint2:TD3DVector;
    NewPoint3,NewPoint4:TD3DVector;
    NewAt:TD3DVector;
    NewFow:single;
begin
 NewAt:=D3DVector(From.x+s.x*400, // тут 400 - расстояние до расчитываемой плоскости
                                From.y+s.y*400,  // s - вектор At - From
                                From.z+s.z*400);
 // Находим длинну нового вектора At -From
 Length:=VectorMagnitude(D3DVector(NewAt.x-From.x, NewAt.y-From.y, NewAt.z-From.z)); 
 NewFow:=Fow; // Угол обзора

 aa:=Length*tan(NewFow); // длинну гипотенузы

 // Находим боковые точки дальней плоскости
 NewPoint1:=D3DVector(NewAt.x+aa*u.x, NewAt.y+aa*u.y, NewAt.z+aa*u.z);
 NewPoint2:=D3DVector(NewAt.x-aa*u.x, NewAt.y-aa*u.y, NewAt.z-aa*u.z);
 // Находим нижнюю и верхнюю точки
 aa:=Length*tan(NewFow/1.333); // тут 1.3333 - aspect
 NewPoint3:=D3DVector(NewAt.x+aa*vv.x, NewAt.y+aa*vv.y, NewAt.z+aa*vv.z);
 NewPoint4:=D3DVector(NewAt.x-aa*vv.x, NewAt.y-aa*vv.y, NewAt.z-aa*vv.z);

 // Находим дальнюю плоскость
 Normals[1]:=D3DVector(NewPoint1.x-NewAt.x,NewPoint1.y-NewAt.y,NewPoint1.z-NewAt.z);
 Normals[2]:=D3DVector(NewPoint2.x-NewAt.x,NewPoint2.y-NewAt.y,NewPoint2.z-NewAt.z);
 Normals[3]:=D3DVector(NewPoint3.x-NewAt.x,NewPoint3.y-NewAt.y,NewPoint3.z-NewAt.z);
 Normals[4]:=D3DVector(NewPoint4.x-NewAt.x,NewPoint4.y-NewAt.y,NewPoint4.z-NewAt.z);

 // эти 5 точек и есть искомая видовая пирамида
 Point1:=D3DVector(NewAt.x+Normals[1].x+Normals[3].x, NewAt.y+Normals[1].y+Normals[3].y, NewAt.z+Normals[1].z+Normals[3].z);
 Point2:=D3DVector(NewAt.x+Normals[2].x+Normals[3].x, NewAt.y+Normals[2].y+Normals[3].y, NewAt.z+Normals[2].z+Normals[3].z);
 Point3:=D3DVector(NewAt.x+Normals[1].x+Normals[4].x, NewAt.y+Normals[1].y+Normals[4].y, NewAt.z+Normals[1].z+Normals[4].z);
 Point4:=D3DVector(NewAt.x+Normals[2].x+Normals[4].x, NewAt.y+Normals[2].y+Normals[4].y, NewAt.z+Normals[2].z+Normals[4].z);
 Point5:=Scene.Cameras[ID].From;
end;


Пардон за корявый рисунок.

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  111.JPG 9,65 Kb
PM MAIL ICQ Skype   Вверх
Elfet
Дата 1.6.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(Bitter @  1.6.2007,  02:18 Найти цитируемый пост)
А зачем функция? Сам сделай.

Всмысле зачем? Вот я её и пытаюсь сделать. smile 
Цитата(Bitter @  1.6.2007,  02:18 Найти цитируемый пост)
задаешь в проекционной матрице

у меня в книжке тоже что-то написано про эту матрицу, но я там не понял зачем мне она и где её использовать?



--------------------
PM MAIL WWW Skype   Вверх
arilou
Дата 1.6.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: нет
Всего: 61



Elfet, и аксиом тебе с огром не помогли?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Elfet
  Дата 1.6.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Не-а, что-то я не могу найти нужный мне код в них


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.