Render.ru

Вопросы/ответы

Ramina

Активный участник
Рейтинг
5
как uv развертку из Blender превратить в картинку, для редактирования в 2D программе?
 

Ramina

Активный участник
Рейтинг
5
подскажите, как настроить камеру? я переделываю в ее в ортографическую, но искажения все равно видны, во вьюпорте объект выглядит не так как после рендеринга.
 

Malefic

Мастер
Рейтинг
117
Ramina, не совсем ясен вопрос. У вас выставлена камера? Вы смотрите с нее? И после рендера не тот ракурс?
 

Maret

Журналист RENDER.RU
Рейтинг
909
Возникла вот такая проблема при моделировании персонажа. Как избавиться от треугольного разреза по середине? При чём, если отключить сглаживание то всё выглядит в полном порядке.


Кто знает как решить? Пробовал добавлять луп на край- проблема вроде как исчезает, но получаются сдвоенные вертексы.
 

Malefic

Мастер
Рейтинг
117
У вас не соединены две вершины. Те, которые внизу посередине платья. Подвигайте и увидите, что вторая стоит на месте. Если же у вас миррор - просто аккуратно двигайте, пока автоматом не соединятся вершины - они видать, у вас оносительно центра миррора съехали.
 

Илья Циликов

Пользователь сайта
Рейтинг
2
Насколько я понимаю, анимация содержится в actions. Задача стоит экспортировать анимацию сцены в своё приложение. Но в каждом actions я нашёл только fcurves со свойствами data_path из всего, что указывает, какое свойство анимируется. Главная проблема, что data_path содержит названия вроде location даже без указания, по какой координате. А лучше б получать даже не location по координатам, а всю матрицу 4 на 4 в момент каждого кадра. Вот это никак не могу найти, как сделать. Всё что сумел написать:
Код:
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>
Хотелось б хоть как-то определить, что это location.x, а лучше выгрузить сразу матрицу. Подскажите, пожалуйста, как такие улучшения возможно сделать.
 

logosman

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

Илья Циликов

Пользователь сайта
Рейтинг
2
А как сделать переход на заданный кадр так, чтоб можно было в script'е получить матрицу именно для этого кадра? А то я вчера полдня искал, да не нашёл.
 

logosman

Модератор форума
Команда форума
Рейтинг
316
Кадр устанавливается так:
Код:
bpy.data.scenes['Scene'].frame_set(N)
N - номер кадра
 

Илья Циликов

Пользователь сайта
Рейтинг
2
Есть проблема с получением текстурных координат через script. Находил где-то пример, что для режима Generated (в script значение 'ORCO') можно выгрузить так:
Код:
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)
Но при отрисовке в своём приложении реально получается, что изображение просто ровно ложится на каждую прямоугольную грань, но не сходится с картинкой в Blender'е не только для режима Generated, но и ни для одного другого режима. Причём выгружаются в этом случае именно такие текстурные координаты:
Код:
<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'е.

Подскажите, пожалуйста, как получить те текстурные координаты, которые реально использует Blender.
 

Вложения

logosman

Модератор форума
Команда форума
Рейтинг
316
Не скажу по поводу Generated, не экспериментировал, делаю для UV, проблем не возникало.
Не забываете ли трансформировать оси координат/нормалей из Blender в вашу систему?
 

Илья Циликов

Пользователь сайта
Рейтинг
2
Не скажу по поводу Generated, не экспериментировал, делаю для UV, проблем не возникало.
Не забываете ли трансформировать оси координат/нормалей из Blender в вашу систему?
Кстати, на счёт преобразований очень точно замечено! Как я посмотрел, стандартный script для выгрузки в DirectX (а своё приложение использует DirectX для отрисовки) вычитает из единицы Blender'овские текстурные координаты, я уже чуть позже это приписал, и вроде сходится для режима UV. Не знаю точно, всегда ли это будет совпадать, в документации я однозначного ответа на этот вопрос не нашёл.
 

Илья Циликов

Пользователь сайта
Рейтинг
2
Ещё один непонятный момент с Blender'ом - по поводу выравнивания поверхностей. Есть режим auto-smooth и задаётся угол, но до меня никак не доходит, что он при этом делает. Т. е. по какому признаку он, скажем, для цилиндра определяет, что боковые грани нужно выравнивать, а переход на верхнюю грань резкий. Я нашёл только векторы нормалей для вершин и граней, но непонятно, по какому принципу он их использует для auto-smooth и что задаёт угол.
 

logosman

Модератор форума
Команда форума
Рейтинг
316
Это просто угол между нормалями соседних полигонов, т.е. в случае попадания значения угла в указанный лимит вместо Flat шейдинга применяется Gouraud - берётся как правило среднее значение нормали от соседних граней в текущую вершину. Для своих моделей auto-smooth не применяю, всегда точно указываю Flat, либо Smooth, как говорится третьего не дано :)

Илья Циликов сказал(а):
Как я посмотрел, стандартный script для выгрузки в DirectX (а своё приложение использует DirectX для отрисовки) вычитает из единицы Blender'овские текстурные координаты
Немного не то. Это частный случай для DirectX X формата, замута МелкоМягкой корпорации и вообще отдельный разговор :)

Для перевода можно/нужно использовать axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z') из bpy_extras, которая возвращает матрицу перевода из одной системы в другую (не касается текстурных координат)
 
Сверху