Форум: "Игры";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Внизэкспорт анимации из Blender a Найти похожие ветки
← →
Ищущий © (2005-09-07 08:46) [0]Собственно по сабжу.
На мой взгляд - один из лучших free редакторов. Но по вопросу экспорта именно анимации мне найти нечего не удалось.
← →
П7 (2005-09-07 14:03) [1]А есть доки на русско по моделингу в Блендере?
← →
Frost (Freak) (2005-09-07 14:32) [2]2 Ищущий:
Согласен, в Туксе использую только его. Теперь по-поводу сабжа: ты не заметил пункт Motion Capture?
← →
Magikan © (2005-09-07 15:26) [3]Ищущий © (07.09.05 08:46)
У меня на работе скрипт есть (мною написан на pythone) по экспортированию геометрии и анимации объектов из Blender. Завтра закину. Будет желание - поразбираешься
П7 (07.09.05 14:03) [1]
Раньше портал русский был по блендеру, где была русская документация. Сейчас он накрылся. Но я и по английской без труда за пару дней освоился.
ИМХО самый удобный 3Д-редактор.
← →
Magikan © (2005-09-08 04:36) [4]Ищущий © (07.09.05 08:46)
Мэйл твой не увидил, поэтому постю скрипт сюда. Разбирайся, если не влом. Писал экспортер под себя, поэтому код неоптимизирован. Структура выходного файла до ужаса простая. В Дельфи считывается без проблем (под неё и делал ;) )
#!BPY
"""
Name: "Skeletal animation model (.sam)"
Blender: 236
Group: "Export"
Tooltip: "Export selected mesh to Skeletal animation model(.sam)"
"""
__author__ = "Michael Korsakov (Magikan)"
#__url__ = ("blender", "elysiun",
#"Author"s homepage, http://www.redrival.com/scorpius")
__version__ = "0.1"
__bpydoc__ = """\
This script exports meshes to Skeletal animation model file format.
"""
# $Id: raw_export.py,v 1.6 2004/11/30 02:27:46 ianwill Exp $
#
# +---------------------------------------------------------+
# | Copyright (c) 2002 Anthony D"Agostino |
# | http://www.redrival.com/scorpius |
# | scorpius@netzero.com |
# | April 28, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Read and write RAW Triangle File Format (*.raw) |
# +---------------------------------------------------------+
import Blender
import sys
from Blender import Mathutils
from Blender.Mathutils import *
objects = []
#vertices = []
#faces = []
# Vertices info
verticesCoord = []
verticesNormal = []
verticesInf = []
# Faces info
facesIndeces = []
facesNormal = []
facesUV = []
# Bones info
bones = []
bonesNames = []
# =================================
# === Recalculate Object Mesh =====
# =================================
def RecalcMesh(ObjectName):
global verticesCoord
global verticesNormal
global facesIndeces
global facesNormal
global facesUV
global verticesInf
verticesCount = len(verticesCoord)
#facesCount = len(faces)
n = verticesCount
#m = facesCount
MeshObject = Blender.Object.Get(ObjectName)
LocX, LocY, LocZ = MeshObject.loc[0], MeshObject.loc[1], MeshObject.loc[2]
Mesh = Blender.NMesh.GetRaw(MeshObject.data.name)
for vertex in Mesh.verts:
verticesCoord.append([vertex.co.x + LocX, vertex.co.y + LocY, vertex.co.z + LocZ])
verticesNormal.append([vertex.no.x, vertex.no.y, vertex.no.z])
inf = Mesh.getVertexInfluences(vertex.index)
verticesInf.append(inf)
for face in Mesh.faces:
i1 = face.v[0].index + verticesCount
i2 = face.v[1].index + verticesCount
i3 = face.v[2].index + verticesCount
facesIndeces.append([i1, i2, i3])
if face.smooth:
facesNormal.append([0, 0, 0])
else:
facesNormal.append(face.normal)
if len(face.uv):
UV1 = face.uv[0]
UV2 = face.uv[1]
UV3 = face.uv[2]
else:
UV1 = [0, 0]
UV2 = [0, 0]
UV3 = [0, 0]
facesUV.append([UV1, UV2, UV3])
if len(face.v)==4:
i4 = face.v[3].index + verticesCount
facesIndeces.append([i3, i4, i1])
if face.smooth:
facesNormal.append([0, 0, 0])
else:
facesNormal.append(face.normal)
if len(face.uv):
UV4 = face.uv[3]
else:
UV4 = [0, 0]
facesUV.append([UV3, UV4, UV1])
# =================================
# ==== Write Mesh data in file ====
# =================================
def writemesh():
global verticesCoord
global verticesNormal
global facesIndeces
global facesUV
print "# ==== Mesh Information ==="
print "#"
print "# ===== Vertices List ====="
print ""
print "# Vertices count"
print ""
print len(verticesCoord)
print ""
print "# Vertices info"
print "# --- vertex coords"
print "# --- vertex normal"
print ""
for i in range(len(verticesCoord)):
print "%f %f %f" % tuple(verticesCoord[i])
print "%f %f %f" % tuple(verticesNormal[i])
print ""
print "#"
print "# ====== Facess List ====="
print ""
print "# Faces count"
print ""
print len(facesIndeces)
print ""
print "# Faces info"
print "# --- vertices indeces"
print "# --- face normal"
print "# --- list of 3 vertices UV coords"
print ""
for i in range(len(facesIndeces)):
print "%i %i %i" % tuple(facesIndeces[i])
print "%f %f %f" % tuple(facesNormal[i])
for j in range(3):
print "%f %f" % tuple(facesUV[i][j])
print ""
# =================================
# === Write Bones data in file ====
# =================================
def writebones():
print "# === Bones Information ==="
print ""
print "# Bones count"
print ""
print len(bones)
print ""
if len(bones)==0: return
print "# Bones info"
print "# --- Bone name"
print "# --- Parent bone name"
print "# --- 4x4 Rest matrix"
print "# --- Head coords"
print "# --- Tail coords"
print "# --- Quaternion"
print ""
for bone in bones:
print bone.name
if bone.parent == None:
print "None"
ParentMatrix = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1])
else:
print bone.parent.name
ParentMatrix = bone.parent.getRestMatrix()
#RestMatrix = bone.getRestMatrix("bonespace")
RestMatrix = bone.getRestMatrix()
ParentMatrix.invert()
RelativeMatrix = RestMatrix * ParentMatrix
#RelativeTrans = MatMultVec(ParentMatrix, RestTrans-ParentTrans)
for i in range(4):
#print "%f %f %f" % (RestMatrix[i][0], RestMatrix[i][1], RestMatrix[i][2])
print "%f %f %f" % (RelativeMatrix[i][0], RelativeMatrix[i][1], RelativeMatrix[i][2])
#print "%f %f %f %f" % tuple(RelativeMatrix[i])
print "%f %f %f" % tuple(bone.head)
print "%f %f %f" % tuple(bone.tail)
print "%f %f %f %f" % (bone.quat.x, bone.quat.y, bone.quat.z, bone.quat.w)
print ""
# =================================
# === Write Vertices Influences ===
# =================================
def writeinf():
global verticesInf
global bonesNames
print "# === Vertices Influences ==="
print "# List of next records:"
print "# --- Pairs count"
print "# --- List on pairs:"
print "# --- --- Bone index"
print "# --- --- weight"
print ""
for inf in verticesInf:
print len(inf)
s = 0.0
for n in inf:
#print n
s = s + n[1]
#print s
for pair in inf:
print "# %s" % pair[0]
#print pair
try:
print bonesNames.index(pair[0])
except:
pass
if pair[1]==0:
print 0
else:
print 1/s*pair[1]
#print pair[1]
print ""
← →
Magikan © (2005-09-08 04:40) [5]Продолжение скрипта (учти, что в pythone по синтаксису в начале каждой строки вместо пробелов табуляция, просто здесь на форуме она не сработала). Если дашь мэйл, вышлю в том виде, в котором должно быть.
# =================================
# ======= Write Actions data ======
# =================================
def writeactions():
global bonesNames
print "# === Sceletal Animation ==="
print ""
print "# Actions Count"
print ""
actions = Blender.Armature.NLA.GetActions()
print len(actions)
print ""
print "# Actions List"
print ""
for actionName in actions:
print actionName
action = actions[actionName]
channels = action.getAllChannelIpos()
print len(channels)
for channel in channels:
print bonesNames.index(channel)
ipo = channels[channel]
curve = ipo.getCurve("QuatX")
points = curve.getPoints()
print len(points)
for point in points:
print "%f %f" % tuple(point.pt)
curve = ipo.getCurve("QuatY")
points = curve.getPoints()
print len(points)
for point in points:
print "%f %f" % tuple(point.pt)
curve = ipo.getCurve("QuatZ")
points = curve.getPoints()
print len(points)
for point in points:
print "%f %f" % tuple(point.pt)
curve = ipo.getCurve("QuatW")
points = curve.getPoints()
print len(points)
for point in points:
print "%f %f" % tuple(point.pt)
print ""
# =================================
# === Write SAM Triangle Format ===
# =================================
def write(filename):
curobjects = Blender.Object.GetSelected()
if len(curobjects) > 1:
print "There is must be one selected object!"
return
if curobjects[0].getType() != "Armature":
print "Selected object type must be as Armature!"
return
Armature = Blender.Armature.Get(curobjects[0].name)
ArmatureName = Armature.name
global bones
global bonesNames
bones = Armature.getBones()
for bone in bones:
bonesNames.append(bone.name)
print bone
print bonesNames
AllObjects = Blender.Object.Get()
for object in AllObjects:
if object.parent == None: continue
if object.parent.name != ArmatureName: continue
if object.getType() != "Mesh": continue
RecalcMesh(object.name)
objects.append(object)
if len(objects)==0:
print "There is not objects assigned with armature"
return
file = open(filename, "wb")
std=sys.stdout
sys.stdout=file
writemesh()
print "# === Armature ==="
print ""
print "# Armature Location"
print ""
print "%f %f %f" % tuple(curobjects[0].loc)
print ""
writebones()
writeinf()
writeactions()
sys.stdout = std
file.close()
print "OK"
return
def fs_callback(filename):
if filename.find(".sam", -4) <= 0: filename += ".sam"
write(filename)
Blender.Window.FileSelector(fs_callback, "Export SAM")
← →
Ищущий © (2005-09-08 08:37) [6]to П7 : есть, посмотри на сайте http://www.is.svitonline.com/sailor (~30 мег)
но на английском информмация свежее
to Magikan - большое спасибо (как я понял даже с костями!!!)
mail: verhovetc@bk.ru
← →
Magikan © (2005-09-08 11:41) [7]С костями и со скелетной анимацией (если ты с кватернионами знаком).
Только сейчас заметил: копирайт остался с шаблонного скрипта raw_export.py
← →
Coriolis (2005-09-08 15:39) [8]А этот блэндэр умеет грузить анимированные объекты из 3DSMax/Maya?
← →
Ищущий © (2005-09-08 15:57) [9]2 Coriolis : В смысле?
Плагинов импорта очень много, точно знаю, что поддерживается импорт с анимацией из *.md2. Давно встречал плагин для 3ds еще до 2-ой версии Blender"a там анимацию можно было грузить, но требовалось указать некоторые параметры кол-фо фреймов и т.д. К сожалению он не сохранился.
← →
Coriolis (2005-09-08 22:57) [10]Эээ. В смысле создал я в Максе модель, вставил скелет, сделал анимацию.
И тут решил перейти на блэндер. Я смогу из него загрузить этот объект без потери скелета и анимации? (в идеале, наверно, чтобы он понимал формат *.max, но это было-бы слишком круто наверно ;))
← →
Magikan © (2005-09-09 02:57) [11]Coriolis (08.09.05 22:57) [10]
Анимация из Макса даже в Майю и в Лайтвэйв нормально не переносится (только в каких-то редких случаях).
← →
Ищущий © (2005-09-09 14:38) [12]2 Magikan
Возникла загвоздка в использовании скрипта : при экспорте арматуры модели сделанной в MakeHuman 180b вылетает ошибка скрипта, хотя в консольном окне сообщений об ошибке нет (последняя запись - массив характеристик персонажа (размер ушей и т.д. :) ) после объявления костей арматуры). Файл создается, но неполный.
← →
Magikan © (2005-09-10 14:12) [13]Закинь мне файлик на мэйл. Посмотрю в чем прикол ;)
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c