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

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

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

Сообщений: 9730


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

Я так не думаю. Видимость точек определяется матрицей проекции, а условия перекрытия точек определяется матрицей представления. см. аттач. Точка {10;10;10} вне области видимости, и вектор {1;1;1} не параллелен Zc (направление взгляда)
Точка (0, 0, 0) вовсе не находится на передней стенке - это вершина пирамиды. Поэтому если выходящий из нее луч пересек переднюю стенку - он обязательно пересечет и заднюю, относительные координаты точек пересечения будут одинаковы.

Что имеется в виду под "вписанием"?
То что изначально спрашивалось -
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Ладно, проверяем. Вот слегка измененный Qt пример (аттач). Все вертексы видны на экране. Печатает
Цитировать
0 QVector4D(-1.81066, -2.41421, -0.5, 4)
1 QVector4D(1.81066, -2.41421, -0.5, 4)
2 QVector4D(-1.81066, 2.41421, -0.5, 4)
3 QVector4D(1.81066, 2.41421, -0.5, 4)
4 QVector4D(1.81066, -2.41421, -0.5, 4)
5 QVector4D(1.81066, -2.41421, 4.5, 6)
6 QVector4D(1.81066, 2.41421, -0.5, 4)
7 QVector4D(1.81066, 2.41421, 4.5, 6)
8 QVector4D(1.81066, -2.41421, 4.5, 6)
9 QVector4D(-1.81066, -2.41421, 4.5, 6)
10 QVector4D(1.81066, 2.41421, 4.5, 6)
11 QVector4D(-1.81066, 2.41421, 4.5, 6)
12 QVector4D(-1.81066, -2.41421, 4.5, 6)
13 QVector4D(-1.81066, -2.41421, -0.5, 4)
14 QVector4D(-1.81066, 2.41421, 4.5, 6)
15 QVector4D(-1.81066, 2.41421, -0.5, 4)
16 QVector4D(-1.81066, -2.41421, 4.5, 6)
17 QVector4D(1.81066, -2.41421, 4.5, 6)
18 QVector4D(-1.81066, -2.41421, -0.5, 4)
19 QVector4D(1.81066, -2.41421, -0.5, 4)
20 QVector4D(-1.81066, 2.41421, -0.5, 4)
21 QVector4D(1.81066, 2.41421, -0.5, 4)
22 QVector4D(-1.81066, 2.41421, 4.5, 6)
23 QVector4D(1.81066, 2.41421, 4.5, 6)
Где же [-1..1]? Или хотя бы [-2..2]?  Улыбающийся

По сути, матрица проекции описывает объём, который будет выведен на экран.
Это "логично предположить", ну действительно, дали такую матрицу - получили так, другую - эдак.
Но в действительности ничем таким она не занимается  Улыбающийся Вообще она "дитя OpenGL", без него проще обойтись без этой матрицы.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1909



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

Надо немножко подумать. Пока нет времени. С перспективой плотно не работал. Обратил внимание, что отсутствует viewport матрица в явном виде, каким образом учитывается размер экрана тоже пока не разобрался. А матрица проекции выглядит
Цитировать
QMatrix4x4(type:General
   1.81066         0         0         0         
         0   2.41421         0         0         
         0         0      -2.5     -10.5         
         0         0        -1         0         
)
Первые 3 столбца не описывают единичный вектор.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9730


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

Надо немножко подумать.
Полезная процедура. Чуть намекну

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

Сообщений: 9730


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

23) Предлагается такая ф-ция для перевода 3D точки (в координатах камеры) в пыксели экрана
Код
C++ (Qt)
inline QVector2D CameraPoint2Screen( const QVector3D & src, float scale, bool perspectiveFlag )
{
 return src * (scale / (perspectiveFlag ? -src.z() : 1.0f));
}
a) Верно/корректно ли это?

b) Если да, то откуда взять (как вычислить) scale? Считаем что параметры камеры задаются стандартно: QMatrix4x4::ortho или QMatrix4x4::perspective 

с) Как всегда, познания в OpenGL не требуются, но для тех кто увлекается этой мерзостью доп вопрос: если все так просто, то почему же в OpenGL так не делают  Непонимающий
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1909



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

Хорошая статья:
http://www.songho.ca/opengl/gl_transform.html

Совсем забыл про операцию деления на w
Доработал код вашей процедуры. Надеюсь, не наврал.
Код
C++ (Qt)
void GeometryEngine::PrintVertices(const QMatrix4x4 & mvp , const QMatrix4x4 &viewport)
{
int count = sizeof(vertices) / sizeof(vertices[0]);
for (int i = 0; i < count; ++i) {
QVector4D ver(vertices[i].position, 1.0f);
ver = mvp * ver;
       ver /= ver.w();
//        ver = viewport * ver; // screen coordinates
qDebug() << i << ver;
}
qDebug() << "end";
}
 

viewport в QOpenGLWidget задаётся равным размеру окна при каждом вызове paintGL (из описания класса)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9730


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

Совсем забыл про операцию деления на w
Да, "оно". Заметим что это преобразование невозможно выразить матрицей, поэтому на вопрос
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Можно ответить сразу - нет, это утверждение неверно, т.к. перспективное преобразование не матричное

А откуда же берется это хитрое "w"?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1909



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

По ссылке выше объясняется откуда w. Более конкретно про неё здесь
http://www.songho.ca/math/homogeneous/homogeneous.html

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

Сообщений: 9730


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

Перспектива же описывается с помощью 4х4 матрицы. Начните использовать 3х3 матрицу проектирования и получите те самые [-1; 1].
Уверяю Вас, перспектива НЕ описывается матрицей Улыбающийся, а задается одним числом (можно всяко-разно).

Цитировать
Ну как же так, открываем спецификацию, официальный документ (attach). Вот тут черным по белому написано "the perspective matrix" и какие-то формулы (не вникал). А этот чувак говорит... Он че - такой умный?
Я ничего не напутал?  Улыбающийся

В действительности никакого противоречия здесь нет, просто OpenGL делает простую операцию (см вопрос 23) очень хитрым, извилистым путем. Есть желание разобраться в этой мифической матрице?   
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1909



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

Матрица не мифическая.
http://www.songho.ca/opengl/gl_projectionmatrix.html
Тут описание того, как она формируется и почему
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9730


Просмотр профиля
« Ответ #264 : Июнь 01, 2017, 15:16 »

Матрица не мифическая.
http://www.songho.ca/opengl/gl_projectionmatrix.html
Тут описание того, как она формируется и почему
В очередной раз напомню что задачки не требуют каких-то познаний в OpenGL, вполне достаточно школьных знаний, ну может (иногда) первый семестр ВУЗа (насколько я помню скалярное и векторное произведения изучаются там) - И ВСЕ

Беда "гуглящих" - найдя что-то решают что это "оно", и что делать нужно непременно так. Хотя никто не обещал что найденное - лучшее, да и вообще верно и/или уместно (о чем сам инет честно предупреждает). Порой абсурдность такого изучения довольно очевидна. Ну в самом деле, неужели для перевода 3D точки в экран необходимо:

- иметь однородные координаты
- создать по меньшей мере 2 матрицы
- выполнить каноническую последовательность действий

Не слабо. А нельзя ли то же самое сделать на базе знаний 7-го класса (где изучалось подобие тр-ков)? Не, никак?  Улыбающийся А если уж такая любовь к OpenGL то почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев" - нее, нужна очередная "обильная" ссылка  Улыбающийся

Впрочем книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Ладно, вернемся к задачкам, на всякий случай напомню текущую

23) Предлагается такая ф-ция для перевода 3D точки (в координатах камеры) в пыксели экрана
Код
C++ (Qt)
inline QVector2D CameraPoint2Screen( const QVector3D & src, float scale, bool perspectiveFlag )
{
 return src * (scale / (perspectiveFlag ? -src.z() : 1.0f));
}
a) Верно/корректно ли это?

b) Если да, то откуда взять (как вычислить) scale? Считаем что параметры камеры задаются стандартно: QMatrix4x4::ortho или QMatrix4x4::perspective 

с) Как всегда, познания в OpenGL не требуются, но для тех кто увлекается этой мерзостью доп вопрос: если все так просто, то почему же в OpenGL так не делают  Непонимающий
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 1909



Просмотр профиля
« Ответ #265 : Июнь 01, 2017, 15:44 »

Пфффф
На мой взгляд, подход, используемый в gl мало чем отличается от других библиотек 3D графики. Особой беды не вижу в использовании матриц вместо систем уравнений, которые так привычны школьникам.

Цитировать
Беда "гуглящих" - найдя что-то решают что это "оно"
Лучше такая беда, чем беда "негуглящих"

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

Цитировать
почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев"
Потому что это утверждение ложно.

Цитировать
книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Возможно потому что их не для школьников пишут?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2392

чтоб работа волком не казалась :)


Просмотр профиля WWW
« Ответ #266 : Июнь 01, 2017, 21:05 »

Цитировать
книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Возможно потому что их не для школьников пишут?

Их обычно пишут "окодемеки" с большим доктортитулом. Основная их беда в том, что они обычно не занимаются практической стороной реализации Улыбающийся
Записан

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

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9730


Просмотр профиля
« Ответ #267 : Июнь 02, 2017, 11:56 »

Особой беды не вижу в использовании матриц вместо систем уравнений, которые так привычны школьникам.
Да помилуйте, какие еще "системы уравнений"? Я предложил (задачка 23) сделать то же самое с помощью умножения на константу и деления на -z. Ответа "верно ли это" я так и не услышал  Улыбающийся

Цитировать
почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев"
Потому что это утверждение ложно.
Но ведь так записано в матрице (см картинку выше) из спецификации. Как же оно может быть ложно?  Улыбающийся

Их обычно пишут "окодемеки" с большим доктортитулом. Основная их беда в том, что они обычно не занимаются практической стороной реализации Улыбающийся
Не всегда, напр ту же спецификацию в этом не упрекнуть.
Цитировать
если все так просто, то почему же в OpenGL так не делают  Непонимающий
Потому что там нужно чтобы возвращаемая координата была "самодостаточна". Формально OpenGL рендер не знает никаких матриц, ни флажка perspectiveFlag, ничего этого ему не передается. Пришлось городить мудаковатые "однородные" координаты чтобы для каждой точки фактически хранить параметр камеры. Да еще по ходу дела надо z нормировать - тоже слили в матрицу. Вот так из 2 арифметических действий и получился монстряка  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 9730


Просмотр профиля
« Ответ #268 : Июнь 06, 2017, 11:15 »

24) Задачка обратная предыдущей: теперь есть точка (x, y) в экране (окне вывода). Считаем что точка (x = 0, y = 0) в центре экрана, x идет вправо, y вверх. Нужно найти 3D точку в пр-ве камеры.

Если такая постановка кажется Вам неполной и/или некорректной - дополните/откорректируйте ее
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2392

чтоб работа волком не казалась :)


Просмотр профиля WWW
« Ответ #269 : Июнь 06, 2017, 14:24 »

24) Задачка обратная предыдущей: теперь есть точка (x, y) в экране (окне вывода). Считаем что точка (x = 0, y = 0) в центре экрана, x идет вправо, y вверх. Нужно найти 3D точку в пр-ве камеры.

Если такая постановка кажется Вам неполной и/или некорректной - дополните/откорректируйте ее

Хех... тут, батенька, одной камерой не обойтись) Как минимум 2 надо, чтоб из 2д-картинки 3д-точки воссоздать)
Записан

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

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Страниц: 1 ... 16 17 [18] 19 20   Вверх
  Печать  
 
Перейти в:  

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