Обнаружил особенность, при которой некоторым объектам (всегда одним и тем же) присваиваются инвертированные трансформации, при присваивании в цикле. У большей же части объектов координаты получаются верными.
Например, в массиве позиций для третьего по счету объекта следующая позиция:
reader.nodes[3].position
[95.0901,130.09,0]
После присваивания данной позиции объекту в цикле он принимает следующее положение:
Объясните подробнее. Для чего вам это нужно?
Как вы получили данные о позиции и вращении?
Пример: В новой сцене создаем два объекта с названиями "Object1" и "Object2".
Перемещаем и вращаем объект "Object1".
Теперь нужно скопировать позицию и вращение с объекта1 на объект2.
Сначала получаем данные с объекта1 таким способом:
Пишу импортер кастомного формата. Данные об объектах (вершины, индексы, текстурные координаты..) и их позиции\вращении\масштабе читаются из файла. На их основе в цикле создаются меши и им присваиваются трансформации.
Присваивается все верно:
...
for tempLod in item.lods do
(
mynode = BuildMesh vertices:tempLod.vertices faces:tempLod.faces \
tverts:tempLod.tverts
mynode.name = nodes[i].name
mynode.position = nodes[i].position
format "Node % (%): position in array:%, assigned: %\n" i nodes[i].name \
nodes[i].position mynode.position
mynode.scale = nodes[i].scale
mynode.rotation = nodes[i].rotation
)
Node 1 (Loft02): position in array:[40,45,0], assigned: [40,45,0]
Node 2 (Loft08): position in array:[40,185.18,0], assigned: [40,185.18,0]
Node 3 (Loft14): position in array:[95.0901,130.09,0], assigned: [95.0901,130.09,0]
Node 4 (Loft19): position in array:[50.0901,120,0], assigned: [50.0901,120,0]
...
А после построения сцены у некоторых объектов получается вот так:
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Дмитрий Никулин
Обнаружил особенность, при которой некоторым объектам (всегда одним и тем же) присваиваются инвертированные трансформации, при присваивании в цикле. У большей же части объектов координаты получаются верными.
Например, в массиве позиций для третьего по счету объекта следующая позиция:
После присваивания данной позиции объекту в цикле он принимает следующее положение:
Аналогично и с вращением:
Возможно ли как-нибудь убрать эту нежелательную инверсию?
igorznag
Как вы получили данные о позиции и вращении?
Пример: В новой сцене создаем два объекта с названиями "Object1" и "Object2".
Перемещаем и вращаем объект "Object1".
Теперь нужно скопировать позицию и вращение с объекта1 на объект2.
Сначала получаем данные с объекта1 таким способом:
И получаем:
Потом применяем данные к объекту2 таким способом:
Чтобы проверить данные у объекта2 используем код:
И получаем:
Дмитрий Никулин
Присваивается все верно:
... for tempLod in item.lods do ( mynode = BuildMesh vertices:tempLod.vertices faces:tempLod.faces \ tverts:tempLod.tverts mynode.name = nodes[i].name mynode.position = nodes[i].position format "Node % (%): position in array:%, assigned: %\n" i nodes[i].name \ nodes[i].position mynode.position mynode.scale = nodes[i].scale mynode.rotation = nodes[i].rotation )А после построения сцены у некоторых объектов получается вот так:
igorznag
на такой код:
или на такой код:
тогда что произойдёт?
Дмитрий Никулин
А я все на позицию грешил.
Дмитрий Никулин
Но я нашел решение и более верный способ.
Для объектов без parent'ов получаем матрицу трансформаций:
local tempNodeTransform = (scalematrix tempNode.scale) \ * (tempNode.rotation as Matrix3) * (transmatrix tempNode.position)Для дочерних объектов умножаем полученную матрицу на матрицу родителя:И соответственно присваиваем матрицу текущему узлу: