Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
2-1140626927
Дева
2006-02-22 19:48
2006.03.12
перехват нажатия клавиши в консольном приложении


1-1139351046
Ани
2006-02-08 01:24
2006.03.12
Как динамически создавать анимированные курсоры из своих картинок


15-1139824556
Гарри Поттер
2006-02-13 12:55
2006.03.12
VPN+Outlook+Exchange


15-1140379731
TUser
2006-02-19 23:08
2006.03.12
Ночной дозор использует Рамблер ...


15-1139844184
Yeg
2006-02-13 18:23
2006.03.12
algolist.manual.ru, только по Pascal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский