Разбираемся с технологией 3D программирования

Автор Kadet, 23 июня 2021, 09:16

0 Пользователи и 1 гость просматривают эту тему.

mikekaganski

Цитата: Kadet от 31 июля 2021, 10:40Извините, но дя меня "направление" и "длина" немного разные понятия.

Для меня тоже ;)

Однако это не меняет ни определения понятия "вектор", ни факта, что вектор нулевой длины не может иметь направления.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 31 июля 2021, 11:05Однако это не меняет ни определения понятия "вектор", ни факта, что вектор нулевой длины не может иметь направления.
Дело в том, что vpn я расшифровал не как длинны векторов, а как некою точку, с координатами в X,Y,Z vpr-а, на которую направлен взгляд камеры...

А вот теперь, сами того не подозреваю, в нашей беседе, думаю, мы разгадали загадку, которая осталась неразгаданной раньше: почему при воздействии на координаты камеры модель начинает плющить и выворачивать, а при воздействии на матрицу сцены этого не проходит.
Думаю, что это происходит именно потому, что забываем изменять вектора направления камеры. По идее при вращении объекта вокруг какой-то оси, точка фокуса должна оставаться неизменной. А получается, что при изменении координат камеры, вектор направления фокуса остаётся неизменным, т.е. точка фокуса тоже пропорционально смещается. В итоге мы видим ту же модель, но в некой непонятной перспективе.
А при воздействии на матрицу, по-видимому, пересчёт вектора фокусе происходит автоматически.

Это пока теория. Нужно её проверить.

Kadet

#107
Однако, хотелось бы вернуться к модели профлиста.
Перепробовал несколько способов формировани полигонов объекта и ни один не работает как положено.
Метод загонять все плоскости как один полигон, который я применил изначально (кстати, подсмотрел его у моделей, которые создавал в Drow, там все координаты загонятся как один полигон, создавая один массив третьего уровня).
В этом методе делаю прямоугольники для каждой нужной плоскости во всю длину модели, потом смещаю точку в начало следующей плоскости, и, начиная оттуда, формирую следующую плоскость.
Однако при это методе почему-то, при наклоне модели близком к положению горизонта, пропадает заливка возвышенных плоскостей.
Вот схема этого метода:
SequenceX = Array(0, 50, 50, 0, 0, _
50, 55, 55, 50, 50, _
55, 107, 107, 55, 55, _
...
112, 107, 55, 50, 0)


Второй метод. Загоняю каждую маленькую плоскость как отдельный полигон (второй уровень массива).
Проблема с заливкой сохраняется.
SequenceX = Array(0, 50, 50, 0, 0)
SequenceX1(0) = SequenceX
SequenceX = Array(50, 55, 55, 50, 50)
SequenceX1(1) = SequenceX
...
SequenceX = Array(1147, 1200, 1200, 1147, 1147)
SequenceX1(40) = SequenceX


Даже пробовал такой метод - создаю ломаную линию по всей ширине модели с одной стороне (Y=0), потом смещаюсь по Y, и формирую такую же линию в обратном направлении, но уже с Y = iDlina.
В этом случае пропадают линии рёбер, а они нужны.

Других вариантов загонять массивы полигонов пока придумать не могу. Не знаю, как решить эту проблему.

P.S.: в примере все эти пробы есть в типе модели - plType="C-8". Да, и удалять, чистить мусор не стал, так как хочу продолжить эксперименты в этом направлении. Так, что не ругайтесь уж сильно.
В примере по-умолчанию используется второй метод.

mikekaganski

Цитата: Kadet от 31 июля 2021, 23:24
А вот теперь, сами того не подозреваю, в нашей беседе, думаю, мы разгадали загадку, которая осталась неразгаданной раньше: почему при воздействии на координаты камеры модель начинает плющить и выворачивать, а при воздействии на матрицу сцены этого не проходит.
Думаю, что это происходит именно потому, что забываем изменять вектора направления камеры.

Нет. См.:

Цитата: Kadet от 28 июля 2021, 23:09Зачем делать обратную нормализацию фокуса камеры (-pt.PositionX и т.д.)? Она-то и устанавливает картинку на "вид-с-боку".

Именно для этого я и обновлял каждый раз vpn на основании vrp, с учётом того что модель находится в 0,0,0. Но

Цитата: mikekaganski от 29 июля 2021, 00:12Что касается "Зачем делать обратную нормализацию фокуса камеры (-pt.PositionX и т.д.)? Она-то и устанавливает картинку на "вид-с-боку"" - на самом деле это этап определения правильного задания камеры. С учётом того, что я поместил группу объектов сцены в 0,0,0, направление нормали к плоскости получается тривиальным - оно просто совпадает с значениями координат. И тем не менее, всё плохо - деформации остаются. Я проверял, что будет при развороте в противоположном направлении - отсюда и минусы. При этом, несмотря на то что по логике мы должны смотреть совсем не туда, объекты сцены всё равно видны в центре - просто развёрнуты иначе. Я пока не могу это объяснить. Возможно, я просто не до конца разобрался с правильными значениями фокусного расстояния и глубины...
С уважением,
Михаил Каганский

Kadet

И в этом втором варианте последняя плоскость вообще остаётся не залитой,.. почему-то.

А в общем, что-то в LO недоработано, как мне кажется в "видимостью/невидимостью" 3D плоскостей и граней. Линии, который в здравом понимании должны быть невидимыми, или части этих линий, остаются видимыми. Из-за этого трудно понять, с какой-же стороны смотришь на модель.
Получается, залита только нижняя плоскость модели, а все возвышенные плоскости, остаются прозрачными. Из-за этого и линии остаются всегда видны.

Kadet


mikekaganski

Цитата: Kadet от 31 июля 2021, 23:54
Второй метод. Загоняю каждую маленькую плоскость как отдельный полигон (второй уровень массива).

Если Вы пользуетесь Shape3DPolygonObject (а не, скажем, экструдируете), то только так.

А для заливки обратной стороны профлиста попробуйте:

xShape3D.D3DDoubleSided = True
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от  1 августа 2021, 00:04Именно для этого я и обновлял каждый раз vpn на основании vrp, с учётом того что модель находится в 0,0,0. Но
Так, стоп. В конец запутался.
Допустим, мы смещаем камеру на угол, допустим, 45гр. Делаем обратную нормализацию вектора фокуса. В итоге, по логике, мы должны получить направление (-Z), т.е. - подели мы вообще не должны видеть, ибо камера, по-логике, должна теперь зрить в противоположную от модели сторону.
Но, даже если мы не делаем инверсию вектора, а делаем простую нормализацию, почему эта манипуляция всегда выводила меня на "вид_сбоку"? (Мне трудно сейчас это продемонстрировать, ибо долго обратно перекрыжить то, что я выводил два дня подряд).

mikekaganski

Блин, я же именно об этом и писал:
Цитата: mikekaganski от 29 июля 2021, 00:12
И тем не менее, всё плохо - деформации остаются. Я проверял, что будет при развороте в противоположном направлении - отсюда и минусы.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от  1 августа 2021, 00:15А для заливки обратной стороны профлиста попробуйте:
Код:
ЦитироватьxShape3D.D3DDoubleSided = True
С этой функцией баловался. Не помогает. К тому же, она работает интересно. Если она отключена, то при повороте моей модели видом на изнанку, вся модель становится прозрачной. Рисовал эти модели на каркасе, и не сразу отрерулировал прорисовку с правильной стороны. Так вот, через изнаночную сторону были видны все внутренности каркаса, а через лицевую нет. Хотя линии рёбер прорисовывались и там и там.

Однако, я вовсе не об этом. Вот картинка, которая у меня получается. Плоскости, отличные от нулевой (приподнятые, относительно неё) остаются прозрачными.

Картинка "Правильно" - в этом ракурсе всё правильно.
А в ракурсах "Неправильно" - неправильно. "Неправильно1" - вид чуть сверху, а "Неправильно2" - чуть снизу. И в том и другом случае проблема присутствует.

mikekaganski

А, Вы про это. Ну, здесь всё просто (но кмк некорректно - баг). Заливается результирующий плоский полигон с самопересечениями, с проблемами из-за этого.

Я бы посоветовал использовать экструзию для этих целей.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от  1 августа 2021, 00:50Заливается результирующий плоский полигон с самопересечениями, с проблемами из-за этого.
Так и подумал. Упрощение с облегчением, с последующим косячеством. Знакомая тема.

Однако, а рамках проекта, которым занимаюсь, этот баг считаю не существенным. Эти модели будут выводиться в малых масштабах, поэтому детальная прорисовка их не будет видна, а как следствие и этот баг.
Просто хотелось предупредить народ, который, вдруг, захочет побаловаться с 3D в LO о существовании этой проблемы.

Цитата: mikekaganski от  1 августа 2021, 00:50Я бы посоветовал использовать экструзию для этих целей.
Ещё не освоил, но планирую её применить при создании других моделей. Если удачно пойдёт, то может и эти переделаю.