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

Вопрос по перспективной проекции (3 стр)

Страницы: 1 2 3 4 515 Следующая »
#30
19:41, 25 янв 2018

прогресс? это о чем вообще

#31
19:50, 25 янв 2018

adblock
Эта тема + https://gamedev.ru/code/forum/?id=227939#m11 полгода назад.
Обе решаются элементарно при использовании правильных инструментов. Ну и они обе на одну тему.

#32
22:52, 25 янв 2018

122
> Нет универсального пути. Люди разные и поэтому каждому свой подходит.
есть производственный стандарт. даже видеокарты заточены под матрицы. но люди разные, одни забивают гвозди молотком, другие - стаканом.

leonardo98
> я тоже был дураком и писал свой gui и свой софтрендер, которые сейчас не имеют
> никакой ценности, но я признаю свои ошибки
сочувствую, у меня та же история.

Daniil Petrov
> Жесть! А вот я хочу Qt осваивать для разработки редактора :)
это лучший вариант. делал свой редактор для движка именно на qt.

adblock
> блин парни,этот  leonardo98  нехороший человек
ты выложил личную переписку в публичный доступ. это не этично.
по треду я не вижу причин считать leonardo98 плохим человеком.

adblock
> Я так понимаю необходимо делать дополнительное преобразование, но так и не
> нашел/понял как это делается. Подскажите пожалуйста идею.
Существует два способа масштабирования: через fov (как обычно прицелы в шутерах реализованы), и через zoom (как обычно в любом графическом 3д редакторе). Тебе нужен второй вариант. Для этого нужно ввести в код понятие "точки наблюдения" (камеры).

eDmk
> вам надо или камеру двигать к объекту или объект к камере

Как тебе уже сказали, нужно или камеру двигать к наблюдаемому объекту, или наоборот. Это и есть единственно верная идея. И желательно перейти на матрицы пока не поздно, иначе так и будешь строить свои проекты на неправильном фундаменте.

#33
11:31, 26 янв 2018

Indiegma
> есть производственный стандарт
> желательно перейти на матрицы пока не поздно
А если будет поздно то процессор сломается от нестандартных вычислений. :) Ужос.

#34
11:40, 26 янв 2018

leonardo98
> потому что меня смутил твой прогресс за полгода
> Эта тема + https://gamedev.ru/code/forum/?id=227939#m11 полгода назад.
Что забавно, ты сам показал главный минус книжных знаний.
Смотри, пол года назад adblock'у накидали формул которые он реализовал. Но это чужие знания, он просто вбил чужие знания в код. И когда потребовалось сделать от них шаг в сторону - уже не понимает ни-че-го. И он пришел искать еще одну книжную формулу и также вбить ее в код надеясь что сработает.

Вот это минус матриц. А те формулы и алгоритмы, которые ты вывел сам - они такого казуса не дадут. Это плюс сделанного самими собой.

#35
12:11, 26 янв 2018

122
скажи пожалуйста, какое утверждение ниже тебе не понятно

1. матрицы можно умножать на матрицы и получать новую матрицу
  (это одна формула M = A * B, она готовая, определена правилом умножения матриц)
2. вектор(точку) можно умножать на матрицы и получать новый вектор(точку)
  (это вторая формула s = M * p, которая так же определена правилом умножения матрицы на вектор)

?

#36
14:12, 26 янв 2018

leonardo98
> скажи пожалуйста, какое утверждение ниже тебе не понятно
Оба.
По первому, умножать можно числа, а что такое матрицы хз.
По второму вообще шиза какая-то: вектор это три начальные координаты и три конечные, чтобы собственно получился направленный отрезок в пространстве. Итого 6 переменных (если вектор в 3д). Как ты предлагаешь умножать 6 переменных на хз что? Хз. Умножение подразумевает только две переменные.
И потом, умножение это говоря иначе - увеличение количества. Умножая 5 яблок на 3 мы получаем 15 яблок. А теперь подумай: у тебя вектор. Как ты хочешь увеличить его количество? Ерунда.

И на всякий случай напомню, что у меня вопросов по матрицам нет. Мой рендер прекрасно и давно работает без них, даже игроки в стиме были.
Не путай меня с adblock пожалуйста.

#37
15:03, 26 янв 2018

122
> умножать можно числа
уже в рамках школьного курса изучают, как минимум, умножение числа на число, вектора на число и вектора на вектор, для последних различают скалярное и векторное умножение, каждое определено соответствующим правилом...
судя по
> умножение это говоря иначе - увеличение количества. Умножая 5 яблок на 3 мы
> получаем 15 яблок
ты застрял где-то во втором классе, т.к. чуть позднее проходят умножение отрицательных и вещественных чисел, которые уже не укладываются в твою модель

#38
15:14, 26 янв 2018

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

#39
15:31, 26 янв 2018

dayllenger
> Мы "умножением" просто назвали операции композиции линейных преобразований и
> применения преобразования к вектору
Вот у вас даже терминология не создана нормальная. У здоровых людей формула поворота - это формула поворота, а не умножение. Формула перспективных преобразований, а не умножение. Линейный сдвиг камеры, а не умножение. А у вас всё это - одно умножение. Сырая видать вещь раз такая путаница царит в терминах.

leonardo98
> в рамках школьного курса
Я в школе плохо успевал, мне репетитора нанимали по алгебре и геометрии. Но тем неменее - не помню там ничего подобного. Может, в мое время и не учили этому.

В любом случае сложность освоения - это минус твоих матриц. Если я их не освоил но справился без них, возникает вопрос: зачем? Зачем идти трудным путем если все это же самое можно считать без кренделей. Непонятно.

> и вектора на вектор
Лол.
Просто ради любопытства, что получится? Вектор векторов?
И как вы будете умножать 6 чисел на 6, посмотрел бы я.

#40
15:36, 26 янв 2018

вы мне вот что скажите, чет я не пойму, хотя перевел свою мышление в пространство матриц.

1. Я получаю матрицу Matrix4 mat= Matrix4MakePerspective(60.0, 1, 1, 100);
2. Эту матрицу я умножаю на вектор Vector4 v3point

Правильно я делаю или нет?

Vector4 v3d4;/*Это точка*/
vector<Vector4>BABB;/*Это массив точек*/

Matrix4 Matrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)
{
  float cotan = 1.0f / tanf(fovyRadians / 2.0f);

  Matrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f,
    0.0f, cotan, 0.0f, 0.0f,
    0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f,
    0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f };

  return m;
}

for (auto i = plane3d_perspective.begin(); i != plane3d_perspective.end(); i++)
  {
    Point3d[number].push_back(i->second.first);
    Point3d[number].push_back(i->second.second);
    Point3d[number].push_back(zA);
    Point3d[number].push_back(i->first);

    v3d4.set(i->second.first, i->second.second, 0, 1);/*Назначаю координаты*/
    BABB.push_back(v3d4);/*Кладу в массив*/

    number++;
  }
  

  Matrix4 mat;
  //mat.identity();
  
  mat= Matrix4MakePerspective(60.0, 1, 1, 100);

  mat.rotateX(this->angular_x);
  mat.rotateY(this->angular_y);
  mat.rotateZ(this->angular_z);

  //mat.translate(0,0,1);

  mat[11] *= 700;
  
  
  for (int i = 0; i < BABB.size(); i++)
  {
    Vector4 t = Vector4(mat * BABB[i]);/*Умножаю матрицу на вектор*/

    t = t / (t.z + 0.5);/*Преобразую в двумерные координаты*/

    Point3d[i][0] = 800 * t.x / (t.z + 0.5);
    Point3d[i][1] = 800 * t.y / (t.z + 0.5);

  }
#41
15:52, 26 янв 2018

122
> По второму вообще шиза какая-то: вектор это три начальные координаты и три
> конечные, чтобы собственно получился направленный отрезок в пространстве. Итого
> 6 переменных (если вектор в 3д). Как ты предлагаешь умножать 6 переменных на хз
> что? Хз. Умножение подразумевает только две переменные.

Все правильно. Один множитель  - это начальные координаты в виде вектора текущего положения (который направлен из точки(0,0,0), второй множитель - конечные, перобразованные в матрицу переноса. 

Изображение

Матрицы, которые используются в графике - это на самом деле уже выведенные частные случаи метода решения систем линейных уравнений с помощью матриц. И практический смысл матриц в том, что

1) они ускоряются на SIMD.

2)позволяют осуществлять комбинированные операции трансформации множества объектов (вершин и целых отдельных мешей) с помощью одной лишь матрицы, являющей собой произведение матриц переноса, поворота, камеры, перспективного искажения и прочего, рассчитаного один раз.

То бишь увеличить, повернуть, переместить в пространстве, переместить в пространство камеры, исказить - все это за 4 simd-умножения и 3 сложения почленно.

#42
16:10, 26 янв 2018

adblock
для получения преобразованных координат, готовых к выводу на экран, достаточно умножения матрицы на вектор, не нужно дополнительных преобразований вершин, но важно правильно подготовить матрицу, для начала - в каком диапазоне координат точки? камера есть? почему умножение идет только на матрицу проекции, а потом еще какие-вычисления?

122
> Просто ради любопытства, что получится? Вектор векторов?
https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BA%D1%82%D0%BE%D1%8… D%D0%B8%D0%B5

#43
16:25, 26 янв 2018

leonardo98
диапозон [-290.....290]

это вывод окончательный на экран,800 это я масштабирую,камеры нет. А как нужно подготовить матрицу

    Point3d[i][0] = 800 * t.x / (t.z + 0.5);
    Point3d[i][1] = 800 * t.y / (t.z + 0.5);
#44
16:39, 26 янв 2018

leonardo98
да, везде утверждается, что бы перевести в 2-х мерный базис, необходимо 1-ые два компонента вектора разделить на последний, ведь так?

И еще такая штука, мне приходиться вводить число в матрицу - это третья строка, допустим 700 за место dz, x и y умножать на 800, тогда что-то получается похожее на перспективное искажение

Изображение

но когда я пытаюсь приблизить плоскость,на каком -то моменте она ломается, фото выше по форуму. Я тоже пришел к тому, что нужно вводить точку - камеру и приближать ее, но вот как все это сделать, пока не знаю. Да и полгода я просто этим не занимался, сейчас решил возобновить, так как есть и время и желание.

Страницы: 1 2 3 4 515 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.