Transcripciones
1. Trailer: Oye, échale un vistazo a esto. Toda esta simulación se realizó con solo usar nodos de
geometría. Y si solo sabes
un poco sobre nodos, sabes lo desafiante que puede ser
crear tal cosa. El caso es que entender los nodos es duro y frustrante. Pero si no lo haces, te
perderás un aspecto crucial de la licuadora que te abrirá un nuevo mundo de
posibilidades. Probablemente también
hayas visto algunos de esos locos crees de nodo
y te has preguntado, ¿cómo siquiera
empiezas a hacer esto? ¿Cómo lo sé?
Porque yo estaba ahí. Sufrí por encontrar muchas
respuestas a mis preguntas. Al hacer este curso, estoy apuntando a que el proceso
de aprendizaje de simulaciones en nodos de geometría sea más fácil
y divertido para ti A lo largo de este curso,
no solo aprenderás a crear una
simulación de física en blender. Literalmente construirás tus propios motores de física
dentro de nodos de geometría. Aprenderás sobre las fuerzas de
la vida real que hacen que nuestro mundo
funcione de la manera que es. Aprenderás sobre la velocidad. Aprenderás sobre la
aceleración, colisión, gravedad y cómo todas estas fuerzas interactúan entre
sí. Y más. Y aprenderás
todo eso
creando la simulación de
bolas que caen. Sé lo que algunos de ustedes
podrían estar pensando ahora mismo. Oye, Yassine, ¿por qué me molestaría crear una simulación de
bolas que caen Quiero aprender a crear
las cosas buenas como explosiones o aprender
lo que hace cada nodo Créeme, ese
sería un enfoque terrible. Tan simple como caer bolas
puede parecer un concepto. Te sorprenderá
la gran cantidad de conceptos que aprenderás con
solo crear la simulación. ¿Cuál lo convierte en el ejercicio
perfecto? Ser bueno en simulaciones
es ser bueno en física. Y este curso
cerrará la brecha entre ambos y te abrirá
esa puerta. Entonces, si te
interesa aprender simulaciones usando
nodos de geometría en blender, este curso es para
ti, y no puedo esperar a verte del
otro lado. Por favor.
2. Zonas de repetición: Zonas de repetición. En las versiones
recientes de Blender, se
introdujo
un nuevo concepto, repitiendo zonas. Este es el cubo predeterminado, bérrelo porque tienes que hacerlo, y voy a agregar una esfera. Si abro el editor de nodos de
geometría, creo un nuevo árbol, y
llamémoslo , por
ejemplo, simulación. Si vas a agregar der utilities, tendrás una opción
para repetir zonas. Como puedes ver, tendrán estos dos nodos con
esta caja alrededor de ellos. Las zonas de repetición son una
forma de decirle a Blender que repita ciertas operaciones
varias veces. Por ejemplo, Lo que viene de
esta entrada grupal es mi geometría original,
que es la esfera. También tengo mi salida de grupo, que es la geometría que
voy a tener al final. Voy a tapar la
zona repetitiva entre ellos así. También voy a agregar otro
nodo llamado set position, que me permitirá cambiar
la posición de un objeto. Desplazar A, establecer posición, y voy a enchufarlo
en la zona de repetición. Digamos que voy a mover la esfera 1 metro sobre el eje x, y eso es exactamente lo que
tendré si escribo una aquí. Ahora, digamos que quiero repetir
esta operación diez veces. Por supuesto, puede ser tan
fácil como escribir diez aquí, pero imagina si tienes
un árbol de nodos más grande. En esa situación,
necesitarás
multiplicar cada valor por diez, lo que puede ser una molestia. Es por eso que en el primer
nodo de la zona de repetición, tienes este número
etiquetado iteraciones, lo que representa
cuántas veces quieres blender para calcular lo que hay
dentro de la zona de repetición Si escribo diez aquí, licuadora ejecutará
lo que hay dentro de esta zona repetitiva diez veces. Entonces, si fuéramos a resumir
lo que son las zonas de
repetición, las zonas de repetición son una
forma de decirle a blender que repita ciertas operaciones
un cierto número de veces. Es así de simple. Ahora bien, ¿qué
pasa con las zonas de simulación?
3. Zonas de simulación: Zonas de simulación. Las zonas de simulación tienen
un concepto similar a las zonas de repetición. Hay una manera de ejecutar ciertas operaciones
varias veces. La única diferencia entre las zonas de
simulación y las zonas de repetición es que
en las zonas de repetición, especifica
cuántas veces desea que blender compile esas
diferentes operaciones. tanto, en las zonas de
simulación, Blender compilará todas las
operaciones en cada fotograma. Si voy a agregar simulación, tendré zona de simulación. Como puedes ver, es bastante
similar a la zona de repetición, excepto que no
tiene el valor de iteración Tiene tiempo de dilta en su lugar. Ahora bien, si duplico
la misma operación de posición establecida dentro de
la zona de simulación, enchufar la entrada de grupo a
la entrada de simulación y la salida de simulación en la salida de grupo para
ver el resultado final, nada sucederá al principio. Pero si abro la
línea de tiempo y golpeo play, verás que la esfera se mueve. Ahora, Blender está ejecutando las operaciones dentro las zonas de simulación
en cada fotograma. En el marco uno, la licuadora
moverá la esfera 1 metro, y en el cuadro diez, moverá la esfera 10 metros.
Es así de simple. Ahora es importante
señalar que blender no está ejecutando la simulación diez
veces cuando está en el fotograma diez. Eso va a necesitar
muchos recursos informáticos. Es más como si Blender estuviera
acumulando los resultados con
cada fotograma que pasa Por ejemplo, en el fotograma uno, Blender moverá el cubo 1 metro ejecutando
la simulación una vez. En el cuadro dos, Blender
moverá el cubo también 1 metro en base a
la posición anterior. Blender ejecuta la
simulación solo una vez, y la posición inicial de la simulación es el resultado
del fotograma anterior. Espero que eso tenga sentido. En resumen, puede pensar en las zonas
de simulación como una zona de repetición donde el número de iteraciones
cambia en cada fotograma De hecho, si agrego un
nodo llamado tiempo de escena, este socket de fotogramas
me dará el número
del frame am on. En el cuadro uno,
dará salida a uno, y en el cuadro 37, dará salida a 37. Si vuelvo a la zona de
repetición y conecto el marco
a las iteraciones, eso significa que el número de iteraciones seguirá al
número del fotograma en el que estoy encendido Si le pego play, obtendré el mismo resultado que
la zona de simulación. Se puede pensar en las zonas de
simulación como una zona de repetición con el tiempo de escena conectado
a las iteraciones La diferencia ahora
debería ser clara entre repetición y las zonas
de simulación. Las zonas de repetición son una forma de
repetir ciertas operaciones manualmente especificando cuántas veces
quiso repetir. En tanto,
las zonas de simulación
lo harán automáticamente
en cada fotograma. Ahora, con todo
eso fuera del camino, ahora podemos empezar a
hablar de simulaciones
4. Qué es una simulación: ¿Qué es una simulación? Encontré esta buena definición
de lo que es una simulación. Una simulación es un método para imitar un
proceso del mundo real a lo largo del tiempo Evoluciona creando un modelo que representa
características clave, comportamientos y funciones
del proceso o sistema A modo de ejemplo, si tengo
una pelota y la hago caer, Una simulación será un programa que prediga
lo que sucederá. Voy a darle a ese programa ciertas entradas como
qué tan grande es la pelota, qué tan alta es desde el suelo, qué tan pesada es, qué tan fuerte es la gravedad
tirando de ella hacia abajo. Y en base a esos insumos, el programa intentará
predecir lo que sucederá. Entonces, si queremos crear una simulación
física en blender, necesitamos pensar en formas de
recrear la realidad en blender Eso significa que necesitamos pensar en las fuerzas de la vida real que
permiten que nuestro mundo
funcione como es. La clave para ello son dos fuerzas, la velocidad y la aceleración, y vamos a explicar
ambas. Ahora estamos empezando a
meternos en la parte divertida. En el siguiente video,
aprenderemos sobre la velocidad.
5. Qué es la velocidad: ¿Qué es la velocidad? Vlocity es
una cantidad de vector físico que describe la velocidad a que un objeto
cambia su posición En pocas palabras, la velocidad
es lo rápido que se mueve algo. Comúnmente nos referimos
a ella como velocidad. Lo que quiero que tengas
en cuenta es que no
podemos pensar en la velocidad sin considerar el factor del
tiempo porque la velocidad al final
del día depende la distancia recorrida dentro de
un cierto periodo de tiempo. No podemos decir que la velocidad
del auto sea de 100 kilómetros o 100 millas. Tenemos que especificar ¿por qué unidad
de tiempo estamos hablando? ¿Son 100 kilómetros/hora
por minuto por segundo? Hay una gran diferencia. En nuestra pequeña simulación, esta esfera se mueve a una
velocidad de 1 metro por cuadro, y esa es su velocidad, 1 metro por cuadro. O como mi velocidad de fotogramas es de 24, eso significa que la esfera se
moverá 24 metros/segundo Podemos decir que su velocidad
es de 24 metros/segundo,
o 14 40 metros/minuto, o 86,400 metros/hora Se te da la idea.
Entonces esa es la velocidad. Ahora tenemos que
hablar de aceleración.
6. Qué es la aceleración: ¿Qué es la aceleración? La velocidad es la tasa de cambio
en la posición a lo largo del tiempo? aceleración es la
tasa de cambio en velocidad o la velocidad a través del tiempo? Un automóvil está acelerando cuando
su velocidad va en aumento. La aceleración representa
los cambios en la velocidad. Igual que la velocidad, podemos
hablar de aceleración por sí sola sin considerar
el factor del tiempo. Podemos decir que este auto está acelerando a un
ritmo de 10 metros. Tenemos que especificar ¿por qué
unidad de tiempo estamos hablando? ¿Está acelerando a una velocidad de 10 metros/segundo por
minuto por hora? Esa es una gran diferencia. En el pequeño sistema
que construimos en Blender, la esfera se mueve a una
velocidad de 1 metro por cuadro, y esa es su velocidad. Pero no está acelerando
ni acelerando, lo que significa que la
aceleración es cero. En la vida real,
las velocidades de los objetos aumentan
y disminuyen con el tiempo debido a
diferentes fuerzas Entonces, ¿cómo podemos
programar esas cosas licuadora. Antes de
explicar cómo hacer eso, quiero cambiar un poco la
simulación. Voy a eliminar la entrada de
grupo y en su lugar, voy a agregar un nodo de punto. Es importante mencionar
que un punto en blender es solo un contenedor de datos que luego
podremos reemplazar
con otros objetos. Por eso lo estamos
usando
porque ofrece una enorme
flexibilidad más adelante. Voy a cambiar la
simulación para convertirme en una simulación de punto de caída
moviendo los 0.5
metros en el aire, así que esa sería mi posición
inicial. Como quiero que el
punto esté cayendo, necesito actualizar el nodo de posición
establecida. En lugar de movernos sobre el eje x, necesito decirle a blender que
vamos a estar moviéndonos sobre el eje z. Voy a restablecer el eje x a cero, y en el eje z, escribiré, por
ejemplo, 0.1 metro. Si le pego play, notarás
que la pelota se mueve hacia arriba no hacia abajo. Es
porque la licuadora está moviendo la pelota por 01 metros hacia arriba. Entonces, si quisiéramos moverlo hacia abajo, necesitamos
cambiarlo a -0.1 metros Ahora bien, si golpeo play,
notarás que la pelota está
cayendo lentamente hacia abajo. Ahora podemos empezar a
pensar en cómo implementar la aceleración
en nuestro sistema. Para entender lo
que vamos a hacer, necesitamos volver a la
definición de aceleración. La aceleración es el cambio
de velocidad de un objeto. Un objeto que cae
se irá acelerando, lo que significa que su
velocidad
aumentará gradualmente cuanto más tiempo
pase cayendo. En otras palabras,
necesitamos encontrar una manera
de decirle a blender, Hey, licuadora, queremos que aumentes la velocidad con
cada momento que pasa. Como en, por ejemplo,
en el fotograma uno, mueve este punto
01 metros hacia abajo. En el fotograma dos, mueve este punto
por cero 15 metros hacia abajo. Estará a menos
020 5 metros. En el fotograma tres, mueve este
punto por cero 2 metros hacia abajo. Será a -0.45 metros. La clave para conseguir aceleración, para hacer que la distancia
recorrida con cada fotograma sea cada vez
más grande. Piénsalo. Si la pelota se mueve a la
misma distancia en cada cuadro, tendrás una velocidad constante. Pero cuando acelera
o desacelera, eso significa que la
distancia que se cruza con cada fotograma es cada
vez más grande o menor Si la distancia es mayor, eso significa que se está acelerando, si la distancia es
cada vez más pequeña, significa que está acelerando. La solución para implementar aceleración en nuestro
sistema es encontrar una manera de decirle a blender que
aumente o disminuya
este valor con el tiempo. Para ello, hay un concepto importante que hay
que entender. Que son atributos. De eso vamos a estar
hablando en el próximo video.
7. Qué es un atributo: ¿Qué es un atributo?
Si revisas el manual de la licuadora para
lo que es un atributo, encontrarás la
siguiente definición. Un atributo es un término
genérico para describir los datos almacenados por elemento
en un bloque de datos de geometría. Así es como quiero
que lo pienses. Imagina una geometría de tres D. Esta geometría puede ser tan
simple como un punto como en nuestro ejemplo o cualquier
otro objeto tres D. Los atributos son datos adjuntos
a los tres objetos D que definen ciertas
características de ese objeto tres D.
Por ejemplo, si salto a mi espacio de trabajo de
nodos de geometría, y desde la hoja de cálculo, saltaré a punto porque la única geometría que tengo en
este momento es el punto Aquí podrás ver todos los diferentes atributos
asociados a esta geometría. En primer lugar,
tienes el índice. En este caso, es cero. Pero si aumento el
número de puntos, por ejemplo, a cinco, cada punto tendrá un índice. El número de índice
es un atributo. En el caso del índice, el atributo es el número que hace referencia al índice
de cada punto. También tiene el atributo
position que define la ubicación
de ese punto en particular. También tienes el
radio de ese punto. Ese es también otro atributo. Los atributos son como
una tarjeta de identificación que define las características
de un elemento en blender. Por eso la mejor manera
de pensar en los atributos, como dije, es que sean un bloque de datos unido al objeto tres D, que define ciertas
características de ese objeto tres D. Ahora bien, esos son los atributos que vienen por defecto
con el punto. Lo bueno es que Blender nos
permite crear
nuestros propios atributos. Si voy a agregar atributos, store named attribute,
tendré este nodo que voy a enchufar justo
después de la entrada de simulación. El nodo de
atributo llamado store me
permitirá crear
mis propios atributos. Puedo comenzar
especificando el tipo. En nuestro caso, la velocidad y
la aceleración son ambos vectores. Por eso voy a cambiar el tipo de datos de
float a vector. A continuación, voy a darle un nombre a
este atributo. Puedes llamarlo como sea
que tenga sentido para ti, pero para que todo esté claro, voy a llamarlo velocidad. Ahora bien, si vuelvo
a la hoja de cálculo, notarán
que ahora tenemos otro atributo
llamado velocidad Si selecciono el
atributo store named y pulso vacío silenciarlo, observe cómo esa propiedad
desaparecerá del editor de
hojas de cálculo Espero que al menos ahora tengas una idea de lo que es un atributo. Es un bloque de datos unido
a un objeto de tres D. Pero tal vez te estés preguntando, ¿cómo se supone
que esto es útil? Bueno, ahora que tenemos la velocidad
como atributo, podemos empezar a hacer un
montón de operaciones geniales con ella como cambiarla
con cada fotograma que pasa. Porque recuerden,
ese es nuestro objetivo hacer la velocidad aumente
o disminuya con el tiempo, lo que nos dará aceleración. En nuestro árbol de nodos actual, la velocidad es constante. Si pensamos en lo que
sucede en cada fotograma, blender cambiará la
posición de este punto por la cantidad especificada
del nodo de posición establecida. Además, como puedes ver, este socket offset es un vector, ya que sí tiene tres valores, y sí tiene el zócalo
rombo púrpura. Técnicamente, si queremos
ser más precisos, este socket offset representa la tasa de cambio
en cada fotograma, que mencionamos
antes, es decir la velocidad. Algo sencillo que puedo
hacer es agregar un nodo llamado vector y
conectarlo al offset. Yo no hice nada elegante. Acabo de reemplazar el
offset con este vector. Si escribo -0.1 en el
eje z del nodo vector, Hit play, obtendré
el mismo resultado exacto Este nodo vectorial en este momento
representa la velocidad. Para ir aún más lejos, voy a eliminar
este nodo vectorial, y voy a agregar un nodo
llamado atributo llamado, lo que me permitirá
convocar a cierto atributo El atributo que quiero
convocar es un vector, y su nombre es velocidad Este atributo de velocidad que
estamos llamando es el mismo atributo exacto que creamos usando el nodo atributo store
named. ¿Cuál es la naturaleza de
este atributo de velocidad? Es un vector, que es la naturaleza exacta
del socket offset, así que puedo enchufar el atributo
named en el
socket offset. Si le pego play, nada va a pasar porque este
vector de velocidad es básicamente todo ceros. ¿Cómo lo sé? Porque en el atributo store
named, no
especificamos los valores
de este vector de velocidad. Si escribo -0.1 en el eje
z y pulso play, obtendrás
exactamente lo mismo que teníamos antes Aquí está la lógica de
lo que está sucediendo. Creamos un vector
que llamamos velocidad, y tiene los siguientes valores. Entonces en nuestro árbol de nodos, podemos convocar o
llamar al vector que creamos y usarlo
en múltiples lugares Entonces este nodo de atributo llamado está buscando un vector
llamado velocidad, que se define por esta
tienda llamada nodo de atributo. Es como si creáramos un vector, ahora lo estamos usando en múltiples
lugares en el árbol de notas. En el futuro, si quiero
cambiar el vector de velocidad, todo lo que necesito hacer es cambiar los valores en
el atributo
store named, y ese cambio
ondulará a través todo
el árbol de notas porque
estaré usando el nodo de atributo
named en
todas partes de mi árbol de notas. Ahora que cambiamos un poco nuestro árbol de notas y creamos
el atributo velocity, y el siguiente video, vamos a crear el atributo de
aceleración.
8. El atributo de aceleración: Atributo de aceleración. Como mencioné antes, aceleración es el
cambio de velocidad. Entonces, si queremos implementar la
aceleración en nuestro sistema, necesitamos encontrar una manera de
hacer que la velocidad
cambie con el tiempo. Queremos decirle a blender que
incremente la tasa de cambio. En otras palabras, queremos
hacer más grande la distancia que atraviesa el punto de
fotograma a fotograma. Por ejemplo, en el fotograma cero, el punto está en 0.0. En el marco uno,
mételo 01 metros hacia abajo. Será a menos 01 metros. Entonces empujarlo por
cero, 15 metros hacia abajo, lo que estará a
menos 020 5 metros, y luego empujarlo por
cero 2 Por lo que será a menos
cero, 45 metros. Al hacer esto, como se puede ver, la distancia recorrida
por el punto con cada momento que pasa va
aumentando gradualmente, lo
que significa que se está acelerando. Entonces, ¿cómo podemos programar tal
cosa en nodos en blender? Bueno, esto es sencillo. Entonces aquí es donde
paramos la última vez. Tenemos este
atributo llamado store que está definiendo un atributo llamado velocity
que sí tiene estos valores, y luego usamos este atributo de
velocidad o este
vector de velocidad aquí mismo. Lo estamos llamando desde este nodo, y lo usamos para
actualizar la posición, y esto
nos está dando una velocidad constante. Lo que queremos hacer, como dije, es hacer que este vector de velocidad incremente sus valores por el tiempo. Algunos de ustedes podrían sugerir
que puedo enmarcar esta propiedad aquí mismo y
agregar un par de fotogramas clave, y podré animar
este valor con el tiempo Y este es en realidad
un enfoque viable. Lo que queremos hacer es construir un motor de física que pueda
encargarse de todo. Voy a hacer algo que
sonará un poco contraintuitivo al principio,
pero lo voy a explicar. Voy a ir a agregar atributo
con nombre. Como recuerdas, este
nodo me permitirá
llamar o convocar a cierto
atributo que he creado En este caso, voy a llamar a un vector, que es la velocidad. Es el mismo vector exacto
Este nodo está creando. Es el mismo atributo, y lo voy a enchufar
en el valor. Como dije, esto podría
sonar contrario a la intuición. Entonces, básicamente, este nodo
está definiendo una propiedad llamada velocidad que
sí tiene este valor. En este valor, estoy tapando un atributo que
se llama velocidad Es literalmente el
mismo atributo. Es como el meme
del tipo vertiendo el agua en sí mismo
mientras está en la piscina. Probablemente puedas
adivinar que la licuadora lee el árbol
de notas de izquierda a derecha, por lo que comenzará
con los puntos, luego ingresará a la zona de simulación. Almacenar atributo con nombre,
y para cada nodo, comenzará de
arriba a abajo. Al principio,
leerá punto vectorial, luego leerá la geometría, luego esta elección, y
luego creará una propiedad llamada velocidad o un atributo llamado velocidad. Para el valor,
enchufé la velocidad, y siempre que
conectes un atributo al nodo que está
creando el atributo, blender asumirá
un valor de cero Por eso ahora si golpeo barra
espaciadora para darle a play,
no pasará nada. El punto se quedará
en el mismo lugar, porque esta conexión
que hice aquí mismo, enchufando la
velocidad del atributo en la tienda llamada atributo
definiéndolo me llevará a cero Entonces no va a pasar nada. Pero
lo realmente lindo ahora, si voy a agregar turno A y
busco matemáticas vectoriales, y voy a enchufarlo justo
después del atributo nombrado, Ahora Blender tomará
el vector de velocidad, que es en nuestra
situación un cero, le
agregaremos un valor que
especificaré aquí mismo, y ese será mi
nuevo valor de velocidad o mi nuevo vector de velocidad que usaré más adelante para
actualizar la posición. Si digamos, por
ejemplo, escribo -0.1. Ahora trata de pensar en
lo que va a pasar. En el fotograma cero, por supuesto,
nada va a pasar. Voy a abrir mi línea de tiempo, y para organizar mejor
mi espacio de trabajo, voy a colapsar
esto a esto, y voy a agregar
otro editor aquí mismo, y voy a cambiarlo
a la ventana gráfica de tres D, y vamos a
bajarlo así Esto me dará más
espacio aquí en mi nota prueba. Tengo aquí está en la línea de tiempo, y puedo moverme aquí mismo
en mi ventana gráfica de tres D. Y como estamos trabajando
ahora mismo en sólo dos dimensiones, voy a golpear una desde el teclado numérico para saltar
a la vista frontal. Entonces este será mi
espacio de trabajo. Creo que esto es mejor. A lo mejor hasta voy
a arrastrar esto un poco así que tengo más
espacio en mi nota try. Como dije, ahora mismo en el fotograma
cero, no va a pasar nada. El punto está en la posición
inicial de cero o en realidad 5 metros, pero suponemos que es cero. En el fotograma uno, Blender
tomará el vector de velocidad, que sí tiene
el valor de cero, le agregará -0.1, y ese será
mi vector de velocidad que luego usaremos para
actualizar la posición Por lo que ahora en el marco uno, licuadora moverá este
punto 01 metros hacia abajo. Mira, boom. Entonces este es 01. En el cuadro dos, digamos que la licuadora
volverá a ejecutar el ciclo. Pero, ¿cuál es el valor de este nodo de
velocidad en estos momentos? ¿Es cero o es menos 01? Esto es lo importante que hay que tener en cuenta, que es que este
nodo en este momento mantendrá el valor
del estado anterior. Este nodo en este momento contiene un atributo de velocidad
que no es 000. En realidad es 00 menos 01. Ahora cuando le voy
a sumar menos 01, Este nuevo
vector de velocidad que voy a
obtener de aquí
no será menos 01. Será menos 02, y fíjate lo que va a pasar. Ahora la distancia
que se recorre en el cuadro dos es ligeramente mayor. En la tercera ocasión para el
fotograma número tres, ¿cuál es el valor de éste? Es el
valor de velocidad anterior, que es menos 02. Ahora le agregaré menos 01, así que tendré menos 03, y esta será mi nueva velocidad que usaré para
cambiar la posición. Entonces ahora la brecha se está
haciendo más grande. Estoy en el fotograma tres.
En el fotograma cuatro, este vector de velocidad no
será cero. Como dije, será menos 03, y cuando le agrego menos 01, estará en -0.4, y eso es lo que usaré
para actualizar la posición Boom. Ahora bien, si golpeo play, notarás que la pelota
caerá un poco más rápido, cuanto más tiempo pase cayendo. Déjame alejarme un poco
para ver a fondo lo que sucede. Y si le pego a play,
como pueden ver, ahora estamos consiguiendo algo
que se asemeja a una bola que cae. La clave de eso es este pequeño
truco que hicimos aquí mismo. Tomamos la velocidad
del estado anterior, agregamos un cierto valor,
y debido a que es una batidora baja cada vez que ejecuta
la simulación, agregamos menos 01 en el eje z al
estado anterior del vector de velocidad. Espero que eso tenga sentido. Ahora mismo, este vector
lo estoy agregando aquí mismo, este vector es en realidad
el vector de aceleración. Estos valores son los
que definen cuánto quieres licuadora para aumentar la velocidad con cada momento
que pasa. Esto es en realidad aceleración. Como quiero que también la
aceleración sea un atributo porque lo
estaré usando más adelante, voy a agregar
otro nodo
ahora mismo llamado store named
attribute, shift A, store named attribute, y
voy a almacenar un vector al que
llamaré aceleración que
sí tiene estos valores. Y lo voy a
usar aquí mismo, así que busca atributo con nombre. Voy a
buscar un vector que acabo de crear
llamado aceleración. ¿Dónde está la aceleración? ¿Bien? Es un vector
llamado aceleración. Y voy a enchufarlo aquí. No va a pasar nada
porque esta aceleración es cero. ¿Cómo lo sé? Porque en el nodo que lo define, no
especificé qué valor
debería tener este vector. Si vuelvo al
fotograma número uno, y si le doy a play, no
pasará nada porque la
aceleración es cero. No voy a añadir nada.
Nada va a cambiar. Por eso voy
a escribir menos 01. Mm. Y ahora, si le pego a play, obtendrás exactamente la
misma animación o simulación que acabamos de tener. Por lo que este
atributo llamado tienda definirá un
vector llamado aceleración. Y cada vez
que blender ejecutamos la simulación, estamos agregando este valor
a la tasa de cambio. En otras palabras, cada fotograma o cada vez que la licuadora
ejecuta la simulación. Esta es la cantidad de licuadora que aumentará la distancia
atravesada por el punto. Cada vez la distancia
aumentará en menos 01 metros. Sé que puede ser un poco confuso porque
estamos usando menos, pero siempre recuerda que
la razón principal por la que estamos usando menos es porque
nos estamos cayendo. Por eso necesitamos
el signo menos. Entonces este es nuestro actual notario. Espero que tenga sentido. Ahora tenemos una simulación de
punto de caída, supongo. Pero en realidad,
hay un pequeño problema en esta simulación que necesitamos
arreglar en el siguiente video.
9. El problema de Delta-t: Problema de Delta T. Algo que
mencioné antes es que las simulaciones en licuadora
se evalúan en cada fotograma Esto provocará un pequeño problema. Nuestra velocidad de fotogramas actual
es de 24 fotogramas por segundo. Esto significa que la
licuadora ejecutará la simulación 24
veces en 1 segundo. Voy a saltar de nuevo al trabajo
de nodos de geometría, puntos. Si golpeo placa para almacenar en caché la simulación y
luego voy al fotograma 24, aquí está la ubicación
del punto. 00 -25. Ahora, digamos que quiero que la
animación final sea más suave. Así que decidí subir
la velocidad de fotogramas a 60
fotogramas por segundo. Después de 1 segundo,
¿cuántas veces crees que Blender
ejecutará la simulación? Adivina a la derecha, 60 veces. Si golpeo placa para coger la simulación e
ir al marco 60, observe la ubicación
del punto. 00 -178. Sé que esto puede ser confuso, así que para realmente clavar
el punto a casa, esto es lo que sucede
en la vida real. Imagina que estás lanzando una
pelota desde un lugar alto. Digamos que la pelota tardará 3 segundos hasta que
toque el piso, y tienes dos cámaras, una grabando a 24 fotogramas por segundo y la otra a
60 fotogramas por segundo. Lanza la pelota. En 1 segundo, la pelota estará en este nivel. Lo importante
a notar es que ambas cámaras capturarán el
balón en la misma posición. La única diferencia es que la cámara de 24 FPS
grabó solo 24 fotogramas. Es decir, registró el balón en 24 posiciones
diferentes. En tanto, la
cámara de 60 FPS grabó 60 fotogramas. Es decir, registró el balón en 60 posiciones
diferentes. El tiempo es siempre el mismo. La única diferencia
es la velocidad de fotogramas. Lo que debería pasar en
Blender es lo siguiente. Después de 1 segundo, el
punto debe estar en la misma posición independientemente
de la velocidad de fotogramas. Entonces, ¿cómo podemos solucionar este problema? La mejor manera de explicar la solución es
haciendo algunas matemáticas. Pero lo prometo, no va
a ser tan complicado. Algo que mencioné
antes es que velocidad es la tasa de
cambio en la posición en el tiempo. Una forma de traducir
esa declaración en una función matemática
es como la siguiente. V, que es velocidad
igual Delta P sobre Delta T. Me gustaría que pensaras en
la palabra Delta como el cambio. P significa posición
y t por tiempo. Decimos que la velocidad es Delta P, el cambio de posición. Sobre Dilta T, el
cambio en el tiempo. Ahora, ¿qué pasa con la aceleración? Como recuerdas, la aceleración es la tasa de cambio de
velocidad a través del tiempo. Una forma también de escribir esto
como fórmula es la siguiente. Aceleración A
igual, Delta V sobre delta t. Decimos que la
aceleración es Dilta V, el cambio de velocidad, sobre Dilta T, el tiempo de cambio En nuestro árbol de nodos actual, Delta t es una variable que cambia
dependiendo de la velocidad de fotogramas. Si la velocidad de fotogramas es 24, entonces Delta t es igual a 1/24, y si la velocidad de fotogramas es 60, entonces Delta T es igual a 1/60 Queremos que el tiempo
de nuestra simulación
sea el mismo independientemente
de la velocidad de fotogramas. Con base en la primera ecuación, velocidad es igual a Delta
P sobre Delta T, se puede concluir que
Delta P igual velocidad multiplicada por Delta T. Con base
en la segunda ecuación, A, aceleración igual
Delta V sobre Dilta T? Podemos concluir que Delta V, el cambio de velocidad
es igual a la aceleración, multiplicada por Delta T,
el cambio en el tiempo. La matemática es realmente sencilla. Todo lo que hicimos
ahora es expresar tanto el cambio de posición
como el cambio de velocidad
en función de Delta
T. Esto hará que Blender considere la velocidad de fotogramas al ejecutar la simulación. ¿Cómo podemos traducir esa lógica en el
árbol de nodos? Esto será sencillo. Empecemos primero con el cambio de
posición Delta P es igual a la velocidad multiplicada por Delta
T. ¿Cuál es el nodo responsable de cambiar
la posición del punto? Es el nodo de posición establecida, y esta parte de la
ecuación es la que necesitamos para computar e
introducir en el socket offset. Ahora mismo es sólo
el vector de velocidad. Con base en la ecuación, necesitamos multiplicar
la velocidad por Delta T. Tienes que hacer es
agregar un nodo matemático vectorial, cambiar la operación
para multiplicarla, y multiplicarla por la Delta T, que puedes obtener
desde el primer nodo de la zona de simulación. Además, puede establecer la operación de este
nodo matemático vectorial a escala, y hará exactamente lo
mismo. Usamos multiplicar cuando
tratamos con dos vectores, pero como el tiempo Delta
es un número simple, podemos cambiarlo a escala. Puedes usar este siempre
que estés multiplicando un vector
por un solo número También se les llama
escalares en licuadora. De ahí la escala de nombre
para la operación. Bien, entonces ahora estamos compensando
el cambio de posición
basado en nuestro tiempo Delta, que se basa en
nuestra velocidad de fotogramas. Ahora tenemos que hacer lo mismo para la segunda operación. Delta V, el cambio
en la velocidad es igual al
vector de aceleración multiplicado por Delta T. ¿Dónde
estamos definiendo V, el cambio en la velocidad? Bueno, estamos definiendo el cambio de velocidad usando este primer atributo llamado
store. El encargado de
crear la aceleración. Recuerda siempre, los valores que estamos usando para el vector de
aceleración son responsables de cuánto aumenta
nuestra velocidad
con cada fotograma. Entonces lo que puedo
hacer es ingresar un vector en el valor de esta
tienda llamado atributo, y por defecto blender
mantendrá los mismos valores. La ecuación, Delta
V igual aceleración multiplicada por Delta T, lo que ingresaremos en el socket de
valor de la tienda llamada atributo define la
tasa de cambio en la velocidad, que es igual a
la aceleración, que es este nodo vector, y necesitamos multiplicarlo por Delta T. Todo lo que hay que hacer
es agregar un nodo matemático vectorial, cambiar la operación a escala, y multiplíquelo por Delta T, que se puede obtener desde
el primer nodo de la zona de simulación como
mencioné anteriormente. Es así como podemos
implementar la lógica de las ecuaciones que
expliqué en el notario Como resultado de eso,
nuestra simulación ahora se adaptará a
la velocidad de fotogramas y se mantendrá consistente
independientemente de la velocidad de fotogramas. Para asegurarse de que ese es el caso, si le pego play, antes que nada, notarás que la
animación es demasiado lenta. Dado que nuestra simulación ahora se
basa en el tiempo de la vida real, no en los números de fotogramas, necesitamos comenzar a usar valores de la vida
real
para estos vectores. Es el valor de la gravedad
en la vida real. Es -9.8 Asegúrate de usar ese valor para el vector de aceleración porque
así es como los objetos se
aceleran al caer. Por lo que siempre es agradable usar los
valores de la vida real porque eso significa que nuestra simulación
será más realista. Ahora nuestra velocidad de
fotogramas actual es de 24 FPS. Así que vamos a ejecutar la simulación
golpeando play. Vaya al fotograma 24, lo que significa 1 segundo
en la simulación, y vea la posición
del punto. Está en 0.304. Ahora, cambiemos la velocidad de
fotogramas a 60 FPS, volvamos a
ejecutar la simulación
y vayamos al fotograma 60, lo que también significa 1 segundo en
la simulación porque
simplemente cambiamos la velocidad de fotogramas y leemos la posición
de ese punto, y está en 0182 Los valores son cercanos, pero no son los mismos. ¿Por qué es eso? Sin
entrar en el meollo arenoso detalles
de por qué está sucediendo eso, todo lo que necesitas hacer es
que cada vez que estés haciendo este tipo de
simulaciones en Blender, siempre
habrá Y eso se debe al método de
integración de engrase utilizado en Blender Puedo pasar horas tratando de
explicar cuáles son los métodos de integración de engrase y todos los problemas con él. Pero eso va a ser
demasiado para manejar. Entonces todo lo que necesitas
saber es que siempre
habrá un margen de
error del que tenemos que lidiar
al hacer este tipo de
simulaciones en blender Además, debo mencionar que
hay otras formas de
integrar otros métodos de
integración en blender usando nodos, pero vamos a estar aprovechando las cosas más avanzadas de los nodos
de geometría. Y en realidad, Esos ni siquiera
se trata nodos de
geometría tanto de matemáticas
literalmente puras. Y ese no es el
tema principal del curso. Por eso sacrificaremos
algo de estabilidad y aceptaremos un gran error
de margen en aras de la simplicidad. Y ahora que nuestra simulación
es independiente de la velocidad de fotogramas, necesitamos hacer que estas
bolas básicamente reboten del piso
introduciendo algunas restricciones, que haremos en
el siguiente video.
10. Adición de restricciones Pt.1: Adición de restricciones
Parte uno, el suelo. Nuestro punto en este momento seguirá
cayendo para siempre básicamente. Tenemos que encontrar una
manera de decirle a licuadora, oye,
licuadora, una vez que el punto
llegue al piso, hacer que se equilibre de él. Este será un ejercicio divertido. La primera pregunta
que me viene a la mente es, ¿
cuándo
llega el punto al piso? La respuesta es sencilla.
Una vez que la posición del punto es igual
o inferior a cero. Ahora, si vuelvo a la
frase, oye, licuadora. Una vez que nuestro punto
llegue al piso, queremos que se equilibre de él, podemos cambiarlo a la siguiente
frase. Oye, licuadora. Una vez que la posición de nuestro punto es igual o menor que cero, queremos equilibrar
fuera del piso. Ahora viene la segunda parte. ¿Cómo podemos hacer que
rebote en el suelo? La solución más sencilla será revertir todas las fuerzas que se aplican en nuestro
punto o en nuestra bola. Ahora mismo, nuestra simulación está
haciendo caer el punto. Entonces todo lo que tenemos que hacer es decirle
a blender que una vez que el punto llegue al piso,
revertir la simulación. En otras palabras, invertir
la velocidad y la posición. Para entenderlo completamente, quiero explicar
la arquitectura de nuestro motor de simulación. Primero definimos
la aceleración. Árbol utilizado para definir
la velocidad, que usamos para
actualizar la posición. Es bastante sistemático
o algorítmico en cierto sentido. Es un proceso paso a paso. Ahora le diremos a blender, si la posición del
punto es menor que cero, invierta la velocidad e invierta la posición
del punto. Esto llevará al
punto rebotando hacia arriba. Es como si estuviéramos construyendo
un mini motor que se pondrá en
marcha una vez que la posición
del punto sea menor a cero. Traduzcamos todos
estos pensamientos en nodos. El primer paso en la construcción nuestro mini motor es saber
cuándo arrancará este motor. Eso lo dije varias veces. Cuando la posición del
punto sea menor que cero, comenzaré agregando
un nodo de posición. Nos dará la
posición del punto, después voy a añadir un nodo llamado x y z separado porque solo
necesitamos la
posición sobre el eje z, ya que es el
encargado definir la posición
del punto arriba y abajo. Agrega un nodo de comparación y
configúrelo en menos de cero, y esta es nuestra condición. Una forma de leer la lógica de estos nodos que creamos
es la siguiente. Cuando la posición en el eje
z sea menor que cero, haga algo. Ahora
vamos a construir lo que debería suceder cuando esta
condición sea cierta. Esto debería ser sencillo porque
todo lo que tenemos que hacer es hacer funcionar el mismo motor que
construimos justo a la inversa, que podemos hacer fácilmente
multiplicándolo por menos uno Primero, necesitamos
invertir la velocidad. El punto solía bajar, ahora tiene que subir. ¿Cómo podemos actualizar la velocidad? Fácil. Agrega un atributo
llamado store, cambia el tipo a vector, y necesitamos velocidad. Lo que sea que escribamos
aquí ahora anulará los valores que teníamos anteriormente
para el vector de velocidad. Luego agregaré un atributo con nombre. Velocidad vectorial. Esto me dará
el valor
de velocidad del cuadro anterior, y
lo multiplicaré por menos uno en el eje z y otro
en el eje x e y, ya que no quiero
que cambien porque multiplicar por uno siempre
conducirá al mismo resultado Y voy a enchufar eso en el socket de valor del atributo
storm named. Ahora invertimos el vector de
velocidad. Pasemos a actualizar
la posición, así la pelota va en
sentido inverso. Agregaré un nodo de posición establecida, agregaré un nodo de posición, agregaré una matemática vectorial y
lo multiplicaré por menos uno en el eje z. Y uno en el
eje x e y y tapar eso recto
a la posición, porque queremos recto hacia arriba cambiar la posición,
no solo el desplazamiento. Y ahora, este es nuestro mini
motor encargado revertir la simulación si
el punto va por debajo de cero. Pero ahora mismo, Blender
todavía no sabe cuándo ejecutar el pequeño
motor porque necesitamos enchufar nuestros nodos definiendo
la condición en el
socket de selección del atributo store named y
la posición establecida. Entonces ahora, ambas de
estas dos operaciones de cambiar la velocidad
y cambiar la posición, solo
se ejecutarán una vez que se cumpla
esta condición. Si le pego a play ahora,
fíjese en lo que va a pasar. Nuestro punto es rebotar, y así es como podemos introducir restricciones a nuestra simulación El balón ahora
rebotará para siempre, pero en la vida real, debería perder energía lentamente
hasta que se detenga. La forma de evitar eso
será decirle a blender que disminuya la
velocidad gradualmente. Eso se puede hacer incrementando
el vector de velocidad, así que en lugar de
multiplicarlo por menos uno, que es un reflejo perfecto, lo
multiplicas por
-0.8, por Ahora la simulación
perderá vapor lentamente cada vez que
toque el piso. Hasta que se detenga. La
forma en que programamos la fricción en este momento solo se aplica una vez que se cumple esta
condición. Una vez que la pelota toca el suelo. Pero en la vida real, la pelota
en realidad debería perder velocidad gradualmente desde el inicio
de la simulación. Una forma de evitar eso es agregar un nodo meta vectorial,
configurarlo a escala y conectarlo justo antes
del atributo llamado store que define la velocidad y establecer el valor en
algo así como 0.98 Ahora la simulación
perderá energía general o en cada fotograma. ¿Por qué? Porque como sabemos, blender compila la simulación
cada frame Para nuestra simulación, voy
a eliminar el nodo de escala, y programaré la
fricción de los nodos responsables de las
restricciones en un video futuro. Ahora construimos el
sistema de restricción para el piso. También necesitamos construir algunas restricciones
para las paredes laterales, y eso es exactamente lo que
haremos en el próximo video.
11. Adición de restricciones Pt.2: Agregar restricciones para
dos, los muros laterales. En el video anterior,
creamos la restricción de piso, que permitirá que la pelota
rebote en el piso. En este video, vamos a
crear algo similar. Construiremos las restricciones
para las paredes laterales, derecha e izquierda, delantera y trasera. Solo para que todos
estemos en la misma página, asegúrate de golpear uno desde el teclado numérico para saltar
a la vista frontal. Empezaremos por crear las restricciones para
el muro correcto. Digamos que queremos que la
pelota rebote una pared imaginaria que está a
1 metro de distancia. Por aquí. El concepto es realmente similar a lo que hicimos para el piso. Necesitamos encontrar una manera de decirle
a Blender que si la pelota toca esta pared imaginaria,
invierta la simulación. O para usar la analogía
del mini motor, vamos a crear
un pequeño motor de física que pateará si la
pelota toca la pared derecha Empecemos con la condición.
Esto debería ser sencillo. El punto toca la pared. Si la posición en el eje x
es igual o más de uno. Agregar nodo de posición para leer la posición de un punto
en particular, agregaré a continuación un xyz separado. Todo lo que me importa es el eje x, que debería ser
mayor que uno. Es mi condición. Ahora pasamos a lo que debería suceder si esta
condición es cierta. Queremos revertir
la simulación, así invertimos primero la velocidad,
y luego la posición. En lugar de crear todos
esos nodos desde cero, simplemente
copiaré la configuración de la restricción de piso y la
conectaré así. Para la multiplicación de la velocidad, asegúrese de cambiar el eje
z de nuevo a uno. Cambiar el eje x a menos uno, porque ahora estamos
trabajando en el eje x. Haré lo mismo por la multiplicación de la posición. Cambiaré el eje z de nuevo a uno y cambiaré el
eje x a menos uno, y también me aseguraré de
conectar la condición
tanto al atributo
llamado store named como a la posición establecida. Estas operaciones sólo
entrarán en acción si se cumple esta
condición. Ahora bien, si golpeo play, la pelota caerá
recta hacia abajo. Quiero empujarlo
ligeramente hacia la derecha. Iré justo después
del nodo de puntos, el primer nodo del árbol minero, y agregaré el atributo store
named. Eso es un vector, y
voy a escoger la velocidad, y a la derecha, por ejemplo,
dos en el eje x. Entonces ahora, el
vector de velocidad comenzará en dos, lo que significa que el punto
será empujado ligeramente hacia la derecha, y de esa manera podremos probar nuestra restricción de muro que
acabamos de crear. Es como si creáramos una
velocidad inicial para el punto, así que no empezará desde cero. Si le pego a play, el punto
tocará la pared derecha, pero está actuando de manera extraña De alguna manera salta al
otro lado. ¿Por qué es eso? Bueno, si nos enfocamos en
este nodo de posición, notarás que lo estamos
multiplicando por menos uno Entonces digamos hipotéticamente, la posición del punto en
un determinado marco está en 0.9 en el eje x La simulación
seguirá funcionando normalmente porque no
tocamos la línea única. En el siguiente fotograma, la posición
de la pelota está en uno, lo que significa que ahora se cumple la
condición, lo que significa que la licuadora ejecutará estas operaciones que le indican
que invierta la simulación. Entonces ahora la pelota también debería
estar aquí en 0.9 en el eje x. Pero como estamos multiplicando la posición en el eje
x por menos uno, salta al otro lado
a -0.9 en el La solución para esto es simple. Tenemos que llevar esta bola
dos unidades a la derecha, lo que podemos hacer agregando
un nodo meta vector, configurarlo para agregar, y
agreguemos dos en el eje x. Y ahora si presiono play, notarás que el punto rebota perfectamente
de la pared derecha, y esta es nuestra restricción
para la pared derecha Ahora vamos a crear la
restricción para el muro izquierdo. Esto debería ser sencillo.
Voy a duplicar toda la restricción de pared
derecha y
conectarla después de ella así. El muro izquierdo es
la línea menos uno. ¿Cuándo
toca la pelota la pared izquierda? O la línea menos una, cuando la posición es igual
o menor que menos una, voy a cambiar mi condición
para ser cuando la posición en el eje x es
menor que menos uno. Entonces esta es mi nueva condición. Lo que debería suceder es
que invertiremos la velocidad multiplicándola por
menos uno en el eje x Entonces voy a mantener estos
nodos tal como están, y para la posición establecida, estamos multiplicando
por menos uno Tenemos que corregir para
eso agregando dos. En el caso de la pared izquierda, ya que estamos multiplicando por
menos uno en el eje x, eso significa que la pelota
ahora saltará hacia el lado derecho, por lo que necesitamos moverla
dos unidades hacia atrás, que podemos hacer fácilmente
restando Todo lo que necesitas hacer es cambiar este nodo matemático vectorial
de sumar a restar Ahora si
le doy a play, verán como nuestro punto está rebotando tanto de
la pared derecha como de la izquierda, y eso es exactamente lo que queremos Ahora creamos la restricción para la pared derecha e izquierda. Haremos exactamente lo mismo solo para la pared frontal
y trasera. En nuestra ventana gráfica tres D, ahora
estamos
mirando la vista frontal, lo que significa que esta es la pared
derecha e izquierda Si golpeo tres desde
el teclado numérico, saltaré a la vista lateral, lo que significa que ahora esta es la
parte delantera, Esta es la parte de atrás. Otra forma
de pensar en esto antes, estábamos trabajando
a lo largo del eje x. Si golpeo uno desde
el teclado numérico, verás la línea roja
que representa el eje x. Ahora bien, si golpeo tres
desde el teclado numérico, saltaré a la vista lateral, y ahora estaré trabajando
a lo largo del eje y. Crear restricciones para ambos será realmente sencillo. Simplemente duplicaré toda
la configuración tanto
para la
pared derecha como para la izquierda y la cambiaré
de funcionamiento basado en el eje x
al eje y. Seleccionaré ambos de
estos dos grupos de nodos y golpearé D para
duplicarlos. Los conectaré así. Empecemos por la pared derecha que ahora es la pared frontal. Cambiar el valor proveniente
del eje x y
z separado al eje y. Debe ser igual
o mayor que uno. Si se cumple esta condición,
haremos lo siguiente. Toma la velocidad y
multiplícalo por menos uno en el eje y ahora y vuelve a cambiar
el eje x a uno. Para la posición, lo mismo, multiplícalo por menos uno en el eje y y cambie
el eje x de nuevo a uno. Y como también necesitamos dar
cuenta de la corrección, ahora
necesitamos sumar dos en el eje y y escribir
cero en el eje x. Esta es la restricción
para la pared frontal. Ahora pasemos a la
restricción para la pared posterior. Voy a hacer algo similar. Cambiar el valor que sale de la x y
z separada al eje y. Debe ser igual o
menor que menos uno. Y si se cumple esta condición,
haremos lo siguiente. Toma la velocidad y
multiplícalo por menos uno en el eje y ahora y vuelve a cambiar
el eje x a uno. Para la posición, Lo mismo, multiplíquelo por menos uno en el eje y y cambie
el eje x de nuevo a uno. Y como también necesitamos dar
cuenta de la corrección, ahora
necesitamos restar dos en el eje y y escribir
cero en el eje x Y así es como construyes la restricción tanto para
la pared frontal como para la pared trasera. Ahora bien, si vuelvo
a la primera tienda llamada nodo atributo
que nos está dando algo de velocidad inicial
y le doy a nuestro punto también algo de velocidad inicial en
el eje y y presiono play, verás nuestro punto rebotando
de las diferentes paredes Bien, así es como puedes construir algunas restricciones
para tu simulación. En el siguiente video,
vamos a sustituir estos puntos por algunas
esferas básicamente o cuencos, que introducirán
un nuevo conjunto de retos que
debemos superar.
12. Radio: Añadiendo el radio.
En este punto, estamos ejecutando nuestra
simulación basada en puntos. Como mencioné antes, los puntos en blender son solo contenedores de
datos que
luego podremos intercambiar con otros objetos. Lo que queremos hacer en este
video es básicamente sustituir esos pequeños puntos por
esfera o cualquier objeto. Si voy al final
de mi árbol de nodos y
agrego un nodo llamado
instancia en puntos, lo
conectaré justo antes
del nodo de salida del grupo. Esta instancia en el
nodo de puntos reemplazará el punto por una instancia o un objeto tres D
que vamos a elegir. Quiero sustituir estos
puntos por esfera. Voy a añadir una esfera U. Y lo voy a enchufar en
el socket de la instancia. Y como pueden ver, nuestro punto ahora
se sustituye por la esfera. Para el radio de
esta esfera UV, quise heredar el
radio de los puntos, que podemos especificar
desde el nodo puntos, el primer nodo del notario Una forma de evitar eso es
agregar el nodo de radio y conectarlo a la escala de
la instancia en el nodo de puntos. Y ahora, si cambio el
radio de los puntos, también
estaré
cambiando el radio de las instancias o las esferas. Ahora bien, si
le doy a play, se dará cuenta de cómo nuestra esfera está rebotando en
el piso y las paredes laterales Pero si te enfocas,
notarás un pequeño problema. O un gran problema, dependiendo de cómo lo mires. Notarás que cuando la
esfera toque el piso, parte de la esfera pasa por debajo la línea del piso. ¿Por qué es eso? Bueno, ya que antes estábamos lidiando
con puntos, y dije que son
solo contenedores de datos, así que en realidad no
tienen radio. Ahora que reemplazamos
esos puntos con esferas que son la geometría real de
tres D, y tienen un radio, tenemos que dar cuenta de eso
en nuestro motor de física. En otras palabras, necesitamos encontrar
una manera de hacer que nuestro árbol de nodos sea
consciente del radio, por lo que lo considerará al
ejecutar la simulación. Será sencillo. Te lo prometo. Primero comencemos con la
restricción para el piso. Cuando la esfera
toca el suelo. Eso debería ser fácil de responder. Cuando la posición es
menor que el radio. Recuerde siempre que
la posición se evalúa desde el
punto central de un objeto. Cuando la posición
o el centro
del objeto tres D es
menor que el radio, eso significa que el
objeto tres D está tocando el piso. Para la restricción de piso, todo lo que necesito hacer es agregar un nodo de radio y enchufarlo
en la operación menor que. Ahora se vuelve si
la posición de la esfera es
menor que el radio, realice las siguientes operaciones. Si le pego a play, todo
va a funcionar sin problemas. Parece que la pelota está
rebotando en el piso. Pero si cambio el
radio del punto a algo así como 0.5 metros, por
ejemplo, y
vuelvo a golpear play para atrapar la simulación, verás algo raro. Ahora la pelota por cualquier razón
va por debajo del suelo
antes de que rebote. ¿Por qué es eso? Bueno,
ya ves que Blender está haciendo todo el cálculo basado en el centro
del objeto. Es importante enfatizar que todas las operaciones que estamos haciendo aquí están todas basadas
en los puntos que creamos. Estos puntos sólo se convierten en
esferas al final del notario cuando estamos usando la
instancia en puntos conocidos Entonces, hasta este
punto del notario, seguimos tratando de puntos, lo que significa que Blender está viendo
puntos aquí, no esferas Entonces como solución para esto, podemos decirle a Blender
lo siguiente. Si la pelota toca el piso, muévala hacia abajo por
la cantidad del radio, haz la corrección,
y luego
vuelve a colocarla Esto se verá algo
así en los nodos. Añadiré un
nodo de radio y lo conectaré a un nodo XY Z combinado
en el eje Z. Estamos haciendo un montón de
operaciones sobre vector, por
eso necesito
convertir este radio, que es un solo
valor en un vector. Quiero mover la posición hacia abajo por la cantidad
del radio. Voy a sumar un nodo matemático vectorial, cambiar la operación
para restar, y voy a enchufar la
posición al primer socket, lo que significa que
restaré de El segundo valor debe ser el vector que obtuvimos
del radio. Entonces enchufaré el vector
del nodo combinado x Y Z
en el segundo socket. A continuación, haremos nuestra corrección mediante el uso de este nodo
multiplicar vector. Necesitamos cancelar la operación de
resta que hicimos antes sumando un conjunto de nodos
matemáticos vectoriales para sumar, y sumaré el vector que
resté antes, que es el vector que
sale
del nodo combinado x Y Si le pego play,
se dará cuenta de que la pelota ahora está rebotando del
piso de la manera correcta Ahora viene la peor parte, que es que necesitamos
hacer una corrección similar a todas las diferentes
restricciones, derecha e izquierda, adelante y atrás. Pero eso va a ser sencillo. Hagámoslo muy rápido. Empecemos por el
estado de la pared derecha. ¿Cuándo
toca la esfera la pared derecha? Simple cuando la posición en el eje x es mayor que
uno menos el radio. Voy a añadir un nodo de radio. Lo conectaré a un
nodo matemático, lo configuraré para restar, por lo que será uno
menos el radio, y lo conectaré al nodo
mayor que Esta es mi nueva condición. ¿Por qué debería pasar ahora si
esta condición es cierta? Invierta la velocidad, eso
debería permanecer como es. Si le pego play, seguirás
notando que la pelota aún
irá más allá la pared derecha
porque necesitamos hacer una corrección similar a
lo que hicimos para el piso. Desplazar la
simulación hacia la derecha, hacer la corrección y
luego moverla hacia atrás. Esto se verá
algo así. Añadiré un
nodo de radio y lo conectaré
al nodo xyz combinado en
el eje x esta vez. Como mencioné
antes, estamos haciendo un montón de operaciones sobre vector. Por eso necesito
convertir este radio, que es un
valor único en un vector. Quiero mover la posición a la derecha por la cantidad
del radio. Agregaré un nodo matemático vectorial, cambiaré la operación para agregar. Voy a enchufar la
posición al primer socket, lo que significa que
agregaré a la posición, el segundo valor,
que debería ser el vector que obtuvimos
del radio. Entonces voy a enchufar el vector
del nodo combinado x y z
en el segundo socket. A continuación, haremos nuestra corrección usando este nodo
multiplicar vector, Luego usamos la operación ad para contar
para la
otra corrección, y necesitamos cancelar las operaciones de
suma que hicimos antes sumando un nodo
matemático vectorial establecido para restar, y restaré el
vector que agregué antes, que es el vector que
sale
del nodo combinado x y z Si golpeo play,
notarás que la pelota ahora está rebotando en
la pared derecha correctamente Esta es la corrección
para la pared derecha. Ahora tenemos que hacerlo
para la pared izquierda. Empecemos por la
condición para la pared izquierda. ¿Cuándo
toca la esfera la pared izquierda? Simple cuando la posición
en el eje x es menor que menos uno más el radio
o el radio menos uno. Voy a añadir un nodo de radio. Lo conectaré a un
nodo matemático, lo configuraré para restar, así será el
radio menos uno,
y lo conectaré
al nodo menos que Esta es mi nueva condición. Debería suceder ahora si
esta condición es cierta. Invierta la velocidad, eso
debería permanecer como es. Si le pego play,
seguirás notando que la pelota aún irá
más allá de la pared izquierda, porque necesitamos hacer una corrección
similar
a lo que hicimos para el piso y la pared derecha al alterar la
simulación a la izquierda Haz la corrección, y
luego muévala hacia atrás. Esto se verá
algo así. Añadiré el nodo de radio
y lo conectaré a un nodo combinado x Y Z en
el eje x esta vez. Quiero mover la posición izquierda por la cantidad
del radio. Voy a sumar un nodo matemático vectorial, cambiar la operación
para restar Voy a enchufar la
posición al primer socket, lo que significa que restaré
de la posición, el segundo valor, que debería ser el vector que obtuvimos
del radio Voy a enchufar el vector
del nodo xyz combinado
en el segundo socket. A continuación, haremos nuestra corrección mediante el uso de este nodo
multiplicar vector. Luego usamos la operación de
resta para contar
para la
otra corrección, y necesitamos cancelar la operación de
resta que hicimos antes sumando un nodo
matemático vectorial, configurarlo para sumar Voy a sumar el vector
que resté antes, ¿cuál es el vector que sale
del nodo combinado xy Z? Si golpeo play,
notarás que la pelota ahora está rebotando de
la pared izquierda correctamente Esta es la corrección
para la pared izquierda. Ahora tenemos que hacerlo para
la pared frontal y trasera. Esto debería ser realmente similar
a la pared derecha e izquierda. Voy a golpear tres desde el teclado numérico para saltar
a la vista lateral, y comencemos haciendo la corrección para
la pared frontal, que parece la
pared derecha desde esta vista. ¿Cuándo
toca la esfera la pared frontal? Simple cuando la posición en el eje y es mayor que
uno menos el radio. Voy a añadir un nodo de radio. Lo conectaré a un
nodo matemático, lo configuraré para restar, por lo que será uno
menos el radio, y lo conectaré al nodo
mayor que Esta es mi nueva condición. ¿Qué debería pasar si
esta condición es cierta? Invierta la velocidad, eso
debería permanecer como es. Yo le pego play, Seguirás
notando que la pelota
seguirá yendo más allá la pared frontal porque
necesitamos hacer una
corrección similar a lo que hicimos antes
poniendo la simulación
al frente, hacer la corrección, y
luego moverla hacia atrás. Esto se verá
algo así. Añadiré un
nodo de radio y lo conectaré a un nodo xyz combinado en
el eje y esta vez. Quiero mover la posición hacia adelante por la cantidad
del radio. Voy a añadir un nodo de metanfetamina vector. Cambiar la operación para agregar, y voy a enchufar la
posición al primer socket, lo que significa que
agregaré a la posición, el segundo valor, que debería ser el vector que obtuvimos
del radio. Entonces enchufaré el vector
del nodo xyz combinado
al segundo socket. A continuación, haremos nuestra corrección mediante el uso de este nodo
multiplicar vector. Luego usamos la operación ad para contar para la
otra corrección, y necesitamos cancelar
la operación de suma que hicimos antes sumando un nodo
meta vector establecido para restar, y restaré el
vector que agregué antes, que es el vector que
sale del nodo xyz combinado Si golpeo play,
notarás que la pelota ahora está rebotando de
la pared frontal correctamente Esta es nuestra corrección
para la pared frontal. Ahora tenemos que hacer lo
mismo para la pared posterior. Empecemos con la condición. ¿Cuándo
toca la esfera la pared posterior? Sencillo. Cuando la posición
en el eje y es menor que menos uno más el radio
o el radio menos uno. Voy a añadir un nodo de radio. Lo conectaré a un
nodo matemático, lo configuraré para restar, por lo que será el radio menos uno y lo conectaré
al nodo menos que Esta es mi nueva condición. ¿Qué debería pasar ahora si
esta condición es cierta? Invierta la velocidad, eso
debería permanecer como es. Si le doy a play,
seguirás notando que la pelota aún irá
más allá de la pared posterior porque necesitamos hacer una
corrección similar a la que hicimos antes alterando la
simulación hacia atrás, hacer la corrección, y
luego moverla hacia adelante Se verá algo así. Añadiré un
nodo de radio y lo conectaré
al nodo XY Z combinado
en el eje y esta vez. Quiero mover la posición hacia atrás por la cantidad
del radio. Voy a sumar un nodo matemático vectorial, cambiar la operación
para restar, y voy a enchufar la
posición al primer socket, lo que significa que restaré
de la posición, el segundo valor, que debería ser el vector que
obtuvimos del radio Entonces enchufaré el vector
del nodo XYZ combinado
al segundo socket. A continuación, haremos nuestra corrección mediante el uso de este nodo
multiplicar vector. Luego usamos la operación de
resta para contar para la
otra corrección, y necesitamos cancelar la operación de
resta que hicimos antes sumando un nodo
matemático vectorial, configurarlo para sumar,
y agregaré el vector que
resté antes, que es el vector que sale del nodo combinado x Si golpeo play,
notarás que la pelota ahora está rebotando de
la pared posterior correctamente Y ahora nuestro
motor de física es consciente
del radio de los
puntos y lo
considerará al
ejecutar la simulación. Sé que podría
parecer que hicimos mucha operación en este video y
eso podría ser abrumador. Pero en caso de que no
entiendas lo que hicimos exactamente, regresa y mira este video
desde el principio e intenta enfocarte un poco e intentar visualizar
lo que está pasando, y te sorprenderá
lo fáciles que son estos conceptos. Sé que puede
parecer muy complicado, sobre todo cuando estoy haciendo las cosas tan rápido,
pero créeme, una vez que lo entiendas, podrás
hacerlo como literalmente ojos vendados porque
entiendes los conceptos detrás Probablemente también nos
reiremos de ti mismo por pensar que eso
también es complicado. Es así como podemos implementar el radio en nuestra simulación, y en este momento solo hay un problema
más que tenemos que resolver, que es cómo hacer que estas
bolas choquen entre sí Eso es lo que vamos a
hacer en el próximo video.
13. Colisión: Colisión. Hola, y bienvenidos al último video técnico sobre cómo crear tu
propio motor de física en blender usando nodos de geometría. Pasamos por mucho, así que
date algo de crédito porque este video podría ser el más complicado hasta ahora. No vamos a
agregar muchos nodos, pero a algunos de ustedes les puede resultar un poco complicado
entender los conceptos detrás de
todas las operaciones que estaremos haciendo en este video. Pero voy a hacer todo lo posible para explicar
todo paso a paso. Y ojalá, si
te enfocas lo suficiente, entenderás
exactamente la lógica de lo que vamos a construir. Aquí es donde nos
detuvimos la última vez, y ahora mismo
sólo estamos tratando con un punto. O una bola. Quiero tener varios. La forma más fácil de evitar
eso será aumentar el número de puntos a
algo así como diez, digamos. Y hagamos que el radio se establezca en algo pequeño como 0.2 metros. Ahora, todas estas bolas
estarán una encima de la otra. Por eso me conectaré
a la posición, un nodo de valor aleatorio, y este nodo asignará una posición aleatoria a cada punto. Y todo lo que necesitas
hacer es darle un intervalo especificando un valor máximo
mínimo, y asignará
un valor aleatorio en ese intervalo para cada punto. Puedes jugar con los valores hasta obtener el
resultado que deseas. Pero en mi caso, terminé usando estos valores para los
valores mínimos menos uno menos uno, tres, y para los valores
máximos, uno, 15. Ahora bien, si
le doy a play, verán que
ahora tenemos diez esferas, pero el mayor problema es
que todos estos cuencos, se cruzan entre
sí. No están colisionando. Le dijimos
a Blender que hiciera
rebotar las bolas de las diferentes paredes, pero no le dijimos que también las hiciera rebotar unas
de otras, y esa es una parte crucial para
construir nuestro propio motor de física. Entonces, ¿cómo podemos hacer tal cosa? Intentemos hacer una lluvia ideas sobre cómo podemos
programar tal cosa Empecemos con
la primera pregunta. Uno ¿
básicamente chocan dos bolas? Porque si conocemos
esa condición, podemos decirle a Blender que, oye, si esta condición
pasa, haz algo. Bueno, te voy a dar la respuesta. Dos bolas chocan cuando la
distancia entre ellas o la distancia entre los centros es menor que el radio
multiplicado por dos Creo que eso debería quedar claro
a partir de esta visualización. Siempre me resulta difícil
pronunciar esa palabra. Esa es la lógica de la
condición que construiremos más adelante. diremos a Blender que siempre calcule la distancia
entre dos puntos, y si la distancia
entre ellos es menor que el radio
multiplicado por dos, eso significa que están colisionando, y deberías hacer
algo al respecto Ahora, vamos a traducir
eso en nodos. Voy a añadir un nodo llamado
índice de más cercano. Este nodo me dará el
índice del punto más cercano. Si salto al espacio de trabajo de
los nodos de geometría, como mencioné
antes, cada punto tiene un índice que se refiere a él. El índice del
nodo más cercano me dará ese índice del
punto más cercano a un punto determinado. Una vez que conozco el índice
del punto más cercano, puedo pedirle a blender que
lea su posición, lo cual se puede hacer agregando un nodo llamado evaluar en índice, que es una manera de decirle a blender. Para ese punto, quiero
que calcules algo. En nuestro caso, queremos conocer
la posición de ese punto. Cambiaré el tipo
de float a vector. Porque la posición es un vector. Añadiré un nodo de posición
y lo conectaré al valor. Ahora el vector
de salida de este evaluar en nodo
índice es el
vector de posición del punto más cercano, punto B, que es el
más cercano a mi punto. La salida del nodo de posición es el
vector de posición del punto A. Una vez que tengo ambos de
estos dos vectores, puedo agregar un nodo matemático vectorial y cambiar la
operación a distancia, y si tapo el
vector que viene del evaluar en índice
y el nodo de posición, Este nodo me dará la
distancia entre ellos. Ahora bien, ¿cómo sé si esos
dos puntos están colisionando? Ya dije la respuesta antes. Si la distancia entre los dos puntos es menor que
el radio multiplicado por dos. Voy a agregar un nodo de radio que
multiplicaré por dos, la distancia debe ser
menor a dos veces el radio. La salida ahora de esta operación
menor que es mi condición para cuando dos
puntos o bolas están colisionando. Ahora hay algo
importante en lo que debemos pensar, el orden de las operaciones. Si ejecutamos
las restricciones de colisión antes o después de la
restricción de bolas ,
piénsalo por un segundo. La respuesta es antes.
Tenemos que contar para colisionar antes de las restricciones de
los muros La razón de ese ser
es que tiene más sentido calcular la colisión antes de que las paredes
toquen las paredes, ya que podrían empujarse
entre sí lejos de las paredes o empujarse entre
sí en las paredes. Una vez que sabemos eso, podemos
ejecutar las restricciones de los muros. Por eso voy a añadir
un nodo set position, y lo voy a enchufar antes la parte donde tenemos
las otras restricciones. Básicamente, justo después del nodo encargado de
actualizar el puesto. Y voy a tapar el resultado
de la operación menor que. Al zócalo de selección
de la nota de posición establecida. Ahora que terminamos de
construir nuestra condición, ahora necesitamos pasar a lo que debería suceder si
esta condición es cierta o lo que debería suceder
si dos bolas chocan Entonces mi pregunta ahora, ¿qué debería pasar si dos bolas chocan? Piénsalo. La respuesta es la siguiente. Si chocan dos bolas, tenemos que
alejarlas una de la otra Eso es algo seguro de
decir, y también creo que es
supergenioso decirlo. Pero hay dos
preguntas importantes que
debemos responder. En primer lugar,
¿por cuánto debemos compensar ambas bolas de estas dos bolas? ¿Es así o se van a
empujar así? Eso es
algo importante de averiguar. Entonces ese es el número uno. Número
dos, a lo largo de qué dirección. Entonces, si
ambas bolas chocan, ¿irían así
o esto o esto o esto o esto? Eso también es
algo importante que necesitamos para
encontrar una manera de
traducirlo a nodos. Por
lo mucho que necesitamos para compensar la posición de los dos
puntos, eso debería ser sencillo. Calcula la distancia
entre los dos puntos, divídala por dos y mueve
cada punto por esa cantidad. Para la dirección, es necesario empujar a lo largo del vector que
cruza ambos puntos. ¿Cómo podemos calcular el vector? Aquí está el
vector de posición para el punto A, y aquí está el
vector de posición para el punto B. Puedo calcular el vector que
los cruza haciendo una operación de
resta, posición del punto
A menos vector de posición
del punto B. Eso me dará
el vector a lo largo cual debería pasar la
posición de desplazamiento Ahora, traduzcamos todos
esos pensamientos en nodos. Empezaré calculando el vector que cruza
los dos puntos. Como dije, esa
será la posición
del punto A menos la
posición del punto B, lo que se puede hacer sumando un nodo matemático vectorial y
configurarlo para restarlo Voy a enchufar la posición en el primer socket y el vector que sale de la evaluar en el índice en el segundo socket? Ese es el vector voy a
mover los dos puntos a lo largo. Ahora pasemos a la cantidad de por cuánto
compensar los dos puntos. Tenemos que calcular esa
distancia dividida por dos, y esa es la cantidad por
cuanto debo compensar cada punto. ¿Cómo puedo calcular la
línea roja? Este es el radio. Este es también el radio, y esta es la distancia
entre los dos puntos. Si hago dos veces el
radio menos la distancia, eso me dará la
longitud de la línea roja o por cuánto se cruzan los dos
puntos Traduzcamos eso en notas. Voy a añadir un conjunto de
notas matemáticas para restar. La operación es dos
veces el radio, menos la distancia
entre los dos puntos. Añadiré otro nodo matemático
y lo configuraré para dividirlo, y yo lo dividiré por dos. El resultado de esto es la
cantidad de compensación. Añadiré un
nodo matemático vectorial, lo cambiaré a escala, y escalaré
el vector a lo largo del
cual quiero que ocurra la
operación, que viene del nodo de resta
vectorial, y lo escalaré por la cantidad viene del nodo de matemáticas
divididas Esto irá directamente al socket
de desplazamiento
del nodo de posición establecida. Y eso es todo.
Así es como puedes construir colisiones en
nuestro motor de física. Ahora bien, si le pego play,
seguirás
notando que las bolas
siguen colisionando. Esta es la parte en la
que puedes empezar a odiarme porque incluso después de toda
esta complicada matemática, todavía no funciona Pero eso lo arreglaremos. Quiero mencionar que no es que lo
que hicimos esté mal, el problema es sobre licuadora. No es culpa nuestra.
Se trata de licuadoras Como mencioné
antes, debido
al
método de integración de engrase utilizado en Blender, necesitamos lidiar con
altos números de error El
método de integración de engrase está bien en el mejor de los casos, y es realmente propenso a errores Entonces, la mejor solución para
hacer nuestra simulación más precisa es en lugar de ejecutar
esta operación solo una vez, si podemos encontrar
una manera de decirle a blender que cada cuadro no solo ejecuta
este motor de física una vez, ejecútelo, por ejemplo, 100 veces. De esa manera
conseguirás un resultado más preciso. En realidad, ya sabes
la respuesta a esta pregunta. ¿Puedes adivinarlo? Rollos de tambor, y está repitiendo zonas. Lo primero de lo que
hablamos en este curso. Lo que haré es agregar una zona de
repetición e insertaré todo
mi sistema de restricciones dentro de la
zona de repetición así. Y ahora desde el primer
nodo de la zona de repetición, puedo especificar cuántas veces
quiero blender para calcular
las restricciones. Sí, Blender ejecutará la
simulación solo una vez, pero puedo especificar
usando la zona de repetición, cuántas veces ejecutar ciertas operaciones
dentro de un fotograma. Eso se llama subpaso. Yo haré, por ejemplo, 50. Ahora, si presiono play, blender, cada fotograma ejecutará
el sistema de colisión 50 veces para obtener un resultado
realmente preciso. Y ahora, como puedes ver, nuestras bolas están colisionando muy bien, y todo está
funcionando sin problemas, y así es como creamos el sistema de colisión
para nuestras bolas En el siguiente video, compartiré algunas reflexiones finales sobre cómo hacer ciertas cosas en
nuestro motor de física.
14. Desove de partículas: desove de partículas. Hola y bienvenidos,
y en este video, vamos a hacer que los puntos se generen
con
el tiempo y no
tenerlos todos a la vez Aquí es donde paramos la última vez. Ahora mismo, nuestra simulación
tiene sólo diez puntos. Digamos que quiero 100 puntos. Si aumento el número de
puntos a 100 y golpeo play, notarás que
la simulación se volverá loca porque cuando
aumentemos el número de puntos, aumentamos la
probabilidad de error, y eso hará que la
simulación sea súper inestable Entonces, ¿cuál es la
solución para eso? Bueno, en nuestra simulación actual, tenemos 100 puntos
desde el principio. ¿Y si
descubrimos una manera de decirle a blender que no tenga 100
puntos desde el principio, sino que los engendremos o los
agregue con el tiempo Eso debería llevar a una simulación
más estable. ¿Cómo podemos hacer eso? Empecemos con la primera parte
que es ¿cómo
decirle a Blender que genere las partículas con
el tiempo?
Eso va a ser sencillo. Todo lo que necesita hacer es agregar un
nodo de geometría de unión y conectarlo como el primer nodo en
la zona de simulación. Tomaré la salida
del nodo de puntos, técnicamente del almacén llamado nodo de
atributo y lo conectaré
al nodo de geometría conjunta. Lo que va a pasar ahora es
que blender sumará más puntos cada vez
que ejecute la simulación. O para ser más precisos, Blender unirá la
geometría anterior con la nueva geometría. A continuación, voy a bajar el
número de puntos a uno, porque si no hago eso, la
licuadora explotará Empezará a tener 100 puntos, y cada fotograma
sumará otros 100 puntos. Se puede ver fácilmente
cómo eso llevará a tener un número loco
de puntos realmente rápido, lo que colapsará el software. Cuando cambio el número
de puntos a uno, Blender solo agregará
un punto por fotograma. En realidad, eso sigue siendo demasiado, y necesitaremos
hacer que una licuadora genere
un punto tal vez cada 20 cuadros Pero antes de que hagamos eso, si le pego play, como pueden ver, Blender está agregando un
nuevo punto a cada fotograma, que sigue siendo demasiado, y sigue llevando a la estimulación sea inestable. La solución será
decirle a blender que T no apunte ni un punto cada fotograma. Tal vez agregue un punto cada
diez fotogramas o 20 fotogramas. Entonces, ¿cómo podemos programar
tal cosa? Comenzaré agregando
un mismo nodo de tiempo. Este nodo o bien me dará el valor de segundos
o el frame am on. Tomaré el
marco y lo conectaré al conteo
del nodo de puntos. Ahora, en el marco uno, licuadora
agregará un punto. En el fotograma dos, Blender
sumará dos puntos, así que tendré tres
puntos y en el fotograma tres, Blender sumará tres puntos, así tendré seis puntos en total. Eso no es lo que quiero.
Quiero decirle a blender que un punto cada cierto
número de fotogramas. Voy a agregar un nodo matemático y lo
configuraré en módulo floored Floord módulo es solo una
forma elegante de decir que este nodo devolverá el resto de una operación de división
por este valor Este nodo
nos permitirá especificar con qué frecuencia queremos
que blender agregue un nuevo punto. También agregaré
otro nodo matemático y lo estableceré para que sea igual a dos, y el valor debería ser cero. Aquí está la lógica de
lo que está sucediendo. Blender tomará el número
del marco amon luego lo
dividirá por este valor, y si el resto
es igual a cero Eso significa que esta condición igual
a es verdadera, lo que significa que este nodo
dará salida a uno, por lo que Blender agregará un punto. Y si el resto no
es igual a cero, eso significa que esta condición igual
dos es falsa, lo que significa que este nodo
dará salida a cero, por lo que blender no agregará ningún punto. Quiere que la licuadora agregue un
punto sobre 20 cuadros. Eso es lo que obtendré
si tecleo 20 aquí. He aquí un ejemplo de
lo que va a pasar. Digamos que estoy en el fotograma 55. Blender dividirá 55 por 20. El resto de la
operación es de 15. 15 no es igual a cero, lo que significa que este nodo
dará salida a cero, y como este nodo va a los recuentos
del nodo de puntos, eso significa que blender
no sumará ningún punto. Ahora, digamos que estoy en el fotograma 60. Blender dividirá 60 por 20. El resto de la
operación es cero, cero es igual a cero, lo que significa que este
nodo dará salida a
uno porque esta
condición es verdadera ahora. Ese irá al socket de conteo de
puntos, y Blender agregará un
punto a la simulación. Creo que ahora la lógica debería estar clara de lo que está sucediendo. Ahora si le pego a play, Blender comenzará a agregar
partículas poco a poco, que es exactamente lo que quiero. Lo último que quiero
hacer es decirle
a blender que genere cada punto en
una dirección diferente Puedo hacer eso asignando un
vector de velocidad inicial aleatorio a cada punto, lo que puede hacer fácilmente
enchufando un nodo de
valor aleatorio en el socket vectorial del atributo de nombre de
tienda definiendo la velocidad inicial Y voy a sumar los valores a menos uno menos 10
para el mínimo, y 110 para el máximo. Es así como podemos hacer que la licuadora
genere las partículas a lo largo del tiempo Piensa que la lógica es súper simple. En el siguiente video,
agregaremos fracción a nuestra simulación.
15. Fricción: Adición de fracción.
Una parte importante de cualquier simulación es la fracción. Sin fricción, las bolas
seguirán rebotando para siempre. Por eso es importante
encontrar una manera decirle
a Blender que humedezca
la simulación con el tiempo Y de hecho ya
tocamos este tema antes, pero lo que haremos en este
video es facilitar
un poco el proceso de cambiar la fricción. Ahora bien, este es nuestro árbol de notas
completo, y lo que planeo
hacer es lo siguiente. Como recordarán, en
las restricciones, tengo la velocidad que se multiplica por menos uno
dependiendo del eje. Si llevo este valor
hasta algo así como -0.8, eso conducirá a más fricción Lo que quiero es
cambiar este valor para todos los diferentes nodos
multiplicados a la vez. Esto es sencillo. Voy a añadir un nodo xy z combinado. Entraré el mismo
valor aquí, uno, uno menos uno y
lo conectaré al vector
del nodo multiplicar. No hice nada elegante, solo
reemplazé el valor en el nodo multiplicar por este nodo
combinado x y z. La razón por la que hice eso
es que ahora puedo agregar un nodo de entrada de grupo y tomar el eje z y conectarlo
a la entrada de grupo. Ahora bien, si voy a la puñalada
modificadora, verás que desde aquí puedo
cambiar el valor Además, es importante tener en cuenta que solo estaré
cambiando el valor
para los ejes z porque ese es el zócalo enchufado
a la entrada del grupo Para el resto de los enchufes,
se quedarán uno. Esto facilitará el
proceso de cambiar los valores de
fricción de manera más fácil. Ahora, necesito hacer lo mismo para todas las diferentes
restricciones. Comenzaré
haciéndolo para el muro derecho, agregaré un nodo combinado x Y Z y agregaré una entrada de grupo. Pasaré a la pared izquierda, agregaré un x y zende combinado
con los mismos valores, y agregaré entrada de grupo Voy a hacer lo mismo también por la pared frontal ahora mismo. Por último, haré
lo mismo por la pared trasera. S. Y ahora puedo controlar la
fricción fácilmente desde aquí. También puedo abrir la barra lateral
golpeando n y el editor de nodos de
geometría, seleccionar una de las entradas de grupo, y puedes hacer doble clic
para cambiar el nombre de esta propiedad a
algo así como fricción. Para mi simulación, voy a establecer el valor de fricción en -0.9 Otra forma de agregar fracción
es volviendo al almacén llamado
nodo atributo definiendo la velocidad, y si agrego un
nodo matemático vectorial y lo configuro a escala, podré amortiguar la velocidad en
toda la simulación Es como una fricción global
que aplicará cada cuadro. Incluso puedo agregar una
entrada de grupo y conectarla ahí, cambiar su nombre a fricción
global. Lo estableceré en 0.99. La simulación
perderá velocidad un factor de 1% cada fotograma. Además, podría ser útil
cambiar el número de pasos de la zona
de repetición del paso modificador. Por eso
también lo conectaré a un nodo de entrada de grupo y lo llamaré, por ejemplo, sub pasos, y lo pondré en 20. Esos son los valores que
utilizo para el render promocional. Por último, estableceré mi velocidad de
fotogramas en 120, así tendré una velocidad de fotogramas muy
fluida, y mi simulación
será menos propensa a errores. Para el rango de fotogramas,
digamos que quiero un render de diez segundos, lo que significa que mi rango de fotogramas
será de hasta 1,200 fotogramas. Si pulso play, nuestra simulación
está funcionando sin problemas. Eso es todo, todos
por este video. Técnicamente
terminamos todo. En la siguiente, te
mostraré cómo
creé la escena final
y cómo renderizarla.
16. Descripción final: Hola otra vez. En la última vez. Este es el último video de construir nuestro propio
motor de física en Blender. Este video es un resumen, recorta una vista de pájaro sobre todo lo que hicimos
hasta este punto Lo primero con lo
que voy a empezar en este video es nuestro notario, porque actualmente
es un lío absoluto. Si decides volver a
este proyecto en el futuro, probablemente
te perderás en la C de todos estos
diferentes nodos. Por eso empezaré por organizar y
etiquetar al notario, y luego
pasaré al resumen Bien, bienvenido de nuevo a Blender, y esto es todo mi no intento, y es un desastre honestamente. Voy a golpear la barra espaciadora de
Control para maximizar este editor. Como puedes ver,
hay muchos nodos, y sobre todo en el futuro, va a ser difícil entender
realmente lo que está sucediendo porque
no etiquetamos nuestra nota try. Lo que vamos a hacer en este
video, como mencioné, es, primer lugar, comenzar por
organizar nuestro árbol de notas. Voy a ir al inicio
de la nota tratar. Voy a seleccionar
todos estos nodos, golpear Control G para crear
una etiqueta alrededor de ellos, golpear F dos para un nombre,
y llamémoslo, por ejemplo, condición inicial. Una vez que tenemos nuestra condición
inicial, ingresamos a la zona de simulación. Tenemos esta geometría de articulación encargada de sumar
puntos a lo largo del tiempo. Después de eso, definimos la aceleración usando
este atributo nombrado, y se relaciona con la
escala y este nodo vectorial. Asegúrate de seleccionar
los tres. Golpea Control G, F dos por un nombre, y
llamémoslos aceleración. A continuación, tendrás
el
atributo store named responsable de
definir la velocidad. Vamos a moverlo aquí. Lo mismo. Pongamos todos estos nodos uno
encima del otro
así apilándolos. Selecciona todos estos nodos, controla G y F dos para un nombre, y llamémoslo
velocidad porque estamos definiendo la velocidad
usando estos nodos. A continuación, estamos actualizando
la posición usando el nodo set position, así que apile los nodos
entre sí. Selecciónalos, controla G, F dos, y llamémoslos actualización de
posición. Después de eso, entramos en
la zona de repetición, que se encarga compilar todas las
diferentes restricciones Pongamos este nodo por aquí. En realidad, voy a
moverlo hacia arriba, pero vamos a
tratar de encontrar una solución en todo
este lío de aquí mismo. En realidad, para
facilitar todo
el proceso y tener más espacio, comenzaré a organizar
estos nodos desde el final. Voy a tener estos nodos que se encargan de transformar
los puntos en las esferas, así seleccionaré todos ellos, Control G para crear una etiqueta, F dos por un nombre,
y llamémoslo, por
ejemplo, instancer Mueva estos hacia atrás.
Mueva esto también hacia atrás. Cuanta menos restricción
tengo aquí, es la restricción
para la pared posterior. Vamos a seleccionarlo por completo, que deberían ser todos
estos nodos. Vamos a organizarlos. En primer lugar,
tendrás estos nodos en la parte superior. Voy a tomar Control G, y esta es mi condición. Organicemos estos
nodos aquí mismo. Algo así. A lo mejor trabajarás. Y luego
elige todos estos nodos, Control G, F dos por un nombre, y llamémoslo strant de pared
posterior A continuación, tendrás esto. Haz algo similar,
selecciona estos, Control G y F dos, y llamémoslo condición. A continuación, voy a mover
estos nodos aquí. Este de aquí, aquí,
estos de aquí. Seleccione todos ellos. Controle
G, F dos para un nombre, y llamémoslos restricción de pared
frontal. Ahora a la restricción de muro izquierdo, todos estos nodos, seleccione estos control
G F dos condición. Siguiente, está aquí, esta de
aquí y esta de aquí. Seleccione todo el árbol de
notas, control G, F dos, muro izquierdo, restricción. Ahora a la restricción de
pared derecha, Control G, F dos condición, mover estos nodos aquí. Lo mismo para éste y
éste, entonces así. A continuación, seleccione todos
ellos, control G, F dos, restricción de muro derecho. Por último, la restricción de suelo, que son estos nodos. Haremos algo similar. Seleccione la condición de control
G, F dos. Mueva estos aquí, para la posición,
para la velocidad, lo siento, y seleccione todos estos. Control G F restricción de dos
pisos. Estas son las
diferentes restricciones, y por último, tendrás
el sistema de colisión. Tratemos de encontrar una manera de
organizar todos estos. Voy a
seleccionarlos a todos y mover todo hacia abajo. Creo que esto va a ser mejor. Pongamos este
aquí y tal vez
movamos la zona p y todos estos nodos
ligeramente hacia la izquierda, y luego seleccionemos todos
estos Control G F dos, y se le llama colisión. Este es mi grupo de colisiones. Y trae este insumo grupal, esto un poco así. Y al hacer esto,
organizamos nuestro árbol de nodos. En el futuro, si
vuelves a esto, sabrás exactamente qué está haciendo
cada grupo de nodos. Porque los etiquetamos. Además, cuando tomas
esta vista de pájaro en todo el árbol de nodos, empiezas a ver la lógica
detrás de todo lo que hicimos. Como resumen final, aquí está la lógica de
todo lo que construimos. En primer lugar, comenzamos
definiendo las condiciones iniciales, cuántos puntos tenemos, cuándo queremos generar
puntos, y todo eso Estos puntos posteriormente
ingresarán a la zona de simulación. Lo primero que
hacemos aquí es definir la aceleración y luego
definir la velocidad. Que ambos usamos para actualizar
la posición de nuestros puntos. Una vez que tengamos esta configuración básica, podemos empezar a pensar en
diferentes restricciones. Para nuestro motor de física, hay dos tipos de
restricciones que nos importan. La primera es
la colisión, que es la colisión entre
las distintas esferas, y luego las diferentes
paredes, que son el piso, la pared derecha y trasera, y la pared izquierda y frontal. Y al final del árbol de notas, utilizamos esta instancia
en nodo de puntos para transformar esos puntos
en una geometría real, que en nuestro caso pasó
a ser esfera EUV Y sin embargo, Este es
todo nuestro motor de física. Y si, eso es
básicamente todo por cómo
puedes construir tu propio
motor de física en licuadora. Ahora puedes crear
una escena alrededor la simulación y
renderizarla como quieras. Además, dado que el sombreado y animación están más allá del
alcance de las partituras, y quería que el curso fuera conciso y que se tratara de nodos
de geometría Por eso hice un
video gratis bonus que puedes ver, donde te llevo paso a paso
sobre cómo creé mi render. Puedes ver ya sea
desde el enlace en la descripción o
yendo a mi sitio web. La parte del nodo de geometría y la parte de afeitado son disciplinas bastante
diferentes, y por eso tenía
más sentido mantenerlas como cosas
separadas ya que tomo diferentes enfoques en la
enseñanza de ambas. Por último, gracias por
sintonizar este curso. Espero que hayas aprendido mucho. Si te ha resultado útil este curso, por favor déjanos una buena reseña que nos ayude a hacer
mejores cursos, y aún puedes consultar el
resto de mis cursos aquí. Muchas gracias,
y te veré o.