Script en 3dsmax

He estado pensando un poco y una de las cosas nuevas que no había pensado es que el sistema de partículas debe estar enlazado al objeto que sangra, por el tema de que se pueda mover. Imagino que tendré que enlazarlo al polígono más cercano, manteniendo la normal como dirección de sangrado.

Si el objeto no sufre deformaciones (modificador skin, bend, etc) debería bastar con emparentar el sistema de partículas con el objeto con el que colisionó):

Código:

particle flowobject, parent = targetobject

.

Si hay deformaciones, la cosa sería más complicada.

Otro de los problemas más gordos que tengo ahora mismo es que no sé cómo hacer para leer un input escrito por el usuario (¿eso se llama parsing?

Me imagino que te refieres a presentar al usuario un cuadro de diálogo donde introduzca información.

En ese caso, hace un tiempo cree un diálogo de ese tipo y lo encapsulé en una estructura:

Código:

structure inputdialog (ttext = undefined tdlgvalue = undefined tdlgtitle = input tdlgmessage = enter value: tfn show message title:input = t(t if title.= undefined do dlgtitle = title if message.= undefined do dlgmessage = message ut roinputdlg dlgtitle width:264 height:83 (t local okpressed = false label lblmessage enter value: pos:[8,8] width:252 height:16 edittext txtinput pos:[4,24] width:255 height:17 button btnok ok pos:[104,51] width:70 height:20 button btncancel cancel pos:[184,51] width:70 height:20 t on roinputdlg open do (t lblmessage, text = dlgmessage ) on roinputdlg close do (t if not okpressed do dlgvalue = #cancel ) on btnok pressed do (t if txtinput, text.= do (t dlgvalue = #ok okpressed = true text = txtinput, text destroydialog roinputdlg ) ) on btncancel pressed do (t dlgvalue = #cancel okpressed = false destroydialog roinputdlg ) ) createdialog roinputdlg modal:true t return dlgvalue t).
)

.

Y luego para usarlo sería:

Código:

input = inputdialog(). If (input, show your name:) == #ok do tmessagebox (your name is = + input, text)

.

Por otra parte, si además quieres permitir al usuario que introduzca expresiones, lo que tendrás que hacer es utilizar la función execute:

Código:

input = inputdialog(). If (input, show enter value:) == #ok do tmessagebox (value = + (execute input, text))

.

Así, si el usuario introduce la expresión 3*2, execute devolverá 6.

Y sobre todo hacer control de errores.

Pues aparte de los if/then/else, también suelo utilizar try/catch (es como en C++) para bloques de código que pueden petar a mitad de ejecución (errores en tiempo de ejecución) y no habría forma de saberlo de otra forma. Por ejemplo:

Código:

try (deleete $point01) catch (print ese objeto no existe\n)

.

Aunque este caso en concreto se podría solucionar con un if:

Código:

if $point01 == undefined do print ese objeto no existe\n

.

Busca en la referencia de Maxscript por try expression. Ahí también encontraras la función throw que te permite generar tus propios errores en tiempo de ejecución. Saludos.