Moteur Raycasting

13 sujets de 16 à 28 (sur un total de 28)

  • 1
  • 2
  • Screetch

      #178125

      Désolé pour le retard, j’étais en plein bouclage et en plus mon PowerMOS ne fonctionne plus depuis quelques jours :'(

      Non, je n’ai pas retouché à mon moteur 3D Towanda, mais voici le source en SDL Basic. Si quelqu’un peut régler mon problème d’eye fish…

      http://www.youtube.com/watch?v=lU7bIJo4JIo

      ‘***********************************************************************

      ‘*    Moteur 3D minimaliste Towanda

      ‘*    ————————————————–

      ‘*    Utiliser la touche ‘O’ pour avancer

      ‘*    Utiliser la touche ‘L’ pour reculer

      ‘*    Utiliser la touche ‘K’ pour tourner à gauche

      ‘*    Utiliser la touche ‘M’ pour tourner à droite

      ‘*    Utiliser la touche ‘Tab’ pour afficher la carte

      ‘*    Utiliser la touche ‘Esc’ pour quitter

      ‘***********************************************************************

       

      ‘********* FONCTIONS

       

      ‘***** Affiche la carte en surimpression

      function affiche_carte()

      while inkey=9

      screenalpha(2,150)

      screenswap

      end while

      screenalpha(2,255)

      screenswap

      end function

       

      ‘****** Récupérer les RGB d’une couleur

      function recup_rgb_r(rgb_entree)

      rgb_r=int(rgb_entree/65536)

      return rgb_r

      end function

       

      function recup_rgb_g(rgb_entree)

      rgb_r=recup_rgb_r(rgb_entree)

      rgb_g=int((rgb_entree-rgb_r*65536)/256)

      return rgb_g

      end function

       

      function recup_rgb_b(rgb_entree)

      rgb_r=recup_rgb_r(rgb_entree)

      rgb_g=recup_rgb_g(rgb_entree)

      rgb_b=rgb_entree-rgb_r*65536-rgb_g*256

      return rgb_b

      end function

       

      ‘***** Affiche l’écran 3D

      function affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

      ‘affichage vision 3D

      screen(2)

      ink(rgb(200,200,200))

      paint (1,1)

       

      ‘dégradé

      screen(2)

      ink(rgb(200,200,200))

      bar(0,0, screen_x, screen_y)

      for degrade=0 to 300 ‘step (pers_clip*100/(screen_y)/2)

      ink(rgb(degrade/1.5,degrade/1.5,degrade/1.5))

      line (0,(screen_y/2)-degrade-50,screen_x, (screen_y/2)-degrade-50)

      line (0,(screen_y/2)+degrade+50,screen_x, (screen_y/2)+degrade+50)

      ink(rgb(0,0,0))

      bar (0,(screen_y/2)-50,screen_x,(screen_y/2)+50)

      next

      screen(1)

       

      coul_precedente=16777215

      for vision=0 to screen_x

      rayon=(vision*(pers_angle*2)/screen_x)+pers_vue

      distance=0

      coul=getpixel(pers_x+distance*cos(rayon-pers_angle),pers_y+distance*sin(rayon-pers_angle))

      while coul =  16777215 or coul = 6553600 and distance<(pers_clip)

      distance=distance+1

      coul=getpixel(pers_x+distance*cos(rayon-pers_angle),pers_y+distance*sin(rayon-pers_angle))

      wend

      if distance<pers_clip then

      screen(2)

       

      ‘**** DEBUT A utiliser en mode gouraud seulement

      ‘coul_r=recup_rgb_r(coul)+120-distance

      ‘coul_g=recup_rgb_g(coul)+120-distance

      ‘coul_b=recup_rgb_b(coul)+120-distance

      ‘coul=rgb(coul_r,coul_g,coul_b)

      ‘**** FIN mode gouraud seulement

      ink(coul)

      select case coul

      case 15996700

      texture_num=1

      case 0

      texture_num=2

      case 2396752

      texture_num=3

      case 16514939

      texture_num=4

      case else

      texture_num=0

      end select

      if texture_num>0 then

      texture_col=texture_col+1

      if texture_col>100 then

      texture_col=0

      end if

      screenalpha(3,255)

      ‘Zoom de la ligne

      screen(3)

      select case texture_num

      case 1

      grab(0,texture_col,0,1,100)

      case 2

      grab(0,texture_col,100,1,100)

      case 3

      grab(0,texture_col,200,1,100)

      case 4

      grab(0,texture_col,300,1,100)

      end select

      ‘ Test formule Login n°60

      ‘distance=distance*cos(-pers_angle)

      zoomimage(0,1,((screen_y-(distance*pers_zoom))-(distance*pers_zoom))/100)

      ‘Copie de la ligne sous forme de texture

      screen(2)

      pasteicon(vision,distance*pers_zoom,0)

      screenalpha(3,0)

      else

      line(vision,distance*pers_zoom,vision,screen_y-(distance*pers_zoom))

      end if

      screen(1)

      end if

      coulprecedente=coul

      next

      ‘Affichage Informations en surimpression sur l’écran de la carte

      paper (rgb(255,255,255)):pen (rgb(0,0,0))

      Locate (5,2):prints (« Moteur 3D Towanda – Alpha – V0.06a »)

      locate (5,3):prints (« (c) Screetch 2011-2012 »)

      locate (5,4):prints (« Programmé alternativement sous SDL Basic Linux, Windows, MorphOS »)

      locate (5,5):prints (« Contact : [email protected] »)

      locate (5,13):prints (« Informations Debug »)

      locate (5,14):prints (« ——————« )

      locate (5,15):prints (« pers_vue = « & pers_vue)

      locate (5,16):prints (« pers_angle = « & pers_angle)

      locate (5,17):prints (« distance = « & distance)

      locate (5,18):prints («  »)

      screenswap

      end function

       

       

      ‘****** Initialisation

      ‘ Taille  écran

      screen_x=800

      screen_y=600

      ‘ Taille carte

      carte_x=1280

      carte_y=1024

      ‘ Position départ

      pers_x=480

      pers_y=410

      ‘ Direction de la vue en degres

      pers_vue=0

      ‘ Angle de vue en degres

      pers_angle=124

      ‘ Distance clipping

      pers_clip=120

      ‘ Zoom

      pers_zoom=2

      ‘Nombre de pas pour faire un tour sur soi-même

      nbre_pas=10

      ‘****** Initialisation automatiques

      ‘Valeur de Pi

      pi=3.14159265

      ‘Etat de la carte

      etat_carte=0

      ‘ Transformations degres en radians

      pers_vue=pers_vue*(pi*2)/360

      pers_angle=(pers_angle*(pi*2)/360)/2

       

      ‘****** Démarrage

      setdisplay(screen_x,screen_y,32,1)

      screenOpen(1, carte_x,carte_y, 0, 0,carte_x,carte_y, 0 )

      screenOpen(2, screen_x,screen_y, 0, 0, screen_x,screen_y, 0 )

      screenopen(3,800,600,0,0,800,600,0)

      screenopen(4,1,screen_y,0,0,1,screen_y,0)

      ‘ Initialisation Ecran affichage angle sur Map 2D

      screenOpen(5, carte_x,carte_y, 0, 0,carte_x,carte_y, 0 )

      screenalpha(3,0)

      screenalpha(4,0)

      screenalpha(5,0)

      autoback(0)

      ‘loadmusic(« 2unlimitedmix.mod »)

      ‘playmusic(-1)

      screen(1)

      s = loadimage( « level01.png » )

      pasteicon(0,0,s)

       

      ‘Chargement textures

      screen(3)

      for a=1 to 4

      nom_fichier$=a+ ».png »

      texture_test=loadimage(nom_fichier$)

      pasteicon(0,100*(a-1),texture_test)

      next

       

      ‘*************************************************************************************************

       

      ‘affichage perso sur carte 2D

      screen(5)

      ‘ Effacer angle joueur sur carte 2D avant affichage nouvel angle

      ink(rgb(200,200,200))

      bar(0,0,800,800)

       

      ink(rgb(100,0,0))

      dot(pers_x,pers_y)

      ‘affichage angle de vision sur carte 2D

      line(pers_x,pers_y, pers_x+pers_clip*cos(pers_vue-pers_angle),pers_y+pers_clip*sin(pers_vue-pers_angle))

      line(pers_x,pers_y, pers_x+pers_clip*cos(pers_vue+pers_angle),pers_y+pers_clip*sin(pers_vue+pers_angle))

      for i=(pers_vue-pers_angle) to (pers_vue+pers_angle) step 0.001

      dot (pers_x+pers_clip*cos(i),pers_y+pers_clip*sin(i))

      next

       

      ‘affichage arme de test

      loadimage( « armedoom.png » ,s)

      sprite(0, (screen_x/2)-45, (screen_y)-113,s)

       

      affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

       

      while 0=0

      ‘screenswap

      a = inkey

      if a=27 then ‘ Touche ESC – Quitter le jeu

      exit while

      end if

      if a=9 then ‘ Touche TAB – Afficher la carte

      screen(1)

      ink(rgb(100,0,0))

      dot(pers_x,pers_y)

      ‘affichage angle de vision sur carte 2D

      line(pers_x,pers_y, pers_x+pers_clip*cos(pers_vue-pers_angle),pers_y+pers_clip*sin(pers_vue-pers_angle))

      line(pers_x,pers_y, pers_x+pers_clip*cos(pers_vue+pers_angle),pers_y+pers_clip*sin(pers_vue+pers_angle))

      for i=(pers_vue-pers_angle) to (pers_vue+pers_angle) step 0.001

      dot (pers_x+pers_clip*cos(i),pers_y+pers_clip*sin(i))

      next

      affiche_carte()

      end if

      if a=107 then ‘ Touche K – Tourner à gauche

      pers_vue=pers_vue-(pi/nbre_pas)

      if pers_vue<-pi then

      pers_vue=pi+(-pi-pers_vue)

      end if

      affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

      end if

      if a=109 then ‘ Touche M – Tourner à droite

      pers_vue=pers_vue+(pi/nbre_pas)

      if pers_vue>=pi then

      pers_vue=-pi+(pers_vue-pi)

      end if

      affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

      end if

      if a=111 then ‘ Touche O – Avancer

      pers_x=pers_x+(cos(pers_vue)*10)

      pers_y=pers_y+(sin(pers_vue)*10)

      affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

      end if

      if a=108 then ‘ Touche L – Reculer

      pers_x=pers_x-(cos(pers_vue)*10)

      pers_y=pers_y-(sin(pers_vue)*10)

      affiche_ecran3d(screen_x, screen_y, pers_x, pers_y, pers_angle, pers_vue, pers_clip, pers_zoom)

      end if

      end while

      Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

      Screetch

        #178202

        Il est possible que mon précédent post ne soit pas très lisible… Je peux mettre le fichier brut pour être ouvert dans un éditeur coloré si cela interesse.

        Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

        Anonyme

          #178209

          je trouve ça cooooool mec !

          Anonyme

            #178263

            Hello screetch,

             

            Ne brûle pas les étapes, essai d’abord un moteur Raycast en 3d Vecteur pleine (ou surface pleine) et après, tu verra pour le « mapping »

             

            Vas-y tout doux, je regarde ton code une fois imprimer 😉

             

            Tu code en quoi déjà?

            Screetch

              #178275

              C’est du SDL Basic (ici sous Linux mais qui fonctionne sans broncher sous WinXP mais pose des problèmes d’incompatibilités sur la version MOS). J’ai commencé en faces pleines, puis ajouté du mapping dessus.

              J’essaierais de régler mon pb de mapping qui suit le regard après avoir enlevé l’eye-fish.

              En fait, j’ai un peu laissé de côté mon moteur 3D en attendant de résoudre ce problème. En attendant, je me suis mis sur la création d’un clone de Bombjack qui aura une touche très personnelle :). J’avais commencé en Amos sur un mon ancien 1200 il y a plus de 15 ans… Plus de sources, donc je reprends à zero sous SDL Basic.

              Voici une archive contenant toute les version de mon moteur (plus lisible dans son format d’origine) : http://dl.free.fr/oEcPkUvRw

              Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

              Screetch

                #179078

                Alors, quelqu’un a regardé ?

                Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

                Screetch

                  #180904

                  Je re up une dernière fois, et après j’abandonne, promis ^^’

                  Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

                  Anonyme

                    #180916

                    t’as pas des screens ?

                    en fait non, tu veux pas le refaire en amos (et me filer les sources) et m’expliquer comment tu fais ?

                    Je suis une brêle, je fais des petits trucs mais bon..

                    bref, non tu veux pas te remettre à l’amos ?

                    non ?

                    bon ok. Je vais regarder ton « truc » alors…

                     

                    ah bin il veut pas me le donner, ça tourne en rond, j’essaierais plus tard

                    Anonyme

                      #180921

                      Hello

                       

                      J’ai essayé de relire le code, mais… le sdl et moi sa fait 2000000000000

                       

                      Bref, un brun bizarre. Mets-toi à Hollywood 😉

                       

                      Non, en fait, c’est que tu commence direct en utilisant des « Textures », commence déjà par faire un moteur avec des commandes de traçage comme line/box/plot ou je ne sais quoi, déjà, tu arrivera mieux comprendre la méthode du raytrace, la, il y a trop de paramètre que je ne connais pas… désolé, mais j’y arrive pas 🙁

                      Screetch

                        #180929

                        Le source est plus lisible en le lisant depuis le véritable source (depuis SDLBasic) :

                        http://dl.free.fr/oEcPkUvRw

                        Je pense que passer le tout en Amos n’est pas trop compliqué, vu que SDL Basic s’inspire d’Amos. Le problème sera surtout la rapidité ! Vu que ce n’est pas optimisé et en plus que j’ai programmé à l’inspiration… Et Amos tourne sur 68k !

                        Voici ce que donne le moteur (dans une version un peu plus ancienne) :

                        Mon problème est donc cet affreux effet d’Eye Fish…

                        Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

                        Anonyme

                          #180932

                          je crois te l’avoir déjà dit mais moi je trouve ça super car je ne suis pas capable d’en faire autant. ça mériterait un poil de fluidité et effectivement ce côté fisheye à virer itou.

                          Il n’y a pas déjà des moteurs 3D éxistants en sdl ou autre sur lesquels tu pourrais t’appuyer ? (tu sais en s’en fout qu’un truc soit pompé sur un autre du moment que ça donne un moteur sympa), moi je suis pour un « petit » wolfenstein multiplateforme (bien qu’en terme de formes j’aime bien qu’en y’en a mais ça c’est une autre histoire).

                          Screetch

                            #180978

                            Justement, ce qui me plaisait dans mon projet, c’est que je m’appuyais sur aucun code, uniquement une formule mathématique dans un magazine Login: de l’époque.

                            Je pensais pas un jour arriver à faire un moteur 3D et finalement j’ai essayé et cela donne ça.

                            Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !

                            Anonyme

                              #180980

                              J’ai pu d’amiga 6800×0, ni Amos, mais c’est pas difficile à faire sous Amos, le problème c’est que je me rappel plus des commandes

                               

                              Remplacer les tables de ma sources holly par Dim()

                              Le @screen par la commande d’ouverture d’un écran sous Amos (screen open si mes souvenir sont bon)

                              Modifier Case par des tests If

                              Modifier la commande de traçage, mais garder les variables et les formules et hop, sa fonctionne nickel

                               

                              NE commencer pas par de la texture, vous risquez de vous planter… 😉

                               

                              Par contre du SDL sur du vrai amiga 🙁 pas sûr que sa soit super optimisé et rapide

                            13 sujets de 16 à 28 (sur un total de 28)

                            • 1
                            • 2
                            • Vous devez être connecté pour répondre à ce sujet.

                            Forums AmigaOS, MorphOS et AROS Développement Moteur Raycasting

                            Amiga Impact