Войти
ФлеймФорумПрограммирование

Общие вопросы по программированию (359 стр)

Страницы: 1358 359 360 361408 Следующая »
#5370
16:05, 22 янв 2022

[Имбирная Ведьмочка]
В авиа-космо-симе, 3D-редакторе итд - матрицы, это самый общий случай
В FPS вращение YX (Y-вверх) - это частный случай
Углы Эйлера тут как козе пятая нога
> Или, может, если целое общество употребляет
Знаешь, целые общества верят, к примеру, в плоскую землю, что теперь их принимать во внимание?

#5371
16:41, 22 янв 2022

Окей, мне надоело повторять одно и то же по нескольку раз.

С этого момента всё, что не описывает методику так же подробно, как #5343, считается пуками в лужу и игнорируется.

#5372
18:30, 22 янв 2022

А еще бывают комбинированные случаи, когда надо и матрицу и углы Эйлера.

Например, космонавт летает в невесомости. Положение его тела в пространстве однозначно надо хранить либо матрицей, либо кватернионом, углы не годятся. А вот положение его головы относительно тела выгоднее как раз хранить углами Эйлера.

В общем можно подвести так: если в ситуации есть некоторое выделенное направление, от которого все пляшет (например, гравитация/вертикаль в играх, где игрок бегает по поверхности) - тогда состояние лучше хранить углами. А вот если выделенного направления нет - тогда матрицей или кватернионом.

#5373
(Правка: 20:05) 20:02, 22 янв 2022

Имбирная Ведьмочка
> Что означает "вращение вокруг таргет"?
точка вокруг которой вращается камера.
> Как оно реализовано?
зависит от конкретных требований к ней, так как это чуть более сложная вещь чем просто поворот. Нужно учитывать и ускорение движения и плавность зума, вешать ограничения и коллизию с уровнем.
> Как именно выглядит связь между положением мыши и матрицей камеры?
в моем случае считается позиция камеры и матрица формируется потом через lookAt. В камере от третьего лица если это не космосим какой-нибудь, довольно жесткие ограничения на тангаж.
> но вы же говорите, что это фуфло и надо "матрицы".
углы используются для задания поворота в любом случае. И также в любом случае тебе на выходе нужна будет матрица которую ты потом отправишь в шейдер. Поэтому это глупый спор, и упирается лишь в количество преобразований что для камеры не является критичным.
> Что это за векторы, откуда они берутся
часть матрицы view это тройка векторов uvn (тот самый вверх, бок и ось взгляда). Нет никакой проблемы "вытаскивать" их из нее. Это будут либо ее столбцы, либо ряды, в зависимости от системы координат которую решишь использовать.
> Я уверен на 99%, что он есть, просто ты его захардкодил.
он высчитывается каждый раз, так как тройка uvn это ортонормированный базис. И разумеется ты никогда не угадаешь какой у тебя будет вектор up если ты не смотришь строго вдоль горизонта, любое отклонение тангажа меняет вектор up.
Единственное что задает lookAt это направление взгляда(dir), и если мы убираем крен то мы знаем что вектор strafe (поперечная ось) всегда будет лежать параллельно плоскости горизонта, нам лишь нужно выбрать такой чтобы он образовывал угол в 90градусов с вектором dir. А вектор up будет спокойно высчитываться через их векторное произведение. Для случая когда взгляд направлен строго вверх, то lookAt имеет смысл расширить и передавать отдельно предыдущее значение одного из векторов(кроме dir) что позволит сохранить плавность. Но это проблема конкретно lookAt, а не матриц как таковых.
samrrr
> Плохой у тебя lookAt.
для моих задач хватает, изменятся задачи, будет добавлена реализация с другим интерфейсом, не проблема.

#5374
23:06, 22 янв 2022

Aroch
> он высчитывается каждый раз, так как тройка uvn это ортонормированный базис. И
> разумеется ты никогда не угадаешь какой у тебя будет вектор up если ты не
> смотришь строго вдоль горизонта, любое отклонение тангажа меняет вектор up.
Ты меня не понял. Когда я сказал "параметр 'up' функции lookAt" - я имел в виду параметр функции lookAt, который называется "up". А не один из столбцов матрицы, которую эта функция выдаёт в результате.

Если мы хотим задать ориентацию в 3д пространстве через направления - нам недостаточно только одного вектора, потому что он зафиксирует только две степени свободы из трёх.

Конкретно в случае lookAt, на вход алгоритму поступает два вектора - "up" и "dir", и базисные вектора результата он высчитывает так:
1. cam_forward = norm(dir)
1. cam_right = norm(cross(dir, up))
2. cam_up = cross(cam_right, cam_forward)
Если в своей функции ты не передаёшь этот "up" явно - это только значит, что он захардкожен внутри функции.

Aroch
> мы знаем что вектор strafe (поперечная ось) всегда будет лежать параллельно
> плоскости горизонта
Вот эта "плоскость горизонта" - нормаль к ней и будет вектором "up", о котором я говорю.

Как конкретный пример, если у меня в игре ось Y смотрит наверх - то параметром в лукат пойдёт (0,1,0). А если, например, я решил сделать XY горизонтом, а ось Z направил в землю - то этот вектор теперь будет (0,0,-1).

И от того, что вектор захардкодили, изначальная проблема никуда не ушла - если мы захотим посмотреть строго вверх или строго вниз, то norm(cross(dir, up)) превратится в norm(0), и вместо матрицы получится мусор.

А если мы захотим разрешить тангаж за пределами 90 градусов - то при пересечении этих 90 градусов камера, вместо того, чтобы смотреть на мир кверх ногами, будет разворачиваться задом наперёд - ты двигаешь мышку вверх, а камера опускается вниз, двигаешь мышку вправо - а камера крутится влево.

Aroch
> В камере от третьего лица если это не космосим какой-нибудь, довольно жесткие
> ограничения на тангаж.
Ну, такое себе. Попахивает нинужонством.

#5375
(Правка: 23:22) 23:16, 22 янв 2022

Имбирная Ведьмочка
> Ну, такое себе. Попахивает нинужонством.
попахивает удобством для игрока. Ты попробуй то сделать такую камеру и посмотри как она на деле, у многих игроков тупо начинаются позывы к тошноте из-за дезориентации когда небо внизу, а земля вверху.
> И от того, что вектор захардкодили
получается удобство, так как задавать камеру её положением и точкой в которую она смотрит в разы интуитивней что в коде, что в редакторе.

#5376
(Правка: 0:14) 0:08, 23 янв 2022

Aroch
> Ты попробуй то сделать такую камеру и посмотри как она на деле
Ну например https://gamedev.ru/flame/forum/?id=251247

+ Показать

Aroch
> получается удобство, так как задавать камеру её положением и точкой в которую
> она смотрит в разы интуитивней что в коде, что в редакторе.
Вот только в играх ты не задаёшь камеру ни в коде, ни в редакторе, и вообще её положение задаёшь не ты, а игрок. От тебя - зависимость камеры от мышки.
И, возможно, это только моё личное мнение, но мне зависимость \(\varphi = S \int dx\), \(\theta = S \int dy\) кажется более интуитивной, чем то же самое, но с дополнительными промежуточными действиями, которые не приносят никакой пользы, но зато отлично всё портят.

#5377
1:43, 23 янв 2022

Имбирная Ведьмочка
> Ну например
если там fps камера то не интересно, fps камера тупая как пробка. Если же 3'rd person то решение под спойлером слишком топорное.
> Вот только в играх ты не задаёшь камеру ни в коде, ни в редакторе, и вообще её
> положение задаёшь не ты, а игрок. От тебя - зависимость камеры от мышки.
задаю вообще-то, начиная от стартового положения при смене локаций и заканчивая кат-сценами в которых я могу просто потыкать точки траектории камеры (с позициями фокуса) и получить анимацию с минимум усилий со стороны редактирования.
> но с дополнительными промежуточными действиями, которые не приносят никакой
> пользы, но зато отлично всё портят.
ты что-то путаешь, промежуточные действия у тебя, так как ты каждый раз собираешь матрицу по трём углам. Когда можно просто вращать нужную ось самой матрицы при изменении угла. И это всего лишь детали реализации. На выходе как я уже говорил тебе всё равно нужна матрица.

#5378
3:11, 23 янв 2022

Имбирная Ведьмочка
> А если мы захотим разрешить тангаж за пределами 90 градусов - то при
> пересечении этих 90 градусов камера, вместо того, чтобы смотреть на мир кверх
> ногами, будет разворачиваться задом наперёд - ты двигаешь мышку вверх, а камера
> опускается вниз, двигаешь мышку вправо - а камера крутится влево.
В старых играх такое бывало)

#5379
16:56, 25 янв 2022

Как бы понять, в каком виде библиотека?

Скачал я исходники некой либы (встраиваемая СУБД Berkeley DB), https://www.oracle.com/database/technologies/related/berkeleydb-downloads.html. Там мультиплатформенные исходники. Скачиваю под винды zip-архив.

Полноценной Visual Studio у меня на компе нет, но стоит C++ Build Tools 2019, который вроде как та же студия, но только command line, без IDE. Успешно компилирую нужный проект - получаю два файла, dll и lib. И если с dll вроде все как понятно, то с lib - я не понимаю, что это, полноценная статическая либа или просто вспомогательная библиотека для импорта из dll.

В скачанном архиве помимо прочего есть примеры использования, но они опять же представляют из себя sln/vcxproj, то есть какие-то XML, в которых хрен что поймешь:

+ Показать

В данном файле не вижу ссылок ни на .lib, ни на .dll - файлы. Как бы понять, как фактически подключается либа?
То есть, если я хочу руками сбилдить свое приложение с помощью cl.exe без всяких проектов/солюшнов, что еще помимо исходного файла я должен указать, чтоб, скажем, воспользоваться dll-вариантом библиотеки?

#5380
18:47, 25 янв 2022

Dmitry_Milk
> lib - я не понимаю, что это, полноценная статическая либа или просто
> вспомогательная библиотека для импорта из dll
обычно по размеру ясно. Если что, lib для dll легко сгенерить:
1. если у нас есть .def со списком функций, то просто

lib /def:sqlite3.def /out:sqlite3.lib /machine:x64

2. если нет, то сначала генерим .def (как написано тут)

echo LIBRARY SQLITE3 > sqlite3.def
echo EXPORTS >> sqlite3.def
for /f "skip=19 tokens=4" %A in ('dumpbin /exports sqlite3.dll') do echo %A >> sqlite3.def

и далее см. пункт 1

#5381
19:11, 25 янв 2022

Dmitry_Milk
> Как бы понять, в каком виде библиотека?
DUMPBIN что говорит?

#5382
19:27, 25 янв 2022

kipar, ок, спасибо. Похоже действительно проект с dll-кой просто сразу же сгенерил и import library к ней.

#5383
19:56, 25 янв 2022

FordPerfect
> DUMPBIN что говорит?

По самой dll-ке если с флагом /exports там много вываливается, хрен прочтешь, но похоже это действительно список всего того, что она экспортирует. Что интересно - я вижу в директории build windows  уже имеющийся .def-файл, но в нем меньше чем то, что я получаю по совету kipar.

По lib-файлу dumpbin /exports вижу вроде бы точно такой же список, но сам lib-файл всего 200 кило, в отличие от 1.4 метра dll-ки. То есть по размеру это скореее всего все таки библиотека экспорта.

Но в общем я похоже разобрался, оказывается я могу в msbuild указывать различные конфигурационные переменные, и в результате msbuild билдит разные виды таргетов, в том числе могу указать и Static Release или Static Debug, тогда билдит действительно статики.

Так что вопрос исчерпан, спасибо.

#5384
20:46, 25 янв 2022

lib файл вываливается если где-то в коде указано __declspec(dllexport)

Страницы: 1358 359 360 361408 Следующая »
ФлеймФорумПрограммирование