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

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

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

mikekaganski

Цитата: Kadet от 27 июля 2021, 23:10Действительно, домик стоит на плоскости XZ, а верх его по оси Y. Однако, не пойму, что тут удивительного.
В конструировании зданий есть такое понятие - ТЛП (теоретическая линия пола), а если быть точней - плоскость пола. Её всегда используют как "0". Именно поэтому этот "0" я и кладу на плоскость XZ.

Удивительно то, что высота - Y, а не Z.
С уважением,
Михаил Каганский

mikekaganski

Цитата: Kadet от 27 июля 2021, 23:25По поводу передачи индексов и страниц. Всё не так просто.

В 3-D всё непросто, и не стоит усложнять - а Вы просто везде устраиваете россыпи граблей.

Что касается перспективы, тут точно всё криво в ЛО. Можно поиграться с сырой переработкой Вашего примера - я начал, сделал высоту в направлении Z, добавил там некоторые функции обработки матриц, сделал перемещение камеры перемещением камеры (а не трансформацией сцены, что тоже возможно при правильной реализации), убрал некоторые тормоза, поигрался с охватывающей сферой (в надежде, что это устранит искажения, возникающие при анизотропном масштабировании сцены к её внешнему размеру), поигрался с квадратным размером сцены (с той же целью)... но слишком большие трудозатраты. Пока больше нет времени. Выкладываю что есть (и, к сожалению, львиная часть времени, которую можно было потратить на конструктив, убита на едва начатую чистку существующего кода).
С уважением,
Михаил Каганский

Kadet

#62
Цитата: mikekaganski от 28 июля 2021, 00:50Удивительно то, что высота - Y, а не Z.
"Интересное кино"... А где это видано, чтобы высота была по Z? Открываем любой школьный учебник, любой сайт, да даже само ЛО по умолчанию предлагает такое расположение - XY плоскость листа/экрана, а Z - глубина. Возможно, в компьютерном мире всё уже давно перевернулось, но для меня именно так привычней и понятней.
А с другой стороны - какая разница, как повернуть. Суть то от этого не меняется.

Цитата: mikekaganski от 28 июля 2021, 00:58В 3-D всё непросто, и не стоит усложнять - а Вы просто везде устраиваете россыпи граблей.
Не, ну это для вас, наверное, всё просто. Вы, возможно, уже "льва съели" на 3D. А для меня, который ещё месяц назад просто боялся прикоснуться к этому "загадочному и непознанному 3D", как тот папуас к автомобилю, всё сложно и непонятно. И "мусора" много потому, что каждый шаг делается после целой массы проб и ошибок, тестов... И многие хвосты от этих "проб и ошибок" просто остаются неубранными, неоптимизированными. Ведь я так толком не нашёл никакого, вообще никакого описания программирования 3D в ЛО. То, что описывается для других языков, описывает лишь принципы, а применение в LO... особая проблема.

Цитата: mikekaganski от 28 июля 2021, 00:58Можно поиграться с сырой переработкой Вашего примера - я начал,
Спасибо! Я пока над этим не очень заморачиваюсь. Мне пока главное создать само ядро, структуру, понять методы и принципы. А оптимизацией займусь позже. Пока тоже на это времени нет. Однако, спасибо за помощь!

mikekaganski

Цитата: Kadet от 28 июля 2021, 07:18
Цитата: mikekaganski от 28 июля 2021, 00:58В 3-D всё непросто, и не стоит усложнять - а Вы просто везде устраиваете россыпи граблей.
Не, ну это для вас, наверное, всё просто.

Нене, это для всех непросто - посмотрите внимательно цитату ;)
С уважением,
Михаил Каганский

mikekaganski

#64
Цитата: Kadet от 28 июля 2021, 07:18
Я пока над этим не очень заморачиваюсь. Мне пока главное создать само ядро, структуру, понять методы и принципы. А оптимизацией займусь позже. Пока тоже на это времени нет.

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

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

Kadet

Цитата: mikekaganski от 28 июля 2021, 07:30Нене, это для всех непросто - посмотрите внимательно цитату
Думал сие очепятка, ибо "непросто" и "не стоит усложнять", как-то...  В общем, видел, но подумал.

Цитата: mikekaganski от 28 июля 2021, 07:34Конкретно в данном случае - хотя бы использование матриц преобразований.
Ну, Вы ко мне предвзяты. Только вчера освоил матричные преобразования при работе с полигонами. Теперь эту схему внедрил (УЖЕ) во все, кроме куба, модели. И они работают.

Кстати, про работу с полигонами. Делаю полигональную модель из более прим. 100 точек. Что такое профлист, надеюсь, имеете представление. В общем фигура состоит из множества прямоугольнико, растянутых по всей длине модели. Поэтому, не заморачивался с созданием треугольных полигонов, делал всё прямоугольниками... НО... как всегда есть подводные камни.
Прежде всего, при создании полигона в каждом прямоугольнике возвращаться в точку начала прямоугольника, потом делать дополнительный шаг к началу следующего прямоугольника... И так снова и снова. Получается, что одна линия всегда задваивается.
Потом, по окончании строительства всей модели пришлось по всем линиям возвращаться в исходную точку начала всей модели (строю всё как один полигон)... Возврат необходим ибо заливка всей модели получается некорректной. А так, этот косяк выравнивается.
Однако - снова получается очередное дублирование уже готовых линий.
Вот кусок кода матрицы полигона.
If plType="C-8" Then
SequenceX = Array(0, 50, 50, 0, 0, _
50, 55, 55, 50, 50, _
55, 107, 107, 55, 55, _
107, 112, 112, 107, 107, _
112, 165, 165, 112, 112, _
165, 170, 170, 165, 165, _
170, 222, 222, 170, 170, _
222, 227, 227, 222, 222, _
227, 280, 280, 227, 227, _
280, 285, 285, 280, 280, _
285, 337, 337, 285, 285, _
337, 342, 342, 337, 337, _
342, 395, 395, 342, 342, _
395, 400, 400, 395, 395, _
400, 452, 452, 400, 400, _
452, 457, 457, 452, 452, _
457, 510, 510, 457, 457, _
510, 515, 515, 510, 510, _
515, 567, 567, 515, 515, _
567, 572, 572, 567, 567, _
572, 625, 625, 572, 572, _
625, 630, 630, 625, 625, _
630, 682, 682, 630, 630, _
682, 687, 687, 682, 682, _
687, 740, 740, 687, 687, _
740, 745, 745, 740, 740, _
745, 797, 797, 745, 745, _
797, 802, 802, 797, 797, _
802, 855, 855, 802, 802, _
855, 860, 860, 855, 855, _
860, 912, 912, 860, 860, _
912, 917, 917, 912, 912, _
917, 970, 970, 917, 917, _
970, 975, 975, 970, 970, _
975, 1027, 1027, 975, 975, _
1027, 1032, 1032, 1027, 1027, _
1032, 1085, 1085, 1032, 1032, _
1085, 1090, 1090, 1085, 1085, _
1090, 1142, 1142, 1090, 1090, _
1142, 1147, 1147, 1142, 1142, _
1147, 1200, 1200, 1147, 1147, _
1142, 1090, 1085, 1032, 1027, _
975, 970, 917, 912, 860, _
855, 802, 797, 745, 740, _
687, 682, 630, 625, 572, _
567, 515, 510, 457, 452, _
400, 395, 342, 337, 285, _
280, 227, 222, 170, 165, _
112, 107, 55, 50, 0)
SequenceY = Array(0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, iDlina, iDlina, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0, _
0, 0, 0, 0, 0)
SequenceZ = Array(8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
8, 0, 0, 8, 8, _
0, 0, 0, 0, 0, _
0, 8, 8, 0, 0, _
8, 8, 8, 8, 8, _
0, 0, 8, 8, 0, _
0, 8, 8, 0, 0, _
8, 8, 0, 0, 8, _
8, 0, 0, 8, 8, _
0, 0, 8, 8, 0, _
0, 8, 8, 0, 0, _
8, 8, 0, 0, 8, _
8, 0, 0, 8, 8)

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

Кстати, вот матрица, которую я использую для управления этой моделью:
Matrix = xShape3D.D3DTransformMatrix
'******************
a = Matrix.Line1.Column1
b = Matrix.Line1.Column2
c = Matrix.Line1.Column3
Sx = Matrix.Line1.Column4
'******************
d = Matrix.Line2.Column1
e = Matrix.Line2.Column2
f = Matrix.Line2.Column3
Sy = Matrix.Line2.Column4
'******************
h = Matrix.Line3.Column1
i = Matrix.Line3.Column2
j = Matrix.Line3.Column3
Sz = Matrix.Line3.Column4
'******************
Dx = Matrix.Line4.Column1
Dy = Matrix.Line4.Column2
Dz = Matrix.Line4.Column3
S = Matrix.Line4.Column4
'********************************************************
iRad = 0.01745
'******************
' If xRot<>0 Then
gamma = xRot*iRad
oSheet.getCellByPosition(0, 1007).setValue(gamma) 'SIN
oSheet.getCellByPosition(0, 1009).setValue(gamma) 'COS
gSin = oSheet.getCellByPosition(0, 1008).getValue()
gCos = oSheet.getCellByPosition(0, 1010).getValue()
'******************
' e = gCos
' f = gSin
' i = -gSin
' j = gCos
' End If
'******************
' If yRot<>0 Then
beta = yRot*iRad
oSheet.getCellByPosition(0, 1007).setValue(beta) 'SIN
oSheet.getCellByPosition(0, 1009).setValue(beta) 'COS
bSin = oSheet.getCellByPosition(0, 1008).getValue()
bCos = oSheet.getCellByPosition(0, 1010).getValue()
'******************
' a = bCos
' c = -bSin
' h = bSin
' j = bCos
' End If
'******************
' If zRot<>0 Then
alfa = zRot*iRad
oSheet.getCellByPosition(0, 1007).setValue(alfa) 'SIN
oSheet.getCellByPosition(0, 1009).setValue(alfa) 'COS
aSin = oSheet.getCellByPosition(0, 1008).getValue()
aCos = oSheet.getCellByPosition(0, 1010).getValue()
'******************
' a = aCos
' b = aSin
' d = -aSin
' e = aCos
' End If
'********************************************************
a = aCos*bCos
b = aCos*bSin*gSin - aSin*gCos
c = aCos*bSin*gCos + aSin*gSin
'******************
d = aSin*bCos
e = aSin*bSin*gSin + aCos*gCos
f = aSin*bSin*gCos - aCos*gSin
'******************
h = -bSin
i = bCos*gSin
j = bCos*gCos
'******************
'********************************************************
Sx = Xpoz
Sy = Ypoz
Sz = Zpoz
'********************************************************
Matrix.Line1.Column1 = a
Matrix.Line1.Column2 = b
Matrix.Line1.Column3 = c
Matrix.Line1.Column4 = Sx
'******************
Matrix.Line2.Column1 = d
Matrix.Line2.Column2 = e
Matrix.Line2.Column3 = f
Matrix.Line2.Column4 = Sy
'******************
Matrix.Line3.Column1 = h
Matrix.Line3.Column2 = i
Matrix.Line3.Column3 = j
Matrix.Line3.Column4 = Sz
'******************
Matrix.Line4.Column1 = Dx
Matrix.Line4.Column2 = Dy
Matrix.Line4.Column3 = Dz
Matrix.Line4.Column4 = S
'******************
xShape3D.D3DTransformMatrix = Matrix
'********************************************************

mikekaganski

Цитата: Kadet от 28 июля 2021, 16:25
Ну, Вы ко мне предвзяты. Только вчера освоил матричные преобразования при работе с полигонами. Теперь эту схему внедрил (УЖЕ) во все, кроме куба, модели. И они работают.

Здорово :)

Цитата: Kadet от 28 июля 2021, 16:25
Кстати, вот матрица, которую я использую для управления этой моделью:

А вот управлять матрицами так не стоит. Матрица должна быть "чёрным ящиком" - Вы посмотрели мой пример? Там есть исходная функция, возвращающая единичную матрицу (т.е. матрицу, не трансформирующую объект), и есть функции, разделающие матрицу на компоненты, а также вращающие матрицы, сдвигающие матрицы. Я только эти две реализовал, но можно добавить масштабирование, скос... и тогда можно набрать элементарные действия для любой трансформации и перемножить в нужном порядке (порядок важен).
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 27 июля 2021, 09:54Есть специальный метод вызова функций Calc из Basic,
Не нашёл в предложенном списке ASIN, ACOS,.. и даже мою любимую ROUNDUP.

mikekaganski

#68
Цитата: Kadet от 28 июля 2021, 16:44
Цитата: mikekaganski от 27 июля 2021, 09:54Есть специальный метод вызова функций Calc из Basic,
Не нашёл в предложенном списке ASIN, ACOS,.. и даже мою любимую ROUNDUP.

Это как?? Там они в самом начале - MyRoundUp, MyASin, MyACos...

Или Вы говорите про документацию по ссылке? Вы её прочитали? Или просто на таблицу поглядели? Там же написано, что для всех встроенных функций Calc надо пользоваться первым сервисом (и пример приведён), а для специальных функций из адд-инов (исторически так сложилось) надо пользоваться другой службой и необычными именами функций (и приведён перечень именно этих нестандартных функций).
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 28 июля 2021, 16:33Вы посмотрели мой пример?
Посмотрел, только времени не было углубляться. Пока только проглядел.

mikekaganski

Цитата: Kadet от 28 июля 2021, 16:49
Цитата: mikekaganski от 28 июля 2021, 16:33Вы посмотрели мой пример?
Посмотрел, только времени не было углубляться. Пока только проглядел.

;D

Цитата: Kadet от 28 июля 2021, 16:49
Я пока над этим не очень заморачиваюсь. Мне пока главное создать само ядро, структуру, понять методы и принципы. А оптимизацией займусь позже. Пока тоже на это времени нет.

Цитата: mikekaganski от 28 июля 2021, 07:34
Вот именно об этом я и писал. Вы не прислушиваетесь к советам (и не только в этой теме), считаете, что это несвоевременно и т.п., а потом уже поздно. ...

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

Цитата: mikekaganski от 28 июля 2021, 16:33
Цитата: Kadet от 28 июля 2021, 16:25
Кстати, вот матрица, которую я использую для управления этой моделью:

А вот управлять матрицами так не стоит. Матрица должна быть "чёрным ящиком" - Вы посмотрели мой пример? Там есть исходная функция, возвращающая единичную матрицу (т.е. матрицу, не трансформирующую объект), и есть функции, разделающие матрицу на компоненты, а также вращающие матрицы, сдвигающие матрицы. Я только эти две реализовал, но можно добавить масштабирование, скос... и тогда можно набрать элементарные действия для любой трансформации и перемножить в нужном порядке (порядок важен).

Дежа вю, однако. Пора мне кончать тратить своё время.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 28 июля 2021, 16:45Вы её прочитали? Или просто на таблицу поглядели?
Чего там читать? Те три строчки на аглицком, которые я перевёл в яндекс переводчике и толком ничего не понял из этого перевода?
Спасибо за разъяснения.

Kadet

Цитата: mikekaganski от 28 июля 2021, 16:53Дежа вю, однако. Пора мне кончать тратить своё время.
Не, ну а чего вы хотели. Вы вчера написали в под 12 ночи (обычно ночами я сплю)... Целый день на работе (работа у меня не связана с программированием и требует некоторых усилий)... Появилось время под вечер - вот общаюсь с Вами... На это тоже нужно время.

Однако, ваше право. Спасибо и на том, что уже сказано.

Kadet

Если вернуться к функциям CALC...
Вот как понять эту строчку?
    MyVlook = oService.callFunction("VLOOKUP",Array(item, InRange, FromCol, True))

В частности, какие аргументы нужны для Array?
Array(item, InRange, FromCol, True)
В общем снова нужно использовать эмпирический метод - пробовать.

mikekaganski

#74
Какое "пробовать"? Вы откройте справку по VLOOKUP.

И справку по интерфейсу XFunctionAccess. Только яндекс-транслейт слабоват. Хотя бы гугл.

Цитата: Kadet от 28 июля 2021, 16:57
Целый день на работе (работа у меня не связана с программированием и требует некоторых усилий)...

Вы, получается, свою работу автоматизируете в нерабочее время? Ого!
С уважением,
Михаил Каганский