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

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

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #240 : Апрель 13, 2017, 12:08 »

3d Studio max? Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #241 : Апрель 13, 2017, 12:15 »

Этож вроде зовется gods rays? Алгоритм наличествует
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #242 : Апрель 17, 2017, 13:19 »

3d Studio max? Улыбающийся
Ну вот почему всегда такой чисто шкурный подход? Улыбающийся

Этож вроде зовется gods rays? Алгоритм наличествует
Всяко зовут. Статья - сразу получаем HDRI (значения цвета > 1), OpenCL (тоже слон), да и вообще трудновато понять о чем речь. Ну и к чему такие страсти? Нельзя ли как-то нарисовать по-простому/народному?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #243 : Май 09, 2017, 08:18 »

22) Довольно популярное утверждение, звучит примерно так
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Верно ли это? Существует ли такая (волшебная) матрица? Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #244 : Май 09, 2017, 18:56 »

http://doc.qt.io/qt-5/qmatrix4x4.html#viewport
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #245 : Май 10, 2017, 08:08 »

Давно заметил что отвечающие ссылкой сами ее даже не читают. Ну вьюпорт-то здесь причем? Наверное логика типа
Цитировать
Ага, вот тут тоже есть [-1, 1] - ну значит "оно"
Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #246 : Май 10, 2017, 09:29 »

Не обязательно [-1, 1] диапазон применяется для отображения. Вьюпорт матрица заданная с помощью геометрии окна преобразует координаты вершин в координаты окна. можно отображать и [-2, 2]...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #247 : Май 10, 2017, 13:23 »

Не обязательно [-1, 1] диапазон применяется для отображения. Вьюпорт матрица заданная с помощью геометрии окна преобразует координаты вершин в координаты окна. можно отображать и [-2, 2]...
Читаем букварь вместе  Улыбающийся
Цитировать
void QMatrix4x4::viewport(float left, float bottom, float width, float height, float nearPlane = 0.0f, float farPlane = 1.0f)
Multiplies this matrix by another that performs the scale and bias transformation used by OpenGL to transform from normalized device coordinates (NDC) to viewport (window) coordinates. That is it maps points from the cube ranging over [-1, 1] in each dimension to the viewport with it's near-lower-left corner at (left, bottom, nearPlane) and with size (width, height, farPlane - nearPlane).
Тут речь идет уже о следующей операции, которая применяется вовсе не к "координатам вершин", а к тем которые уже каким-то чудесным образом удовлетворяют условию видимости [-1, 1]. Вот я и спрашиваю каким?

Да, и вопрос не требует знания OpenGL специфики, просто "там тоже" - но не более того
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #248 : Май 10, 2017, 14:05 »

Тут речь идет уже о следующей операции, которая применяется вовсе не к "координатам вершин", а к тем которые уже каким-то чудесным образом удовлетворяют условию видимости [-1, 1]. Вот я и спрашиваю каким?
Перемножение этой матрицы с вектором, который описывает преобразованную вершину, даёт вектор, описывающий положение пикселя в окне.

Если я всё правильно помню, то вся цепочка преобразований выглядит следующим образом:
PixelPos= viewportMatrix * projectionMatrix * modelviewMatrix * vertexVector
Средняя часть и загоняет вершину в "отображаемый" диапазон.
Можно её выделить как отдельную матрицу
modelViewProjectionMatrix = projectionMatrix * modelviewMatrix
тогда
PixelPos= viewportMatrix * modelViewProjectionMatrix  * vertexVector


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #249 : Май 10, 2017, 17:03 »

Если я всё правильно помню, то вся цепочка преобразований выглядит следующим образом:
PixelPos= viewportMatrix * projectionMatrix * modelviewMatrix * vertexVector
Для широкого круга: последовательность операций в OpenGL записывается наоборот, читать надо справа налево (начиная с vertexVector). Хреново и неудобно.

Средняя часть и загоняет вершину в "отображаемый" диапазон.
Можно её выделить как отдельную матрицу
modelViewProjectionMatrix = projectionMatrix * modelviewMatrix
Именно это часто повторяется теми или иными словами, но верно ли это? Я думаю что нет, во всяком случае - не всегда. Ладно, подождем, может еще кто захочет высказаться.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #250 : Май 10, 2017, 17:14 »

Именно это часто повторяется теми или иными словами, но верно ли это?

Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.

ModelView:
http://doc.qt.io/qt-5/qmatrix4x4.html#rotate-1
http://doc.qt.io/qt-5/qmatrix4x4.html#translate-2

Projection:
http://doc.qt.io/qt-5/qmatrix4x4.html#frustum
http://doc.qt.io/qt-5/qmatrix4x4.html#perspective
http://doc.qt.io/qt-5/qmatrix4x4.html#ortho
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #251 : Май 11, 2017, 12:53 »

Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.
Не вижу как, тем более "с легкостью" Улыбающийся Ладно, почему я думаю что это неверно. Умножение на матрицу происходит так
Цитировать
x' = x * m00 + y * m10 + z * m20 + m30;
Где
x, y, z - координаты исходного вертекса (точки)
mXX - числа сидящие в матрице
x' - новая координата x (y' и z' получаются аналогично)
Неважно какие конкретно значения mXX и откуда они взялись. Важно что они одни и те же (остаются неизменными) для всех исходных точек

Теперь допустим что точка с исходными координатами (1, 1, 1) видима на экране. Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана, напр
(10, 10, 10) - видима
(100, 100, 100) - видима
и.т.д

Поэтому какими бы ни были mXX - всегда можно найти такую исходную точку для которой x' > 1. А значит матрицы которая чего-то там "вписывает" в природе не существует. Вот в изометрии (glOrtho) - там пожалуйста

Заметьте что ответ не требовал никаких знаний классов и.т.п.  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #252 : Май 11, 2017, 15:53 »

Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана
На каком луче?

Цитировать
А значит матрицы которая чего-то там "вписывает" в природе не существует.
Так вопрос в существовании матрицы fitToScreen? В #243 как-то иначе постановка звучала. ModelViewProjection, что была упомянута мною выше преобразует точки к необходимым представлению и проекции, а далее Viewport, которая описывает отображение "обработанных" вершин переводит те в координаты экрана. Для OpenGL принято, что Viewport не показывает вершины вне диапазона [-1; 1]. Вроде так.

Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.
Не вижу как, тем более "с легкостью" Улыбающийся

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Код
C++ (Qt)
#include <QCoreApplication>
#include <QMatrix4x4>
#include <QDebug>
 
 
int main()
{
   QMatrix4x4 viewportMatrix;
   viewportMatrix.viewport(0, 0, 100, 100);  // {0, 0} is bottomLeft
 
   QMatrix4x4 projectionMatrix; // identity
 
   QMatrix4x4 modelViewMatrix;
   modelViewMatrix.rotate(45, 0, 0, 1);
 
 
   const QVector4D vec (1, 0, 0, 1);
 
   const QMatrix4x4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix;
 
   const QVector4D modelViewProjectedVec = modelViewProjectionMatrix * vec;
   qDebug() << modelViewProjectedVec;
   qDebug() << viewportMatrix * modelViewProjectedVec;
 
   return 0;
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #253 : Май 12, 2017, 07:27 »

На каком луче?
Который выходит из точки (0, 0, 0) и проходит через заданную, в данном случае (1, 1, 1). Все точки с координатами (t, t, t) попадут в одну и ту же точку экрана. Так (в принципе) работает кинопроектор, фильмоскоп, человеческий глаз - любая перспективная камера. Наблюдать изометрию в природе мы не можем.

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Как говорилось выше, с ортогональной проблем нет. Но вот для перспективной проекции никакого "вписания" не произойдет.

Так вопрос в существовании матрицы fitToScreen?
Не совсем, хотя и близко. Если знать наперед позиции всех вертексов, матрицу можно подобрать/пристроить так чтобы "все было в экране", но аналитически ее задать нельзя. Поэтому кнопки "fit" обычно и нет для перспективы, вместо нее предлагается что-то типа "zoom", т.е. юзверь сам таскает камеру ближе/дальше
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #254 : Май 12, 2017, 09:48 »

Поэтому кнопки "fit" обычно и нет для перспективы, вместо нее предлагается что-то типа "zoom", т.е. юзверь сам таскает камеру ближе/дальше
Такая кнопка есть по крайней мере в 2х CAE системах, что я использую (ESI VisualViewer, ПолигонСофт).
Если знать наперед позиции всех вертексов, матрицу можно подобрать/пристроить так чтобы "все было в экране", но аналитически ее задать нельзя.
По сути, матрица проекции описывает объём, который будет выведен на экран. Для перспективы форма этого объёма усечённая пирамида. Вот и считайте её. Для упрощения можно считать параллелепипед, вписанный в эту пирамиду.

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Как говорилось выше, с ортогональной проблем нет. Но вот для перспективной проекции никакого "вписания" не произойдет.
Что имеется в виду под "вписанием"?
Теперь допустим что точка с исходными координатами (1, 1, 1) видима на экране. Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана, напр
Я так не думаю. Видимость точек определяется матрицей проекции, а условия перекрытия точек определяется матрицей представления. см. аттач. Точка {10;10;10} вне области видимости, и вектор {1;1;1} не параллелен Zc (направление взгляда)
Записан
Страниц: 1 ... 15 16 [17] 18 19 ... 24   Вверх
  Печать  
 
Перейти в:  


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