Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Настройка матрицы проекции

09.01.2024, 11:49. Показов 1988. Ответов 10

Студворк — интернет-сервис помощи студентам
Какие бы примеры из интернета не пробовал, так и не получилось подобрать формулу, по которой игра (не моя) вычисляет матрицу проекции.

Игровые данные:
GL_VIEWPORT 0 0 854 480
GL_DEPTH_RANGE 0 1
GL_PROJECTION_MATRIX 0.317999 0 0 0 0 0.565773 0 0 0 0 -1.00074 -1 0 0 -0.100037 0
fov (в настройках игры) 110

Каким образом я могу составить формулу чтобы используя данные перечисленные выше для того чтобы получить такую же матрицу проекции?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2024, 11:49
Ответы с готовыми решениями:

Матрицы трансформаций и проекции
Здравствуйте. В ходе реализации библиотеки векторной математики для OpenGL возникли некоторые трудности. Функция, возвращающая матрицу...

по фронтальной проекции тора с вырезом построить его горизонтальную и профильную проекции
по фронтальной проекции тора с вырезом построить его горизонтальную и профильную проекции

Выполнить три вида проекции по заданной аксонометрической проекции
Головушка совсем не варит((((

10
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,297
Записей в блоге: 2
09.01.2024, 12:52
У меня получилось получить немного похожее, с точностью до 0.2
Code
1
[0.39355934, 0.0, 0.0, 0.0, 0.0, 0.70020765, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -0.0, 0.0]
правда исходники под метал на свифте, другого под рукой нету. На сколько помню переписывал из исходников glm
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import Foundation
 
calc()
 
func calc() {
    let fovDegrees: Float = 110.0
    let width: Float = 854.0
    let height: Float = 480.0
    let near: Float = 0.0
    let far: Float = 1.0
    let fov: Float = fovDegrees * Float.pi / 180.0
    let aspect: Float = width / height
    let matrix = proj(fovRadians: fov, aspectRatio: aspect, nearZ: near, farZ: far)
    print(matrix)
}
 
func proj(fovRadians: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> [Float] {
    let yScale = 1.0 / tan(fovRadians * 0.5)
    let xScale = yScale / aspectRatio
    let zRange = farZ - nearZ
    let zScale = -(farZ + nearZ) / zRange
    let wzScale = -2.0 * farZ * nearZ / zRange
 
    let xx = xScale
    let yy = yScale
    let zz = zScale
    let zw:Float = -1.0
    let wz = wzScale
 
    return [xx,  0,  0,  0,
            0, yy,  0,  0,
            0,  0, zz, zw,
            0,  0, wz,  0]
}
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
10.01.2024, 05:24  [ТС]
Привет, alecss131!

Спасибо за ответ, но, к сожалению, при идентичных вводных данных (полученных из игры), при применении матрицы проекции, отрисовка игровых чанков сужается до одного, на котором я стою.

Возможно станет лучше, если я более подробно объясню свою цель. Мне нужно настроить матрицу проекции таким образом, чтобы игра думала, что она видит на 360 градусов и отрисовывала даже те объекты, которые находятся позади меня. Я знаю что это возможно, но как бы я не пытался реализовать, выходит только расширить поле зрения на совсем немного, либо же его сузить.

Небольшой пример #1
Кликните здесь для просмотра всего текста
Размер окна 1278 на 673
Поле зрения 30

Матрица проекции
(1.965313, 0.000000, 0.000000, 0.000000)
(0.000000, 3.732051, 0.000000, 0.000000)
(0.000000, 0.000000, -1.001106, -1.000000)
(0.000000, 0.000000, -0.100055, 0.000000)


Небольшой пример #2
Кликните здесь для просмотра всего текста
Размер окна 1278 на 673
Поле зрения 50

Матрица проекции
(1.129306, 0.000000, 0.000000, 0.000000)
(0.000000, 2.144507, 0.000000, 0.000000)
(0.000000, 0.000000, -1.001106, -1.000000)
(0.000000, 0.000000, -0.100055, 0.000000)


Небольшой пример #3
Кликните здесь для просмотра всего текста
Размер окна 1278 на 673
Поле зрения 110

Матрица проекции
(0.368732, 0.000000, 0.000000, 0.000000)
(0.000000, 0.700208, 0.000000, 0.000000)
(0.000000, 0.000000, -1.001106, -1.000000)
(0.000000, 0.000000, -0.100055, 0.000000)


Как я понял, игра достает данные из матрицы проекции и использует их для обрезки того что находится за полем зрения.
Может быть вам удастся понять, какие из элементов массива нужно поменять, чтобы получить желаемый эффект.
0
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,297
Записей в блоге: 2
10.01.2024, 12:26
На сколько понимаю игра про кубики, а значит написана на джаве и для матриц используется библиотека joml
Написал на джаве код для вычисления проекции с это либой
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.joml.Matrix4f;
import java.util.Arrays;
 
public class Main{
    public static void main(String[] args) {
        int fov = 110;
        int w = 854;
        int h = 480;
        float near = 0.0f;
        float far = 1.0f;
        Matrix4f persp = new Matrix4f();
        persp.setPerspective((float) Math.toRadians(fov), (float) w / (float) h, near, far);
        float[] matrix = persp.get(new float[16]);
        System.out.println(Arrays.toString(matrix));
    }
}
На выходе та же матрица, что и на свифте была
Code
1
[0.3935593, 0.0, 0.0, 0.0, 0.0, 0.7002076, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, -0.0, 0.0]
Значит это либо не матрица перспективы, либо она домножена на другие матрицы
0
1958 / 814 / 114
Регистрация: 01.10.2012
Сообщений: 4,745
Записей в блоге: 2
10.01.2024, 17:24
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Мне нужно настроить матрицу проекции таким образом, чтобы игра думала, что она видит на 360 градусов и отрисовывала даже те объекты, которые находятся позади меня. Я знаю что это возможно,
Кто Вам такое сказал ? (укажите источик).

Возможно-то оно возможно, но Вы представляете что получится? Есть сфера (что камера видит вокруг) и есть плоский прямоугольник - окно в котором все рисуется. Как бы лист бумаги натянуть на шарик. Ясно что без искажений не получится - где-то лист сомнется, а где и порвется. Самый простой способ "spherical mapping" - считаем что лист сжимается до нуля на полюсах а на экваторе искажения невелики. Посмотрите пару таких сферических текстур - Вас это устроит?

Добавлено через 4 часа 15 минут
---
Подумал, а почему обязательно "spherical"? Можно ведь цилиндром, без искажений. Хотя тогда не будет видно "то что вверху" - ну может товарищу это и не нужно. Все равно бред, но интересно
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
11.01.2024, 09:12  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Кто Вам такое сказал ?
Я лично проверял. Как я уже писал, у меня получилось немного расширить (с 110 градусов до 170) но дальше почему-то поле зрения не увеличивалось.

Цитата Сообщение от Igor3D Посмотреть сообщение
Возможно-то оно возможно, но Вы представляете что получится?
Я делаю это в определенном месте, которое влияет не на игровую картину в целом, а лишь на её отрисовку. Чего я и добиваюсь, ведь мне нужно чтобы игра отрисовывала все, включая и то что за спиной.
0
1958 / 814 / 114
Регистрация: 01.10.2012
Сообщений: 4,745
Записей в блоге: 2
11.01.2024, 20:09
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я лично проверял. Как я уже писал, у меня получилось немного расширить (с 110 градусов до 170) но дальше почему-то поле зрения не увеличивалось.
Ну 170 (и даже 179) - это законный/легальный угол зрения, хотя и таких стараются избегать, перспективные искажения становятся слишком заметны. Экран (окно отображения) - плоскость, максимум что может охватить глаз/камера - угол 180 (вернее близкий к нему), ну или по-научному 2 * PI стерадиан.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я делаю это в определенном месте, которое влияет не на игровую картину в целом, а лишь на её отрисовку. Чего я и добиваюсь, ведь мне нужно чтобы игра отрисовывала все, включая и то что за спиной.
"За спиной" не так уж ясно как кажется. А "над головой"? А "под ногами"? Если хотите втиснуть в экран все-все - придется пойти на искажения как писалось выше. Больше смысла не трогать "вертикаль" т.е. сверху/снизу камера не видит, как обычно. Все равно результат странный. Напр если объект строго "за спиной", то часть его будет нарисована на левом краю окна, а другая - на правом

Да, и матрицей такое не сделать, нужен вертексный шейдер. Если у Вас нет к нему доступа - говорить не о чем. Плюс придется добавить геометрический шейдер чтобы обеспечить wrap (части полигона на разных краях). В общем, интересного, легкого баловства здесь не получится, придется приложить руки
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.01.2024, 05:38  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Если хотите втиснуть в экран все-все
Да.

Цитата Сообщение от Igor3D Посмотреть сообщение
придется пойти на искажения как писалось выше
А я ещё раз говорю, искажений не будет. Место, в которое я вмешиваюсь, отвечает как раз за проверку "будет ли виден объект" или нет. Игра достаёт матрицу проекции и на её основе производит вычисления. Мне лишь нужно понять, по какой формуле её изменить и подменить, чтобы игра считала что я вижу на 360. Ещё раз, если я в игре выставлю 70 градусов, а матрицу проекции в "том самом месте" подменю так, что я вижу будто бы на 170, в игре визуально НИЧЕГО не поменяется, кроме того, что объекты, которые находятся вне поле зрения 70 но в пределах поля зрения 170, начнут отрисовываться.
0
1958 / 814 / 114
Регистрация: 01.10.2012
Сообщений: 4,745
Записей в блоге: 2
13.01.2024, 12:29
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Мне лишь нужно понять, по какой формуле её изменить и подменить, чтобы игра считала что я вижу на 360.
Да ни по какой, матрицей это недостижимо. Ладно, попробуем так: вот объект "за спиной". Где/как он должен рисоваться (в окне) ? (как Вы это себе представляете)

Не по теме:

Да, и во что

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
А я ещё раз говорю,
...
Ещё раз..
Как-то пропадает желание Вам отвечать :)

0
1958 / 814 / 114
Регистрация: 01.10.2012
Сообщений: 4,745
Записей в блоге: 2
13.01.2024, 17:29
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
в игре визуально НИЧЕГО не поменяется, кроме того, что объекты, которые находятся вне поле зрения 70 но в пределах поля зрения 170, начнут отрисовываться.
Вот одна и та же сфера (и с той же камерой) при различных углах зрения (аттач)
Миниатюры
Настройка матрицы проекции  
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.01.2024, 22:19  [ТС]
Igor3D, [вложение]

Тему можно закрывать.
Вложения
Тип файла: 7z 2024-01-13 22-17-20.7z (24.41 Мб, 11 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2024, 22:19
Помогаю со студенческими работами здесь

Вычислить проекции главного вектора на оси координат и проекции главного момента системы сил
Вычислить проекции главного вектора на оси координат и проекции главного момента системы сил отн т О Есть свое решение может оно...

Определить сумму проекции на x=0; сумму проекции на ось y=0; уравнение моментов
Необходимо определить: 1) сумму проекции на x=0 2)сумму проекции на ось y=0 3)уравнение моментов Помогите, пожалуйста, я ничего в...

Настройка графического профиля для матрицы HP ProBook 430 G1
Подскажите можно ли где-то раздобыть настроенный профиль или как текущий настроить? Сейчас отображение цветов просто ужасное и бледное.

Проекции
Кто может объяснить про проекции более подробно, как это реализовать в шарпе. Чем отличаются виды проекции? Допустим, если реализовать...

Проекции!!
Здравствуйте,уважаемые программисты!Есть задачка : Дано координаты двух отрезков (начало и конец) .Определить общую проекцию этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru