Moteur Raycasting
13 sujets de 16 à 28 (sur un total de 28)
- 1
- 2
-
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 !
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 !
je trouve ça cooooool mec !
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à?
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 !
Alors, quelqu’un a regardé ?
Abonnez-vous à ma nouvelle chronique "En Route vers le Futur" sur Youtube !
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 !
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
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 🙁
Le source est plus lisible en le lisant depuis le véritable source (depuis SDLBasic) :
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 !
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).
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 !
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