Jump to content

Featured Replies

Posted

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.

  • Replies 9
  • Views 3.2k
  • Created
  • Last Reply

Top Posters In This Topic

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    

  • Author

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!

Edited by mookie

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

Edited by szczuro

  • Author

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

Edited by mookie

nie mam teraz czasu na testy, jak nie zadziała coś wieczorem podrzuce:

spróbuj wstawić

bpy.ops.object.join()

pod linijka

active.select = False 

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

  • Author

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

  • Author

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

Edited by mookie

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

Edited by szczuro

Create an account or sign in to comment

Important Information

We are using cookies. Read about our Privacy Policy