Skocz do zawartości

Eksport sekwencji .obj


Rekomendowane odpowiedzi

Napisano

Witam; mam problem z eksportem cząstek/obiektów generowanych z ruchomego, deformowanego Plane'a (przesuwający się emiter wypluwający sfery). Jak przenieść taką symulację do Maxa? Próbowałem Particles Instance, opcji export animation dla .obj ale nic nie działa. Może napisanie skryptu, który co klatka convertowałby cząstki na obiekty i zapisywał jako .obj, nie byłby zbyt skomplikowanym zadaniem? Dodam, że muszę przeprowadzić taka operację dla około 300 klatek dość ciężkiego mesha.

  • Odpowiedzi 9
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano

takie cos da rade ?

import bpy

firstFrame = 0
lastFrame = 10
exportName = "frame"
dirPath = "d:\\"
extension = ".obj"

def exportSelected(fileName):
   bpy.ops.export_scene.obj(
       filepath=dirPath + fileName + extension,
       use_selection=True 
       )

active = bpy.context.active_object
for frameNumber in range(firstFrame,lastFrame+1):
   bpy.context.scene.frame_current = frameNumber
   bpy.ops.object.duplicates_make_real()
   exportSelected(exportName+str(frameNumber))
   active.select = False # change this line with export line above to export without emiter
   bpy.ops.object.delete(use_global=False)
   active.select = True    

Napisano (edytowane)

Szczuro, działa prawie idealnie! Wielkie dzięki za czas i pomoc!

 

Mam tylko 2 problemy związane z tym skryptem; czy jest możliwość, aby nie był eksportowany obiekt emitujący cząstki (nie wiem, na przykład mogę dać mu modyfikator MASK i byłoby fajnie, gdyby był zaapplykowany po eksporcie)? I czy ustawienia eksportu .obj mogłyby być (te domyślne) zmienione na: Objects as Obj Groups (domyślnie - objects) i aktywne Keep vertex order? Wszystko działa IDEALNIE, ale po imporcie do maxa pojawiają się dodatkowe cząstki obok generowanych, które psują efekt (po imporcie do Blendera ich nie ma więc jest to kwestia importera maxa). Byłbym wdzięczny!

Edytowane przez mookie
Napisano (edytowane)

masz tu wszystkie opcje exportera obj ;) mam nadzieje ze wlaczyłem wlasciwe jesli nie przełacz sobie sam. Mam jeszcze problem z nieexportowaniem emitera to co myslalem ze zadziala wywala exporter

def exportSelected(fileName):
   bpy.ops.export_scene.obj(
       filepath=dirPath + fileName + extension,
       use_selection=True, 
       group_by_object=True, 
       keep_vertex_order=True, 

       # other default
       check_existing=True, 
       axis_forward='-Z', 
       axis_up='Y', 
       filter_glob="*.obj;*.mtl", 
       use_animation=False, 
       use_mesh_modifiers=True, 
       use_edges=True, 
       use_smooth_groups=False, 
       use_smooth_groups_bitflags=False, 
       use_normals=True, 
       use_uvs=True, 
       use_materials=True, 
       use_triangles=False, 
       use_nurbs=False, 
       use_vertex_groups=False, 
       use_blen_objects=True, 
       group_by_material=False, 
       global_scale=1, 
       path_mode='AUTO')     

 

edit://

ok cały kod,

wywala sie jak po odznaczeniu emitera nie ma co exportowac (nie ma żadnych particli) i nie wiem jak to obejść

import bpy

firstFrame = 1
lastFrame = 10
exportName = "frame"
dirPath = "d:\\"
extension = ".obj"


def exportSelected(fileName):
   bpy.ops.export_scene.obj(
       filepath=dirPath + fileName + extension,
       use_selection=True, 
       group_by_object=True, 
       keep_vertex_order=True, 


       # other default
       check_existing=True, 
       axis_forward='-Z', 
       axis_up='Y', 
       filter_glob="*.obj;*.mtl", 
       use_animation=False, 
       use_mesh_modifiers=True, 
       use_edges=True, 
       use_smooth_groups=False, 
       use_smooth_groups_bitflags=False, 
       use_normals=True, 
       use_uvs=True, 
       use_materials=True, 
       use_triangles=False, 
       use_nurbs=False, 
       use_vertex_groups=False, 
       use_blen_objects=True, 
       group_by_material=False, 
       global_scale=1, 
       path_mode='AUTO')        

active = bpy.context.active_object
for frameNumber in range(firstFrame, lastFrame + 1):
   bpy.context.scene.frame_current = frameNumber
   bpy.ops.object.duplicates_make_real()
   bpy.context.scene.update()


   active.select = False 
   exportSelected(exportName+str(frameNumber))
   bpy.ops.object.delete(use_global=False)
   active.select = True

Edytowane przez szczuro
Napisano (edytowane)

Dzięki szczuro! Jesteś niewiarygodnie pomocny!

 

Jednak w dalczym ciągu co kilka klatek, a nawet i przez kilkanaście, pojawiają się zbędne cząstki, bądź wszystkie znikają kosztem innej; czy można by dodać gdzieś linijkę, żeby cząstki łączyć do jednego obiektu? Joinować je w całość? Może wtedy uniknę tego paskudnego buga?

 

PS Niestety to jest feler generowany przez Blendera, bo on sam importuje dodatkowe zbędne cząsteczki

Edytowane przez mookie
Napisano
import bpy

firstFrame = 1
lastFrame = 10
exportName = "frame"
dirPath = "d:\\"
extension = ".obj"

def exportSelected(fileName):
   bpy.ops.export_scene.obj(
       filepath=dirPath + fileName + extension,
       use_selection=True, 
       #group_by_object=True, 
       #keep_vertex_order=True, 

       # other default
       check_existing=True, 
       axis_forward='-Z', 
       axis_up='Y', 
       filter_glob="*.obj;*.mtl", 
       use_animation=False, 
       use_mesh_modifiers=True, 
       use_edges=True, 
       use_smooth_groups=False, 
       use_smooth_groups_bitflags=False, 
       use_normals=True, 
       use_uvs=True, 
       use_materials=True, 
       use_triangles=False, 
       use_nurbs=False, 
       use_vertex_groups=False, 
       use_blen_objects=True, 
       group_by_material=False, 
       global_scale=1, 
       path_mode='AUTO')        

def createTempEmpty():
   me = bpy.data.meshes.new("mesh")
   ob = bpy.data.objects.new("obj", me)
   scn = bpy.context.scene
   scn.objects.link(ob)
   scn.objects.active = ob
   ob.select = True

active = bpy.context.active_object
for frameNumber in range(firstFrame, lastFrame + 1):
   bpy.context.scene.frame_current = frameNumber
   bpy.ops.object.duplicates_make_real()
   bpy.context.scene.update()
   active.select = False 
   createTempEmpty()
   bpy.ops.object.join()

   exportSelected(exportName+str(frameNumber))
   bpy.ops.object.delete(use_global=False)
   active.select = True
   bpy.context.scene.objects.active = active

Napisano

Szczuro, jesteś genialny, ale jeszcze tylko jeden detal, o ile wystarczy Ci cierpliwości.

 

Rzuć okiem na link, jest super, ale np. po użyciu tego skryptu na moim emiterze np. w 12 klatce i kolejnych pojawia się sześcian daleko poza emiterem i w kolejnych się zbliża, zupełnie, jakby do Makes Duplicate Real dodawany był jakiś dodatkowy obiekt, niewidoczny na scenie w czasie symulacji, ale generujący się w czasie applykowania Particles (tudzież ich konwertowania na Meshe). Skąd to ustrojstwo się bierze? Myślałem, że to kwestia łączenia tych cząstek, ale to musi być duplikowana chyba jakaś dodatkowa, zbędna geometria (jak gdyby Cube będący tylko wskazaniem do wykorzystywania w systemie cząstek)...

 

http://speedy.sh/C4XRg/test-particles.zip

Napisano (edytowane)

Działa! Szczuro, dzięki wielkie za pomoc, z Twoim skryptem pomógł mi blenderowiec z pracy, Andrzej, za co z tego miejsca chylę przed nim czoła. Przed Wami obydwoma! Poprawny skrypt wygląda tak:

 

import bpy

 

 

firstFrame = 1

lastFrame = 100

 

exportName = "frame"

dirPath = "d:\\test\"

extension = ".obj"

 

active = bpy.context.active_object

 

def exportSelected(fileName):

bpy.ops.export_scene.obj(

filepath=dirPath + fileName + extension,

use_selection=True,

#group_by_object=True,

keep_vertex_order=True,

 

# other default

check_existing=True,

axis_forward='-Z',

axis_up='Y',

filter_glob="*.obj;*.mtl",

use_animation=False,

use_mesh_modifiers=True,

use_edges=True,

use_smooth_groups=False,

use_smooth_groups_bitflags=False,

use_normals=True,

use_uvs=True,

use_materials=True,

use_triangles=False,

use_nurbs=False,

use_vertex_groups=False,

use_blen_objects=True,

group_by_material=False,

global_scale=1,

path_mode='AUTO')

 

 

def createTempEmpty():

me = bpy.data.meshes.new("mesh")

ob = bpy.data.objects.new("obj", me)

scn = bpy.context.scene

scn.objects.link(ob)

scn.objects.active = ob

ob.select = True

 

active = bpy.context.active_object

 

 

frameNumber = firstFrame

 

for frameNumber in range(firstFrame, lastFrame+1):

bpy.context.scene.frame_set(frameNumber)

bpy.context.scene.update()

bpy.ops.object.duplicates_make_real()

active.select = False

createTempEmpty()

bpy.ops.object.join()

exportSelected(exportName+str(frameNumber))

print ("%d" % frameNumber )

bpy.ops.object.delete(use_global=False)

frameNumber += 1

active.select = True

Edytowane przez mookie
Napisano (edytowane)

super ze udało sie dojść bo ja wlasnie nie mogłem znaleźć sposobu na obejscie ;)

edit: ok teraz czaje to miało być bpy.context.scene.frameSet(frame) a nie bpy.context.scene.frame_current = frame

Edytowane przez szczuro

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności