Russian Qt Forum
Апрель 18, 2024, 08:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 18 19 [20] 21 22 ... 24   Вниз
  Печать  
Автор Тема: Геометрия (задачки)  (Прочитано 207114 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #285 : Июнь 10, 2017, 12:05 »

Ладно, делаем обратное преобразование, получаем
Код
C++ (Qt)
inline QVector3D Screen2CameraPoint( const QVector2D & screen, float scale, bool perspectiveFlag )
{
 if (perspectiveFlag)
  return QVector3D(screen.x(), screen.y(), -scale);
 else  
  return screen / scale;
}
 
Оказывается для перспективной проекции ничего и считать не пришлось, точка-то была готовая. Оказывается существует такое magic расстояние на котором x и у в 3D равны пикселям. Именно это число и задает 3D камеру, единственный ее принципиальный параметр которого не может не быть, остальные используются довольно редко. Так откуда же оно берется ?

Намекну: ну это я назвал его "scale" (что тоже верно), в действительности это широко известный/популярный термин, причем не только в 3D.

« Последнее редактирование: Июнь 10, 2017, 12:07 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #286 : Август 15, 2017, 12:28 »

25) Нужно нарисовать случайные пятна на модели, напр на чайнике (аттач). Требования "лояльные", никто не будет придираться типа "ото пятно должно быть именно здесь!", на то они и случайные - но должна чувствоваться/соблюдаться "фактура". При всей простоте задачки отделаться плоской картинкой и стандартным наложением текстуры не удается - форма чайника не такая уж простая.

A для любознательных доп вопрос: а как этот чайник освещен? (хотя любознательных здесь пока не видкл - ну может появятся  Улыбающийся)
« Последнее редактирование: Август 15, 2017, 12:30 от Igors » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #287 : Август 16, 2017, 11:44 »

A для любознательных доп вопрос: а как этот чайник освещен? (хотя любознательных здесь пока не видкл - ну может появятся  Улыбающийся)
да фигово освещен - пока ручку взглядом поставишь на место, напрягаешься Подмигивающий
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #288 : Сентябрь 19, 2017, 12:00 »

26) Нарисовать треугольник как в учебном примере Qt (аттач), но не прибегая к OpenGL и др "современным технологиям". То есть просто закрашивая пыксели
Код
C++ (Qt)
void DrawTriangleRGB( QPainter & painter, const QPointF pt[3] )
{
???
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #289 : Февраль 08, 2018, 10:01 »

Давненько мы не брали в руки шашек Улыбающийся С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #290 : Февраль 08, 2018, 11:55 »

Давненько мы не брали в руки шашек Улыбающийся С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Без кода). Три точки (A,B,C), не лежащие на одной прямой, образуют плоскость. Векторное произведение AB x AC даст перпендикулярный вектор n к плоскости.
Матрицу поворота можно найти путем решения системы уравнений

M*n = v,
|n| = |v|.

где v - любой вектор, в данном случае с нулевой компонентой z.
для удобства можно добавить условие, что компоненты v пропорциональны n.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #291 : Февраль 08, 2018, 12:00 »

Тут можно прикрутить и кватернионы, но сразу не вспомню, как ими манипулировать)).
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #292 : Февраль 08, 2018, 12:36 »

Давненько мы не брали в руки шашек Улыбающийся С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Здесь бесконечное множество вариантов. Смотри аттач.

ЗЫ там опечатка: вначале нужно сделать буст вдоль оси z, а потом, получившийся вектор подвергать повороту..
« Последнее редактирование: Февраль 08, 2018, 14:21 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #293 : Февраль 08, 2018, 14:31 »

Три точки (A,B,C), не лежащие на одной прямой, образуют плоскость. Векторное произведение AB x AC даст перпендикулярный вектор n к плоскости.
Все так, но те же 3 точки образуют еще и СК
Матрицу поворота можно найти
Просили найти матрицу что сделает тр-к плоским сохраняя размеры, это необязательно матрица поворота
Смотри аттач.
С понтом посмотрел аттач - и все ясно! Так запутать простейшие вещи умеют только научные работники. Кстати что у Вас с предыдущей задачкой (закраска тр-ка). Неужели и это студентам не дается Непонимающий Безобразие!

Кстати, "метод троглодита" здесь проходит. Ну вот не знаю ни хрена, понятия не имею. НО! у меня есть букварь! И вот смотрю методы - какой из них подходит? В конце-концов ведь нужен рез-т и.т.п.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #294 : Февраль 08, 2018, 16:48 »

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Код:
   0.970676  -0.240318 -0.00594735  0.258948         
   0.240287   0.969228   0.0534803  -2.32853         
-0.00708795 -0.0533411    0.998551  -43.4769         
          0          0           0         1
Записан

Пока сам не сделаешь...
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #295 : Февраль 09, 2018, 09:35 »

Цитировать
(закраска тр-ка). Неужели и это студентам не дается  Непонимающий Безобразие!
Нет, раскрашивание треугольников и пр. обычно на уроках ИЗО даётся, в начальных классах  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #296 : Февраль 09, 2018, 12:50 »

Код:
   0.970676  -0.240318 -0.00594735  0.258948         
   0.240287   0.969228   0.0534803  -2.32853         
-0.00708795 -0.0533411    0.998551  -43.4769         
          0          0           0         1
Нет, раскрашивание треугольников и пр. обычно на уроках ИЗО даётся, в начальных классах  Улыбающийся
Значица так и запишем: оба научных работника от ответов уклонились, намекая, дескать, для них это очевидно и неинтересно. Не могу с ними согласиться - задачки хоть и простые, но интересные и полезные. И вообще - зачем человека пичкать "тензорным анализом" если не умеет тр-к закрасить?

Здесь по меньшей мере 3 решения

1) Можно домучить матрицу поворота, пусть это безумно нерационально
2) Можно чисто на уровне "учи матчасть", есть в QMatrix4x4 метод для построения такой матрицы.
3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #297 : Февраль 09, 2018, 14:10 »

1) Можно домучить матрицу поворота, пусть это безумно нерационально
Т.е. без QMatrix4x4 задача рационально не решается? Улыбающийся

2) Можно чисто на уровне "учи матчасть", есть в QMatrix4x4 метод для построения такой матрицы.
Проучите научных сотрудников конкретным кодом.

3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко
Это уже классика: 1. Рисуем кружочки. 2. Рисуем остаток совы.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #298 : Февраль 10, 2018, 16:29 »

3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко
Это уже классика: 1. Рисуем кружочки. 2. Рисуем остаток совы.
Как ни странно, это часто правда. Если идея/смысл понятны, то реализация (аттач) не очень интересна. Однако объяснить идею (т.е. почему так происходит) не так уж просто. Ладно, попробую, см картинку

Жила-была точка "a" на плоскости, как полагается, имела координаты a.x и a.y. Теперь кто-то взял и повернул оси координат, вместо обычных X и Y они вот стали axisX и axisY, причем их напр-я известны в начальных. При этом точка  "a" осталась на месте - какими будут ее координаты для новых осей?  Очевидно это скалярные произведения исходных a.x и a.y на напр-я новых осей, т.е.

a.x_new = a.x * axisX.x + a.y * axisX.y;   // проекция "a" на axisX   
a.y_new = a.x * axisY.x + a.y * axisY.y;   // проекция "a" на axisY

Записав это в матричном виде мы обнаруживаем что матрица... это просто-напросто новые оси записанные по строкам! Рассуждения для 3 осей (x, y, z) совершенно аналогичны

Вернемся к задачке 27. Имея планарный тр-к мы легко можем построить тройку единичных взаимо-перпендикулярных осей и вписать их в матрицу - готово! Эту тройку можно выбирать всяко-разно, нужно лишь чтобы ось Z была нормалью к тр-ку, т.к требуется Z= 0 для точек в плоскости тр-ка. А оси X и Y могут боптаться как угодно, лишь бы были перпендикулярны.

Ну вот и все? Нет - есть еще мелкая пакость смещение, ведь центр новой СК необязательно в (0, 0, 0). Конечно можно назначить его напр в точке A отняв ее от всех точек ABC, но хотелось бы чисто, одной матрицей. Но чего это я тут "разумничался"?  Есть люди с академическим образованием (куда там моему политеху), вот им и карты в руки..
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #299 : Февраль 12, 2018, 08:00 »

Затихли товарищи.. Ну наверное думают, анализируют. Хорошее дело, а пока разберем вариант с матрицей вращения

Есть тр-к, повернем его с помощью QMatrix4x4::rotate так чтобы он "лег" в плоскость XOY. Дело сводится к довороту одного вектора (нормали к тр-ку) до второго (0, 0, 1).
Код
C++ (Qt)
QMatrix4x4 GetTransform2D( const QVector3D & a, const QVector3D & b, const QVector3D & c )
{
// находим ось поворота
QVector3D normal = QVector3D::normal(a, b, c);
QVector3D axis = QVector3D::crossProduct(normal, QVector3D(0, 0, 1));
 
// находим угол поворота
// cos(angle) = dot(normal, QVector3D(0, 0, 1)) = normal.z
float angle = acos(normal.z) * 180 / M_PI;
 
// получаем матрицу поворота
QMatrix4x4 M;
M.rotate(angle, axis);
 
// учтем смещение
M.translate(-a);
 
return M;
}
Это решение проигрывает предыдущему по всем статьям, но тем не менее оно тоже корректно
« Последнее редактирование: Февраль 12, 2018, 08:01 от Igors » Записан
Страниц: 1 ... 18 19 [20] 21 22 ... 24   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 23.