Resultados 1 al 2 de 2

Optimización de modelos 3d en vrml

  1. #1
    Fecha de ingreso
    Feb 2009
    Mensajes
    1

    Post Optimización de modelos 3d en vrml

    Hola a todos/as, necesito ayuda con un modelo 3d en vrml que estoy haciendo (si, todavía no me he pasado al X3D). Quiero optimizarlo dado el gran volumen de polígonos texturizados que contiene. Se trata de un edificio y su entorno.

    Tengo modelado el interior y el exterior en ficheros.wrl distintos. Estos a su vez llaman a otros ficheros.wrl que.

    Que contienen los objetos modelado, a través del nodo inline. Lo que quiero es que cuando el observador se encuentre fuera del edificio no se cargue.

    El interior, para hacer la navegación más rápida.

    He probado el nodo Lod (level of detail) pero este se basa en intervalos de distancia respecto de un punto.

    Y por lo tanto, localiza al observador por medio de esferas concéntricas, con lo que tengo que rodear el interior del edificio con una esfera.

    Para que, mientras no me encuentre dentro de esa esfera, no se cargue el modelo del interior. Esto significa que si me acerco por fuera a una de.

    Las fachadas del edificio, el interior se cargara sin que este el observador dentro, y la escena se ralentiza.

    Lo que necesito entonces es algo como que un sensor proximitysensor detecte la presencia del observador dentro del edificio y cargue entonces.

    El modelo del interior.

    El sensor de visibilidad visibilitysensor no me sirve ya que no detecta los polígonos que rodean la geometría a la que se aplica el sensor, de manera.

    Que cada vez que el observador mira en dirección al edificio, se carga el interior, aunque estemos fuera.

    En el fichero principal, el que llama al modelo interior y al modelo exterior, es donde tendría que estar el script, o el sensor, que permitiera cargar.

    El interior solo cuando estamos dentro del edificio. El problema es encontrar la forma de que el código vrml que llama al modelo interior, no sea leído, o no se ejecute.

    Hasta que el observador este dentro del edificio.

    Este es el código que llama al interior.

    Def interior transform { tchildren [ tdef interior inline { url [ interior.wrl ] t} t].
    }.

    Mi idea era conseguir que este código no se leyera-cargara hasta que el evento isactive de un sensor de proximidad lo activara, pero.

    No lo he logrado.

    Por otra parte, encontré esto, que podría adaptarse para hacer lo que necesito:
    Def car_position transform {.

    Translation -4 2 0.
    }.

    Transform {.

    Translation -1.5.5 4.5.

    Children [.

    Shape {.

    Appearance appearance {.

    Material material { emissivecolor 0 0.6 }.
    }.

    Geometry cylinder {.

    Height 1.

    Bottomradius 0.5.
    }.
    }.

    Def car_touch touchsensor {}.
    }.

    Def add_car script {.

    Field sfbol pointer_over false.

    Field sfbol done false.

    Field mfstring car_url p51.wrl.

    Field sfnode car_pues use car_position.

    Eventin sfbol isclicked.

    Eventin sfbol isover.

    Url javascript:
    Function isclicked(button_pos) {.
    // the following two if statements should be combined.
    // together with && but Cosmoplayer did not like it -bug.

    If(button_pues == 0).
    {.

    If((pointer_over == 1) && (done == 0)).
    {.

    Browser, createvrmlfromurl(car_url.

    Car_pos, add_children).

    Done = 1.
    }.
    }.
    }.

    Function isover(value) {.

    If(value == 0).

    Pointer_over = 0.

    Else.

    Pointer_over = 1.
    }.
    }.
    # the car addition routes.

    Route car_touch, isactive to add_car, isclicked.

    Route car_touch, isover todo add_car, isover.
    ************************************************** ****.

    Este código carga un coche a partir de un touch sensor. Pero no me funciona. Primero me dice que add_children is not a field of script.

    Si le quito las comillas a add_children, se abre el.wrl, pero al pinchar en el cilindro me dice add_children is not defined.

    No entiendo nada. Alguien puede ayudarme? Gracias de antemano.
    Última edición por anmusan; 07-02-2009 a las 12:20

  2. #2
    Fecha de ingreso
    Dec 2025
    Mensajes
    0
    Tu problema requiere una solución específica en VRML ya que trabajas con este formato. El enfoque correcto es usar un ProximitySensor combinado con un Script para controlar la carga dinámica del modelo interior. El código que encontraste tiene errores de sintaxis y referencia. Aquí está la solución corregida y adaptada a tu caso.

    Primero, define el ProximitySensor que delimite el volumen interior de tu edificio. Colócalo en la misma posición y con el tamaño que abarque el espacio interior donde quieres que se cargue el modelo.

    Definirías el sensor así:
    DEF interior_sensor ProximitySensor {
    size X Y Z
    center X Y Z
    }

    Donde size son las dimensiones del área y center su posición central. Este sensor generará eventos isActive TRUE cuando el observador entre en su volumen y FALSE cuando salga.

    Luego necesitas un Script que controle la carga del archivo interior.wrl. El error en el código que viste era que add_children no es un campo válido. Debes usar la función addChildren (con mayúscula) que es un método estándar de un nodo Group. El script debe recibir el evento del sensor y cargar el modelo solo cuando el observador entre.

    El código principal quedaría estructurado así:

    DEF interior_loader Script {
    field SFBool loaded FALSE
    field MFString interior_url "interior.wrl"
    field SFNode interior_container NULL
    eventIn SFBool sensor_activated
    url "javascript:
    function sensor_activated(value, timestamp) {
    if (value == true && loaded == false) {
    Browser.createVrmlFromUrl(interior_url, interior_container, 'addChildren');
    loaded = true;
    }
    }"
    }

    Necesitas un nodo contenedor vacío donde se insertará el modelo cargado. Este contenedor es un Group o Transform que estará en la escena desde el principio, pero vacío.

    Transform {
    translation ... (posiciona tu modelo interior aquí)
    children [
    DEF interior_container Group { }
    ]
    }

    Finalmente, conectas las rutas. La ruta lleva el evento isActive del ProximitySensor al evento sensor_activated del Script.

    ROUTE interior_sensor.isActive TO interior_loader.sensor_activated

    Con este sistema, el interior.wrl solo se cargará la primera vez que el observador entre en el volumen definido por el ProximitySensor. El modelo permanecerá cargado después. Si quieres que se descargue al salir, el script sería más complejo, necesitarías usar Browser.replaceWorld o manipular la escena para eliminar los hijos, lo cual es menos eficiente.

    Respecto a tu código fallido, el error add_children is not a field se debe a que en la llamada a createVrmlFromUrl el tercer parámetro debe ser el nombre del eventoIn del nodo contenedor que añadirá los hijos. El nombre correcto es addChildren. Además, el nodo contenedor (car_pos en tu ejemplo) debe ser una referencia válida a un nodo de tipo Group o Transform con un eventoIn llamado addChildren, que todos estos nodos tienen por defecto.

    Para optimizar aún más, considera migrar a X3D. Los navegadores modernos y herramientas actuales como X3DOM o x_ite ofrecen mejor rendimiento y más opciones de optimización, como la carga asíncrona de recursos y LOD más avanzados. Puedes convertir tus modelos VRML a X3D con herramientas como view3dscene o Instant Reality Converter.

Temas similares

  1. Hardware Optimizacion muy lenta
    Por rgisbert en el foro Hardware
    Respuestas: 2
    : 30-01-2024, 23:30
  2. Esta es mi pagina... Mantenimiento y optimización web
    Por Andres_ en el foro Esta es mi página...
    Respuestas: 0
    : 16-11-2020, 17:30
  3. Hardware Optimización PC Revit 3ds Max
    Por tomy3d en el foro Hardware
    Respuestas: 3
    : 20-08-2018, 23:53
  4. Respuestas: 2
    : 08-09-2010, 15:59
  5. Hardware Optimización equipo
    Por Hulkong en el foro Hardware
    Respuestas: 14
    : 09-04-2009, 20:09