Mis tribulaciones sobre un motor isométrico

Avatar de Usuario
Kyp
Mensajes: 413
Registrado: 03 Oct 2013 17:13
Agradecido : 20 veces
Agradecimiento recibido: 85 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Kyp » 17 Sep 2019 19:39

Último mensaje de la página anterior:

Chema escribió:Sobre todo, dice, hay un problema con los bloques demasiado altos y pone este ejemplo:
Jon-1.png

Note the example above, no one block is fully in front of another, the only way to sort them is to have the tall object split into two parts.
Básicamente que el bloque alto hay que dividirlo en dos partes porque si no no hay manera de ordenarlos.

Ese mismo dibujo me hice yo -rofl

Chema escribió:Si os fijáis lo mismo ocurre si el bloque alto fuese la mitad de alto, pero estuviese a media altura (parte oculto, parte no). Creo que eso ilustra el único caso en que mi bucle anterior falla.

Exacto.

Chema escribió:Supongo que es posible dividir sobre la marcha cualquier bloque que esté entre dos capas en dos bloques más pequeños, de manera que pintando por capas todo vaya bien. Incluso es posible hacer esto más o menos rápidamente.

En algo así estaba pensando yo también. Ahora estoy liado con otras cosas pero me están entrando unas ganas de retomar este tema...

Avatar de Usuario
Jinks
Mensajes: 1665
Registrado: 09 Oct 2013 16:47
Agradecido : 143 veces
Agradecimiento recibido: 172 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Jinks » 17 Sep 2019 20:53

Chema escribió:Supongo que es posible dividir sobre la marcha cualquier bloque que esté entre dos capas en dos bloques más pequeños, de manera que pintando por capas todo vaya bien. Incluso es posible hacer esto más o menos rápidamente.


Todo lo que escribí yo era suponiendo que todos los bloques tienen el mismo tamaño (una unidad en cada dimensión).

En ese caso no ocurre nunca el problema de la intransitividad de la relación "detrás de", o como se quiera llamar, y no necesitarías descomponer los elementos que se encuentren en posiciones intermedias (aunque necesitas un sistema de coordenadas en el que puedas especificar posiciones intermedias).

Aunque aparece un nuevo problema: Al dividir un bloque en 2 (por ejemplo: una mesa del Knight Lore) hay que marcarlos de alguna manera para saber que van juntos, no vaya a ser que al empujarla, media mesa se desplace y la otra media mesa se quede en su sitio.

En resumen: Cuando todos los bloques son del mismo tamaño creas un nuevo problema, pero te quitas 2.

Avatar de Usuario
explorer
Mensajes: 326
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 7 veces
Agradecimiento recibido: 293 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor explorer » 18 Sep 2019 00:19

En el Knight Lore la rejilla tiene 16×16 para colocar todos los objetos (las paredes del fondo y las puertas también son objetos que están colocados en la rejilla, aunque parezca que están fuera de ella. Se hace así para que el algoritmo de pintado sea más sencillo y no tenga en cuenta muchas excepciones (el suelo y las paredes siempre se pintarían antes) y dejarlo solo en un tema de qué objeto debo pintar (si la pared no se ha movido, no tengo que redibujarlo salvo cuando un objeto/personaje pase por delante).

Y sí que hay posiciones intermedias. No lo he mirado en el código porque me he centrado en el dibujado, pero todo ese tema y las colisiones en 3D se gestionan antes del proceso de pintado, así como el movimiento de objetos de más de una "unidad" de volumen, o la física (bloques inanimados encima de personajes o bandas transportadoras, o "empujones" o "golpes" laterales, o la gravedad).

Avatar de Usuario
flopping
Mensajes: 2346
Registrado: 26 Jun 2011 17:50
Agradecido : 1 vez
Agradecimiento recibido: 47 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor flopping » 18 Sep 2019 01:21

No me extraña que en su época esté tipo de juegos causará sensación, si hoy día es dificil de reproducir y se debate sobre cómo se hizo, imaginar cuando salió, vamos toda una revolución.

Aunque el “primer” juego “3D” que vi fue el de ant attack, vale no es 3D “puro”, es perspectiva isometrica, pero también fue una pasada para su época.
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide que padezco.
(C) 1982-2019, 37 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Avatar de Usuario
Kyp
Mensajes: 413
Registrado: 03 Oct 2013 17:13
Agradecido : 20 veces
Agradecimiento recibido: 85 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Kyp » 18 Sep 2019 09:42

Jinks escribió:
Chema escribió:Supongo que es posible dividir sobre la marcha cualquier bloque que esté entre dos capas en dos bloques más pequeños, de manera que pintando por capas todo vaya bien. Incluso es posible hacer esto más o menos rápidamente.


Todo lo que escribí yo era suponiendo que todos los bloques tienen el mismo tamaño (una unidad en cada dimensión).

En ese caso no ocurre nunca el problema de la intransitividad de la relación "detrás de", o como se quiera llamar, y no necesitarías descomponer los elementos que se encuentren en posiciones intermedias (aunque necesitas un sistema de coordenadas en el que puedas especificar posiciones intermedias).

Aunque aparece un nuevo problema: Al dividir un bloque en 2 (por ejemplo: una mesa del Knight Lore) hay que marcarlos de alguna manera para saber que van juntos, no vaya a ser que al empujarla, media mesa se desplace y la otra media mesa se quede en su sitio.

En resumen: Cuando todos los bloques son del mismo tamaño creas un nuevo problema, pero te quitas 2.

El problema de la intransitividad también puede aparecer en el caso de que todos los bloques tengan el mismo tamaño:
Captura.PNG
Captura.PNG (12.54 KiB) Visto 919 veces

Vale, es un poco rebuscado pero poder puede ocurrir -grin

La solución de vividir los bloques tendría que ser solo para pintarlos, para el movimiento o la física no se pueden dividir porque el sistema que se usa de 'transmitir el movimiento al objeto empujado' haría cosas raras si está dividido. Los bloques tienen que moverse como un todo.

Avatar de Usuario
Jinks
Mensajes: 1665
Registrado: 09 Oct 2013 16:47
Agradecido : 143 veces
Agradecimiento recibido: 172 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Jinks » 18 Sep 2019 12:43

Kyp escribió:El problema de la intransitividad también puede aparecer en el caso de que todos los bloques tengan el mismo tamaño

Es verdad. Aunque creo que sólo puede ocurrir si al menos 2 bloques están en posiciones intermedias. Lo cual puede ocurrir con más de un objeto móvil (por ejemplo: el protagonista y un "malo").

Avatar de Usuario
Jinks
Mensajes: 1665
Registrado: 09 Oct 2013 16:47
Agradecido : 143 veces
Agradecimiento recibido: 172 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Jinks » 18 Sep 2019 12:53

Estaba pensando si hay algún juego en perspectiva isométrica que permita situar la cámara en cualquiera de las 4 direcciones. Lo cual obligaría a tener la definición de cada objeto (*) desde 4 perspectivas distintas, pero sería muy chulo y daría más impresión de 3D. Teniendo clara la manera de representar los objetos en orden, creo que sería muy fácil hacerlo.

(*) En realidad no supondría demasiado, porque incluso con "cámara fija" ya hay que tener las 4 caras del protagonista y de todos los "malos", y para el resto de objetos normalmente hay que tener 2 caras, siendo las 2 que faltan iguales en muchos casos al ser objetos simétricos (por ejemplo las mesas).

Avatar de Usuario
kikems
Mensajes: 3423
Registrado: 30 May 2013 19:23
Agradecido : 999 veces
Agradecimiento recibido: 1368 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor kikems » 18 Sep 2019 13:12

Jinks escribió:Estaba pensando si hay algún juego en perspectiva isométrica que permita situar la cámara en cualquiera de las 4 direcciones. Lo cual obligaría a tener la definición de cada objeto (*) desde 4 perspectivas distintas, pero sería muy chulo y daría más impresión de 3D. Teniendo clara la manera de representar los objetos en orden, creo que sería muy fácil hacerlo.

(*) En realidad no supondría demasiado, porque incluso con "cámara fija" ya hay que tener las 4 caras del protagonista y de todos los "malos", y para el resto de objetos normalmente hay que tener 2 caras, siendo las 2 que faltan iguales en muchos casos al ser objetos simétricos (por ejemplo las mesas).


Recuerdo algún juego en el que pulsando una tecla podías ver el mismo escenario desde 4 ángulos diferentes.

Avatar de Usuario
Kyp
Mensajes: 413
Registrado: 03 Oct 2013 17:13
Agradecido : 20 veces
Agradecimiento recibido: 85 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Kyp » 18 Sep 2019 17:33

Me suena que el Ant Attack lo hace, pero no creo que valga como ejemplo, son unos gráficos demasiado sencillos -507

Avatar de Usuario
kikems
Mensajes: 3423
Registrado: 30 May 2013 19:23
Agradecido : 999 veces
Agradecimiento recibido: 1368 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor kikems » 18 Sep 2019 20:56

Kyp escribió:Me suena que el Ant Attack lo hace, pero no creo que valga como ejemplo, son unos gráficos demasiado sencillos -507


Si, creo q era el ant attack.

Avatar de Usuario
Jinks
Mensajes: 1665
Registrado: 09 Oct 2013 16:47
Agradecido : 143 veces
Agradecimiento recibido: 172 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Jinks » 18 Sep 2019 21:25

Sencillos o no, si el primer juego isométrico (o uno de los primeros) ya ofrecía esta posibilidad, fue un adelantado, porque no creo que después se hicieran muchos así.

En el Ant Attack todos los bloques estáticos eran simétricos y los muñecos necesitaban estar definidos en sus 4 caras incluso para cámara única, así que no necesitaron definir gráficos extra para verse desde las 4 direcciones.

Avatar de Usuario
explorer
Mensajes: 326
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 7 veces
Agradecimiento recibido: 293 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor explorer » 18 Sep 2019 21:57

He encontrado una página donde da una solución al problema de pintar cajas en planos isométricos.

Curiosamente... la idea es casi la misma que se usa en el Filmation, pero agregándole el cálculo de la colisión de los hexágonos en 2D que los cubos en 3D generan:
Imagen
Pero el cálculo de la coincidencia en pantalla no la hace igual que en otro artículo donde otro autor supone cómo funciona Filmation.

En los dos casos, se calcula si esos hexágonos coinciden (los dos objetos coinciden en pantalla). Si no es el caso, da igual el orden de pintado, pero si coinciden, habrá que mirar las coordenadas x,y,z para saber el orden. Y así con todos los objetos, y se pintan de atrás hacia adelante.

En el caso de la primera solución, para determinar el orden lo que se hace es buscar el "plano de separación entre los dos objetos":
Selección_073.png
Selección_073.png (58.06 KiB) Visto 818 veces

Según ese plano, ya sabemos qué objeto pintar antes.

En cambio, en la segunda solución, se hace una aproximación matemática: los cubos 3D de los dos objetos se pueden representar por los prismas de dos vértices opuestos (el primer vértice es el de la esquina más lejana a nosotros, mientras que el segundo vértice es la esquina más cercana).

Sean esos vértices, para el objeto A (xA,yA,zA) y (x'A,y'A,z'A); y para el objeto B (xB,yB,zB) y (x'B,y'B,z'B), con la condición de que
xA<x'A, yA<y'A, zA<z'A
xB<x'B, yB<y'B, zB<z'B

Primero comprueba si los hexágonos coinciden:
  1. si [xA−y'A,x'A−yA] y [xB−y'B,x'B−yB] coinciden, y
  2. si [xA−z'A,x'A−zA] y [xB−z'B,x'B−zB] coinciden, y
  3. si [−y'A+zA,−yA+z'A] y [−y'B+zB,−yB+z'B] coinciden.
Si es así, ahora una de las siguientes cláusulas debe ser cierta:
  1. si x'A < xB → A está detrás de B,
  2. si x'B < xA → B está detrás de A,
  3. si y'A < yB → A está detrás de B,
  4. si y'B < yA → B está detrás de A,
  5. si z'A < zB → A está detrás de B,
  6. si z'B < zA → B está detrás de A.
El Knight Lore no hace nada de esto. Lo que hace es comparar las coordenadas 3D máxima y mínima entre los dos objetos. Según la posición relativa entre ellos da una puntuación según la dimensión.

Código: Seleccionar todo

contador := 0
si z1 < z2+h2:                  ; posible coincidencia en Z
    si z2 > z1+h1:
        contador += 1           ; sí coinciden en z
    si no:
        contador += 2           ; no coinciden en z

si y1-d1 >= y2+d2:              ; posible coincidencia en Y
    si y1+d1 > y2-d2:
        contador += 3           ; sí coinciden en y
    si no:
        contador += 6           ; no coinciden en y

si x1-w1 >= x2+w2:              ; posible coincidencia en x
    si x1+w1 > x2-w2:
        contador += 9           ; sí coinciden en x
    si no:
        contador += 18          ; no coinciden en x

; contador vale ahora entre 0 y 26

si contador == 0: examinar siguiente objeto
si contador == 1: examinar siguiente objeto
si contador == 2: examinar siguiente objeto
si contador == 3: el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 4: el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 5: examinar siguiente objeto
si contador == 6: el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 7: el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 8: examinar siguiente objeto
si contador == 9: examinar siguiente objeto
si contador == 10:examinar siguiente objeto
si contador == 11:examinar siguiente objeto
si contador == 12:el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 13:coinciden completamente: tratamiento especial: lo tratamos como parpadeante
si contador == 14:examinar siguiente objeto
si contador == 15:el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 16:el objeto 2 está por detrás, lo ponemos como objeto 1 y repetimos la comparación con todos los demás
si contador == 17:examinar siguiente objeto
si contador == 18:examinar siguiente objeto
si contador == 19:examinar siguiente objeto
si contador == 20:examinar siguiente objeto
si contador == 21:examinar siguiente objeto
si contador == 22:examinar siguiente objeto
si contador == 23:examinar siguiente objeto
si contador == 24:examinar siguiente objeto
si contador == 25:examinar siguiente objeto
si contador == 26:examinar siguiente objeto

Bueno, pues tres formas distintas de conseguir lo mismo.

(A decir verdad, todavía no sé muy bien cómo funciona del todo el sistema de lista de profundidad del Knight Lore)

Avatar de Usuario
Chema
Mensajes: 2264
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1913 veces
Agradecimiento recibido: 604 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Chema » 19 Sep 2019 12:33

La verdad es que tengo las mismas sensaciones que cuando empecé a programar mi motor isométrico hace ya años: los pioneros en esto eran unos cracks. Esto no es para nada algo sencillo.

O sea que hagamos lo que hagamos hay casos que presentan problemas. Pongamos que nuestro algoritmo decide, en el ejemplo, pintar en el orden que pongo aquí:
Captura.PNG
Captura.PNG (9.4 KiB) Visto 722 veces


Quedaría algo así:
Captura2.png
Captura2.png (9.2 KiB) Visto 722 veces

¿Cómo lo solucionaríamos? Pues tanto yo en mi motor para el Oric como el autor de IsoMot (puse el enlace antes) hacemos algo similar: explorar cuando pintamos el bloque 3 los bloques que podríamos estar estropeando. Solo hay unas pocas opciones, el bloque, al pintarse, tiene que tener intersección con el 3 y tiene que cumplir alguna condición (en este caso que esté a más altura que el 3, por poner un ejemplo). Basta con explorar algunas posiciones del mapa fijas o los bloques más cercanos (si usamos una lista ordenada).

La idea es, para cada bloque que cumpla las condiciones (podría haber más de uno), añadir su máscara a un buffer especial y el contenido de ese buffer (que es una máscara adicional) usarlo para "darle un mordisco" al bloque 3 antes de pintarlo. Lo que pintaríamos, al final, sería algo como esto:
Captura3.png
Captura3.png (3.09 KiB) Visto 722 veces


Con el blitter del Amiga, creo que esto se puede hacer simplemente quitando ese trozo a la máscara antes de blitear ¿no? Hacen falta más operaciones de blitter, claro, para ir creando esta máscara de "ocultaciones" y luego uno adicional para hacer

nueva_máscara= máscara_original AND NOT máscara_ocultaciones

y este resultado usarlo como máscara para el pintado del objeto (madre, a ver cómo se hace todo esto -nb )

La verdad es que si hay que hacer esto, igual ya merece la pena saltarse la restricción de altura y usar el método de pintar "en pila" o "en altura". En un próximo post os cuento en qué consiste y qué ventajas tiene.

Avatar de Usuario
kikems
Mensajes: 3423
Registrado: 30 May 2013 19:23
Agradecido : 999 veces
Agradecimiento recibido: 1368 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor kikems » 19 Sep 2019 13:44

Eres mi señor, mi AMO . -notworthy Estoy alucinando con el hilo, me encanta. -thumbup

Avatar de Usuario
explorer
Mensajes: 326
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 7 veces
Agradecimiento recibido: 293 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor explorer » 19 Sep 2019 16:47

Usando el sistema de creación de listas de objetos que interaccionan en pantalla (sus hexágonos/rectángulos en pantalla física), lo tienes resuelto.

masteries
Mensajes: 268
Registrado: 30 May 2018 11:33
Ubicación: Espaciando
Agradecido : 21 veces
Agradecimiento recibido: 81 veces

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor masteries » 20 Sep 2019 14:06

También puedes utilizar la aproximación empleada en Fairlight, que permitía suelos curvos en Fairlight 2

Para el suelo lo que se hace no es dibujar cubos... si no delimitar la zona en la que se pintará textura de suelo, y si en esa posición se dibuja un tile de textura inclinada, más inclinada, mucho más inclinada... para simular el ángulo de la pendiente. Cuando hay dos alturas de suelo, se entienden dos zonas distintas con una transición que afecta a la altura "z" de los sprites, pero se mantiene la filosofía de dibujado rápido.

Luego ya, para los objetos y personajes, pues lista de profundidad tipo Knight Lore que va a ser lo más rápido en ejecutarse; con la filosofía de Fairlight aceleras el dibujado del suelo una barbaridad, pues es lo primero que dibujas y si ya tienes precalculado el patrón a dibujar... te puedes permitir hasta hacer scroll (al no tener que ir comprobando mediante if-else, switch... lo que sea lo que vas a tener que dibujar).

esto también es lo que se hace en el dibujado isométrico de las Atari Game Tools; (estoy avanzando poco porque Douglas, el autor sigue muy liado y no puede echarme una mano :( )
La maestría interior...

Se venden trapdoor de 512 KB para Amiga 500: viewtopic.php?f=71&t=200034052

Se venden trapdoor de 1 MB para Amiga 500 Plus: viewtopic.php?f=71&t=200034115

Avatar de Usuario
Chema
Mensajes: 2264
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1913 veces
Agradecimiento recibido: 604 veces
Contactar:

Re: Mis tribulaciones sobre un motor isométrico

Mensajepor Chema » 22 Sep 2019 22:24

Me ha pillado un constipado de estos que te dejan en cama y he tenido un fin de semana de producción cero :( Pero no penséis que no sigo con este tema, es que mis ratos libres son pocos estas primeras semanas de curso y, para colmo, si los fines de semana no puedo hacer nada, pues apaga y vámonos.

De todas formas gracias a todos por los comentarios e ideas. Creo que está quedando un hilo la mar de interesante.

A ver si esta semana avanzo un poco...


Volver a “Software & OS Amiga”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado