«Как это делается» - использовать однородные преобразования и координаты. Вы берете точку в пространстве и:
- Расположите его относительно камеры, используя матрицу модели.
- Проецируйте его либо ортогонально, либо в перспективе, используя проекционную матрицу.
- Примените trnasformation области просмотра, чтобы разместить его на экране.
Это становится довольно расплывчатым, но я постараюсь охватить важные моменты и оставлю некоторые из них вам. Я полагаю, вы понимаете основы математики математике:).
Гомогенные векторы, точки, преобразования
В 3D однородной точкой будет матрица столбцов вида [x, y, z, 1]. Последний компонент - это w, коэффициент масштабирования, который для векторов равен 0: это приводит к тому, что вы не можете переводить векторы, что математически правильно. Мы не пойдем туда, мы говорим по пунктам.
Гомогенные преобразования - это матрицы 4х4, используемые потому, что они позволяют представлять перевод как матричное умножение, а не как сложение, что приятно и быстро для вашей видеокарты. Также удобно, потому что мы можем представлять последовательные преобразования, умножая их вместе. Мы применяем преобразования к точкам, выполняя преобразование * point.
Существует 3 основных однородных преобразования:
Существуют и другие, особенно трансформация «взгляда», которые стоит изучить. Однако я просто хотел дать краткий список и несколько ссылок. Последовательное применение перемещения, масштабирования и поворота, примененное к точкам, в совокупности является матрицей преобразования модели и размещает их в сцене относительно камеры. Важно понимать, что то, что мы делаем, сродни движению объектов вокруг камеры, а не наоборот.
Орфография и перспектива
Чтобы преобразовать мировые координаты в экранные координаты, вы сначала должны использовать проекционную матрицу, которая обычно бывает двух видов:
- Орфографический, обычно используемый для 2D и CAD.
- Перспектива, подходит для игр и трехмерных сред.
Матрица ортографической проекции строится следующим образом:
Где параметры включают в себя:
- Top : координата Y верхнего края видимого пространства.
- Bottom : Координата Y нижнего края видимого пространства.
- Слева : координата X левого края видимого пространства.
- Справа : Координата X правого края видимого пространства.
Я думаю, это довольно просто. То, что вы устанавливаете, - это область пространства, которая будет появляться на экране, которую вы можете обрезать. Здесь все просто, потому что видимая область пространства представляет собой прямоугольник. Обрезка в перспективе более сложна, потому что область, которая появляется на экране или громкости просмотра, представляет собой frustrum .
Если вам трудно с википедией по перспективной проекции, вот код для построения подходящей матрицы, любезно предоставлен geeks3D
void BuildPerspProjMat(float *m, float fov, float aspect,
float znear, float zfar)
{
float xymax = znear * tan(fov * PI_OVER_360);
float ymin = -xymax;
float xmin = -xymax;
float width = xymax - xmin;
float height = xymax - ymin;
float depth = zfar - znear;
float q = -(zfar + znear) / depth;
float qn = -2 * (zfar * znear) / depth;
float w = 2 * znear / width;
w = w / aspect;
float h = 2 * znear / height;
m[0] = w;
m[1] = 0;
m[2] = 0;
m[3] = 0;
m[4] = 0;
m[5] = h;
m[6] = 0;
m[7] = 0;
m[8] = 0;
m[9] = 0;
m[10] = q;
m[11] = -1;
m[12] = 0;
m[13] = 0;
m[14] = qn;
m[15] = 0;
}
Переменные:
- fov : Поле зрения, пи / 4 радиана - это хорошее значение.
- аспект : отношение высоты к ширине.
- znear, zfar : используется для отсечения, я буду игнорировать их.
и сгенерированная матрица является главной колонкой, проиндексированной в приведенном выше коде следующим образом:
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
Преобразование области просмотра, координаты экрана
Для обоих этих преобразований требуется другая матричная матрица, чтобы поместить объекты в экранные координаты, называемая преобразованием области просмотра. Это здесь описано, я не буду его освещать (это очень просто) .
Таким образом, для точки p мы бы:
- Выполнить матрицу преобразования модели * p, в результате чего pm.
- Выполнить матрицу проекции * pm, в результате чего получится стр.
- Обрезка pp по отношению к объему просмотра.
- Выполнить матрицу преобразования области просмотра * pp, в результате ps: точка на экране.
Основная информация
Я надеюсь, что это охватывает большую часть этого. В вышеперечисленном есть дыры и местами расплывчато, задавайте любые вопросы ниже. Этот предмет, как правило, достоин целой главы в учебнике, я приложил все усилия, чтобы ускорить процесс, надеюсь, в ваших интересах!
Я связался с этим выше, но я настоятельно рекомендую вам прочитать это и загрузить двоичный файл. Это отличный инструмент, который поможет вам лучше понять эти преобразования и узнать, как они получают очки на экране:
http://www.songho.ca/opengl/gl_transform.html
Что касается фактической работы, вам нужно реализовать класс матрицы 4x4 для однородных преобразований, а также класс однородных точек, который вы можете умножить на него, чтобы применить преобразования (помните, [x, y, z, 1]) , Вам нужно будет сгенерировать преобразования, как описано выше и в ссылках. Это не так сложно, когда вы понимаете процедуру. Желаем удачи:).