Resultados 1 al 7 de 7

Tema: Restricción de distancia entre objetos en Blender

  1. #1
    Fecha de ingreso
    Jul 2022
    Mensajes
    4

    Restricción de distancia entre objetos en Blender

    Hola, amigos. Me gustaría saber si hay alguna forma de establecer distancia entre varios objetos. Necesito que todos los objetos que tengo en escena estén a una distancia específica entre sí. Sé que existe la restricción de distancia, pero como allí debo seleccionar un objeto específico que quiero mantener esa distancia, no me sirve. Yo necesito algo más general, que en la escena todos los objetos tengan una distancia mínima entre ellos, entre todos los objetos de la escena, no solo uno en específico. Espero puedan ayudarme. Muchas gracias.

  2. #2
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Script Python para mantener la distancia entre objetos

    Podrías intentarlo con un script Python que debería establecer de forma automatizada la distancia entre objetos.

    Código:
    import bpy
    
    def mantener_distancia(objetos, distancia_minima):
        for objeto in objetos:
            for otro_objeto in objetos:
                if objeto != otro_objeto:
                    distancia = objeto.location.distance_to(otro_objeto.location)
                    if distancia < distancia_minima:
                        objeto.location += otro_objeto.location - objeto.location * (distancia_minima - distancia)
    
    if __name__ == "__main__":
        objetos = bpy.data.objects
        distancia_minima = 5
        mantener_distancia(objetos, distancia_minima)
    Este código itera sobre todos los objetos de la escena y calcula la distancia entre cada par de objetos. Si la distancia es menor que la distancia mínima deseada, el script mueve uno de los objetos para que se aleje del otro.

    Para utilizar este script, simplemente agrega el código a un archivo de Python. Luego, puedes ejecutar el script desde el menú Scripting > Run Script.

    Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  3. #3
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Restringir distancia entre objetos mediante nodos

    Se puede hacer lo mismo mediante nodos. Para ello, podemos utilizar el nodo Distance para calcular la distancia entre dos objetos. Luego, podemos utilizar el nodo Vector Math para mover uno de los objetos para que se aleje del otro.

    Aquí hay un ejemplo de cómo hacerlo:

    • Crea una escena con varios objetos.
    • Crea un nuevo nodo Geometry para cada objeto.
    • Conecta los nodos Geometry al nodo Distance.
    • En el nodo Distance, especifica el objeto al que quieres mover.
    • Conecta el nodo Distance al nodo Vector Math.
    • En el nodo Vector Math, especifica la distancia mínima deseada.
    • Conecta el nodo Vector Math al nodo Transform del objeto que desea mover.
    • En el nodo Transform, especifica el eje en el que quieres mover el objeto.


    El nodo Distance calculará la distancia entre el objeto actual y el objeto especificado. El nodo Vector Math calculará el vector que apunta desde el objeto actual al objeto especificado. El nodo Transform moverá el objeto actual en la dirección del vector calculado.


    Sí, se puede hacer lo mismo mediante nodos. Para ello, podemos utilizar el nodo Distance para calcular la distancia entre dos objetos. Luego, podemos utilizar el nodo Vector Math para mover uno de los objetos para que se aleje del otro.

    Aquí hay un ejemplo de cómo hacerlo:

    • Cree una escena con varios objetos.
    • Cree un nuevo nodo Geometry para cada objeto.
    • Conecte los nodos Geometry al nodo Distance.
    • En el nodo Distance, especifique el objeto al que desea mover.
    • Conecte el nodo Distance al nodo Vector Math.
    • En el nodo Vector Math, especifique la distancia mínima deseada.
    • Conecte el nodo Vector Math al nodo Transform del objeto que desea mover.
    • En el nodo Transform, especifique el eje en el que desea mover el objeto.


    El nodo Distance calculará la distancia entre el objeto actual y el objeto especificado. El nodo Vector Math calculará el vector que apunta desde el objeto actual al objeto especificado. El nodo Transform moverá el objeto actual en la dirección del vector calculado.

    Aquí hay un ejemplo de un árbol de nodos que puedes utilizar:

    Código:
    Geometry(object1) --> Distance --> Vector Math --> Transform(object1)
    Geometry(object2) --> Distance --> Vector Math --> Transform(object2)
    Este árbol de nodos moverá los objetos 1 y 2 para que se mantengan a una distancia mínima de 5 unidades.

    Este es solo un ejemplo. Se puede modificar el árbol de nodos para adaptarlo a tus necesidades específicas. Por ejemplo, puedes agregar una lógica para evitar que los objetos se choquen entre sí.

    Otras opciones

    Además del método mencionado anteriormente, también puede utilizar los nodos Point Instancer o Instancer para establecer distancia entre varios objetos.

    Point Instancer

    El nodo Point Instancer puede utilizarse para crear una instancia de un objeto en cada punto de un objeto base. Puedes utilizar este nodo para crear una distribución uniforme de objetos.

    Instancer

    El nodo Instancer puede utilizarse para crear una instancia de un objeto en cada punto de un objeto base. Puedes utilizar este nodo para crear una distribución personalizada de objetos.

    Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  4. #4
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Adecuar la distancia entre objetos mediante Point Instancer

    El nodo Point Instancer puede utilizarse para crear una instancia de un objeto en cada punto de un objeto base. Puedes utilizar este nodo para crear una distribución uniforme de objetos.

    Para establecer distancia entre objetos con Point Instancer, sigue estos pasos:

    • Crea una escena con varios objetos.
    • Crea un nuevo objeto de forma base.
    • Crea un nodo Point Instancer.
    • Conecta el objeto de forma base a la entrada Object del nodo Point Instancer.
    • Conecta el objeto que deseas mover a la entrada Instance Object del nodo Point Instancer.
    • En el nodo Point Instancer, especifica la distancia mínima deseada en la entrada Distance.
    • Coloca el nodo Point Instancer en la escena.


    El nodo Point Instancer creará una instancia del objeto especificado en cada punto del objeto de forma base. La distancia entre cada instancia y el objeto de forma base será la distancia mínima especificada.

    Aquí hay un ejemplo de cómo hacerlo:

    • Crea una escena con dos objetos, un cubo y una esfera.
    • Crea un nuevo objeto de forma base, un plano.
    • Crea un nodo Point Instancer.
    • Conecta el plano al nodo Point Instancer.
    • Conecta el cubo al nodo Point Instancer.
    • En el nodo Point Instancer, especifica una distancia mínima de 5 unidades.
    • Coloca el nodo Point Instancer en la escena.


    El resultado será que el nodo Point Instancer creará 10 instancias del cubo en el plano, espaciadas a una distancia de 5 unidades entre sí.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  5. #5
    Fecha de ingreso
    Aug 2004
    Mensajes
    22,247


    Código:
    import bpy
    import math
    
    
    # Lista de objetos seleccionados
    selected_objects = bpy.context.selected_objects
    
    
    if len(selected_objects) < 2:
        print("Selecciona al menos dos objetos para mantener la distancia.")
    else:
        # Ordena los objetos por su posición en el eje especificado
        selected_objects.sort(key=lambda obj: obj.location[0])  # Cambia [0] al eje que desees alinear (0:X, 1:Y, 2:Z)
    
    
        # Distancia deseada entre los objetos
        desired_distance = 5.0  # Cambia esto al valor de distancia que desees
    
    
        # Posiciona los objetos para mantener la distancia deseada
        for i in range(1, len(selected_objects)):
            obj = selected_objects[i]
            prev_obj = selected_objects[i - 1]
    
    
            # Calcula la distancia actual entre los objetos
            current_distance = (obj.location - prev_obj.location).length
    
    
            # Calcula el desplazamiento necesario para mantener la distancia deseada
            displacement = (desired_distance - current_distance)
    
    
            # Aplica el desplazamiento al objeto actual
            obj.location.x += displacement
    Archivos adjuntados Archivos adjuntados

  6. #6
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Auto-Distance Between Objects

    El código que puse al principio, es el que se utilizaba en el addon Auto-Distance Between Objects, que ya no está disponible para descarga en GitHub, da error, pero supongo que según la versión que utilicemos, funcionará o no.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  7. #7
    Fecha de ingreso
    Aug 2004
    Mensajes
    22,247
    Cita Iniciado por 3dpoder Ver mensaje
    El código que puse al principio, es el que se utilizaba en el addon Auto-Distance Between Objects, que ya no está disponible para descarga en GitHub, da error, pero supongo que según la versión que utilicemos, funcionará o no.
    El problema es ese, que como han ido cambiando los valores de Python, los scripts más antiguos ya no valen para versiones modernas...

Temas similares

  1. Proporciones reales entre objetos en Blender
    Por haiku en el foro Modelado
    Respuestas: 2
    : 18-09-2016, 10:00
  2. Respuestas: 7
    : 13-07-2015, 06:44
  3. Misma distancia entre vértices
    Por Nanomix80 en el foro Modelado
    Respuestas: 1
    : 22-12-2012, 17:22
  4. 3dsMax Restringir distancia entre dos dummys
    Por Dinki en el foro Animación y Rigging
    Respuestas: 1
    : 06-06-2012, 19:50
  5. Copy paste de objetos entre instancias de Blender
    Por Caronte en el foro Plugins
    Respuestas: 2
    : 19-09-2005, 08:06

Etiquetas para este tema