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

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

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

Сообщений: 9585


Просмотр профиля
« Ответ #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

Сообщений: 1823



Просмотр профиля
« Ответ #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

Сообщений: 9585


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

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

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

Сообщений: 9585


Просмотр профиля
« Ответ #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 так не делают  Непонимающий
Записан
Страниц: 1 ... 16 17 [18]   Вверх
  Печать  
 
Перейти в:  

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