Вопросы/ответы
- Автор темы Дмитрий Шаравин
- Дата создания
- Рейтинг
- 2
Насколько я понимаю, анимация содержится в actions. Задача стоит экспортировать анимацию сцены в своё приложение. Но в каждом actions я нашёл только fcurves со свойствами data_path из всего, что указывает, какое свойство анимируется. Главная проблема, что data_path содержит названия вроде location даже без указания, по какой координате. А лучше б получать даже не location по координатам, а всю матрицу 4 на 4 в момент каждого кадра. Вот это никак не могу найти, как сделать. Всё что сумел написать:
Но результатом выгрузки становится:
Хотелось б хоть как-то определить, что это location.x, а лучше выгрузить сразу матрицу. Подскажите, пожалуйста, как такие улучшения возможно сделать.
Код:
def saveFrames(file, action):
file.write("<frames>")
currFrame = action.frame_range[0]
lastFrame = action.frame_range[1]
while (currFrame<lastFrame):
file.write("<frame time=\"{:9f}\">".format(currFrame))
for curve in action.fcurves:
file.write("<curve>")
file.write("<path>{:s}</path>".format(curve.data_path))
file.write("<value>{:9f}</value>".format(curve.evaluate(currFrame)))
file.write("</curve>")
file.write("</frame>")
currFrame+=1
file.write("</frames>")
Код:
<curve>
<path>location</path>
<value> 4.003301</value>
</curve>
<curve>
<path>location</path>
<value> 7.583109</value>
</curve>
<curve>
<path>location</path>
<value>-1.201249</value>
</curve>
- Рейтинг
- 2
Есть проблема с получением текстурных координат через script. Находил где-то пример, что для режима Generated (в script значение 'ORCO') можно выгрузить так:
Но при отрисовке в своём приложении реально получается, что изображение просто ровно ложится на каждую прямоугольную грань, но не сходится с картинкой в Blender'е не только для режима Generated, но и ни для одного другого режима. Причём выгружаются в этом случае именно такие текстурные координаты:
Вот как соотносятся результаты выгрузки с картинкой в Blender'е.
Подскажите, пожалуйста, как получить те текстурные координаты, которые реально использует Blender.
Код:
uvCoordinates = mesh.uv_layers.active.data
uv1Node = doc.createElement("UV1")
uv1Node.setAttribute("X", str(uvCoordinates[polygon.loop_indices[0]].uv.x))
uv1Node.setAttribute("Y", str(uvCoordinates[polygon.loop_indices[0]].uv.y))
polygonNode.appendChild(uv1Node)
uv2Node = doc.createElement("UV2")
uv2Node.setAttribute("X", str(uvCoordinates[polygon.loop_indices[1]].uv.x))
uv2Node.setAttribute("Y", str(uvCoordinates[polygon.loop_indices[1]].uv.y))
polygonNode.appendChild(uv2Node)
Код:
<Triangle SecondTriangle="0" TriangleFirst="4" TriangleSecond="5" TriangleThird="1">
<UV1 X="0.0" Y="0.0"/>
<UV2 X="1.0" Y="0.0"/>
<UV3 X="1.0" Y="1.0"/>
<UV4 X="0.0" Y="1.0"/>
</Triangle>
Подскажите, пожалуйста, как получить те текстурные координаты, которые реально использует Blender.
Вложения
-
63,4 КБ Просмотров: 239
- Рейтинг
- 2
Не скажу по поводу Generated, не экспериментировал, делаю для UV, проблем не возникало.
Не забываете ли трансформировать оси координат/нормалей из Blender в вашу систему?
Не забываете ли трансформировать оси координат/нормалей из Blender в вашу систему?
- Рейтинг
- 2
Ещё один непонятный момент с Blender'ом - по поводу выравнивания поверхностей. Есть режим auto-smooth и задаётся угол, но до меня никак не доходит, что он при этом делает. Т. е. по какому признаку он, скажем, для цилиндра определяет, что боковые грани нужно выравнивать, а переход на верхнюю грань резкий. Я нашёл только векторы нормалей для вершин и граней, но непонятно, по какому принципу он их использует для auto-smooth и что задаёт угол.
Это просто угол между нормалями соседних полигонов, т.е. в случае попадания значения угла в указанный лимит вместо Flat шейдинга применяется Gouraud - берётся как правило среднее значение нормали от соседних граней в текущую вершину. Для своих моделей auto-smooth не применяю, всегда точно указываю Flat, либо Smooth, как говорится третьего не дано
Немного не то. Это частный случай для DirectX X формата, замута МелкоМягкой корпорации и вообще отдельный разговор
Для перевода можно/нужно использовать axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z') из bpy_extras, которая возвращает матрицу перевода из одной системы в другую (не касается текстурных координат)
Илья Циликов сказал(а):
Как я посмотрел, стандартный script для выгрузки в DirectX (а своё приложение использует DirectX для отрисовки) вычитает из единицы Blender'овские текстурные координаты
Для перевода можно/нужно использовать axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z') из bpy_extras, которая возвращает матрицу перевода из одной системы в другую (не касается текстурных координат)