Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Объединение view и projection матриц - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Немного философии ООП http://www.cyberforum.ru/cpp/thread1808784.html
На днях на работе возник холивар с коллегами, к правильному решению пришли только на следующий день, почитав Мейерса и Саттера (один из участников холивара уже знал о правильном решении, но...
C++ OpenCV захват видео с веб-камеры Начал изучать OpenCV. В просторах интернета нашел данный код: #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char* argv) { // получаем... http://www.cyberforum.ru/cpp/thread1808506.html
Как компилятор обрабатывает член класса static constexpr const char* C++
Привет! Наткнулся на непонятный момент class Foo { public: static constexpr const char* PTR = "value"; }; без constexpr не компилируется. Вопрос - как компилятора без линкера...
C++ Распознование животных на изображении
Стала интересна тема распознавания образов на изображениях. Программа должна получать картинку с животным и определить какое это животное(как я понимаю, задача не простая, но все же) . Подскажите в...
C++ Как подружить компьютер c МК через USB http://www.cyberforum.ru/cpp/thread1807335.html
Здравствуйте, уважаемые форумчане! Никогда не работал с USB нужна помощь. Есть компьютер под управлением Windows 7, плата разработки DE0-Nano-SoC. Необходимо написать программу для ОС, которая...
C++ Различия между Java и Си++ Я раньше программировал на си++,сейчас начал на java,нужно понять основные различия 1. Каковы отличия в структуре программы вычисления простого арифметического выражения на языке Си и Си++ от... подробнее

Показать сообщение отдельно
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 330
23.09.2016, 17:51  [ТС]
Создам отдельный проект где только перемножать матрицы и векторы буду.

Скажите правильно ли всё делаю?
Column-Major

translation
1 0 0 Tx
0 1 0 Ty
0 0 1 Tz
0 0 0 1

rotation (y)
cos(a) 0 0 sin(a)
0 1 0 0
-sin(a) 0 0 cos(a)
0 0 0 1

scale
Sx 0 0 0
0 Sy 0 0
0 0 Sz 0
0 0 0 1

view матрица: абсолютно тоже самое, только инверсирована (инверсию проверю на wolfram alpha)
projection
s 0 0 0
0 s 0 0
0 0 a -1
0 0 b 0
где s = 1 / tan(0.5 * fov * pi / 180)
a = -f / (f - n)
b = -f * n / (f - n)

все эти матрицы перемножаю как transformation * view * projection

как я это делаю?
Код
x 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

transformationView[0][0] = 
	transformation[0][0] * view[0][0] +  
	transformation[0][1] * view[1][0] +
	transformation[0][2] * view[2][0] + 
	transformation[0][3] * view[3][0];


0 x 0 0
0 0 0 0
0 0 0 0
0 0 0 0

transformationView[0][1] = 
	transformation[0][0] * view[0][1] +  
	transformation[0][1] * view[1][1] +
	transformation[0][2] * view[2][1] + 
	transformation[0][3] * view[3][1];
	
	
0 0 x 0
0 0 0 0
0 0 0 0
0 0 0 0
	
transformationView[0][2] = 
	transformation[0][0] * view[0][2] +  
	transformation[0][1] * view[1][2] +
	transformation[0][2] * view[2][2] + 
	transformation[0][3] * view[3][2];
	
	
0 0 0 x
0 0 0 0
0 0 0 0
0 0 0 0
	
transformationView[0][3] = 
	transformation[0][0] * view[0][3] +  
	transformation[0][1] * view[1][3] +
	transformation[0][2] * view[2][3] + 
	transformation[0][3] * view[3][3];
	

	
0 0 0 0
x 0 0 0
0 0 0 0
0 0 0 0

transformationView[1][0] = 
	transformation[1][0] * view[0][0] +  
	transformation[1][1] * view[1][0] +
	transformation[1][2] * view[2][0] + 
	transformation[1][3] * view[3][0];
	
	
0 0 0 0
0 x 0 0
0 0 0 0
0 0 0 0

transformationView[1][1] = 
	transformation[1][0] * view[0][1] +  
	transformation[1][1] * view[1][1] +
	transformation[1][2] * view[2][1] + 
	transformation[1][3] * view[3][1];
и так далее...

Добавлено через 3 минуты
Как я перемножаю вертекс на матрицу:
Код
vertex.x = 
	matrix[0][0] * vertex.x +
	matrix[0][1] * vertex.y +
	matrix[0][2] * vertex.z +
	matrix[0][3] * vertex.w;
	
где [0][1] - это
0 x 0 0
0 0 0 0
0 0 0 0
0 0 0 0


vertex.y = 
	matrix[1][0] * vertex.x +
	matrix[1][1] * vertex.y +
	matrix[1][2] * vertex.z +
	matrix[1][3] * vertex.w;
	
где [1][2] - это
0 0 0 0
0 0 x 0
0 0 0 0
0 0 0 0
грубо говоря: первый индекс - вниз, второй - вправо

Добавлено через 3 минуты
Цитата Сообщение от Pro100Tom Посмотреть сообщение
где s = 1 / tan(0.5 * fov * pi / 180)
a = -f / (f - n)
b = -f * n / (f - n)
fov - у меня 10.
near = -1
far = 1

Добавлено через 2 минуты
чтобы получить transformation матрицу я перемножаю:
translation * rotation * scaling.
(сначала первые две, а потом то, что получится на scaling).
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru