Communauté

probleme de calcul ...
 
Notifications
Retirer tout

probleme de calcul de rayons pour un moteur de raycasting

2 Posts
2 Utilisateurs
0 Likes
237 Vu
(@flinterswap)
New Member
Inscription: Il y a 6 ans
Posts: 1
Début du sujet  

bonjour a tous, voila si je suis venu sur gamecodeur cest car je programme en lua avec love2d et puisque cest tres spécifique, tres peu de personnes peuvent m'aider si je rencontre un probleme.

j'aimerais programmer un moteur de raycasting (DOOM, Wolfenstein3D...) jai dailleurs eplucher les tutos du youtuber 3Dsage sur le sujet, et jai reussi a aller assez loin dans le tutoriel, jai une map modifiable contenue dans une array, un personnage avec un deplacement zenithal grace au sinus et cosinus, ect...

mais au moment de calculer mes premiers rayons, tout cloche, mes 2 rayons servant a calculer les collision des murs ont des angles differents alors quils devrais se chevaucher, voici ma fonction, si jamais vous voyez se qui ne fonctionne pas ca serait merveilleux, merci d'avance

(je precise que 50 est la valeur de la taille des cases composant la map et 20 est la taille d'un coté de la map, 20 cases sur 20)

---------------------------------------------------------------------------------------------------------------------------------------------

function raycast()
rayAngle = playerAngle - deg*30
rayX = 0
rayY = 0
mx = 0
my = 0
mp = 0
offsetX = 0
offsetY = 0

for i=0,1 do

dof = 0

aTan = -1/math.tan(rayAngle)

if rayAngle > pi and rayAngle < pi*2 then
rayY = math.floor(playerY/50)*50
rayX = (playerY - rayY)*aTan + playerX
offsetY = -50
offsetX = -offsetY*aTan
end

if rayAngle < pi and rayAngle > 0 then
rayY = math.floor(playerY/50)*50
rayX = (playerY - rayY)*aTan + playerX
offsetY = 50
offsetX = -offsetY*aTan
end

if rayAngle == pi or rayAngle == 0 then
rayX = playerX
rayY = playerY
dof = 20
end

while dof<20 do
mx = math.floor(rayX/50)
my = math.floor(rayY/50)
mp = my*20+mx
if mp > 0 and mp < 20*20 and carte [mp] == 1 then
dof = 20
else
rayX = rayX+offsetX
rayY = rayY+offsetY
dof = dof+1
end

end

if rayAngle > pi and rayAngle < pi*2 then
rayY = rayY + 50
end

love.graphics.setColor(1, 0, 0)
love.graphics.line(playerX - 25, playerY - 25, rayX - 50, rayY)
love.graphics.reset()

---------------------------------------------------------------

dof = 0

nTan = -math.tan(rayAngle)

if rayAngle > pi/2 and rayAngle < 3*pi/2 then
rayX = math.floor(playerX/50)*50
rayY = (playerX - rayX)*nTan + playerY
offsetX = -50
offsetY = -offsetX*nTan

end

if rayAngle < pi/2 or rayAngle > 3*pi/2 then
rayX = math.floor(playerX/50)*50
rayY = (playerX - rayX)*nTan + playerY
offsetX = 50
offsetY = -offsetX*nTan
end

if rayAngle == pi*2 or rayAngle == 3*pi/2 then
rayX = playerX
rayY = playerY
dof = 20
end

while dof<20 do 
mx = math.floor(rayX/50)
my = math.floor(rayY/50)
mp = my*20+mx
if mp > 0 and mp < 20*20 and carte [mp] == 1 then
dof = 20
else
rayX = rayX+offsetX
rayY = rayY+offsetY
dof = dof+1
end
end

if rayAngle > pi/2 and rayAngle < 3*pi/2 then
rayX = rayX + 50
end

love.graphics.setColor(1, 0, 0)
--love.graphics.line(playerX - 25, playerY - 25, rayX - 50, rayY)
love.graphics.reset()

rayAngle = rayAngle + deg

end
end 


   
Citation
(@oktopuss)
Membre Admin
Inscription: Il y a 6 ans
Posts: 20
 

Hello =)

Tu n'as pas posté ton message dans la bonne section. Ici c'est la section Présentation, qui sert donc aux membres de se présenter.

Pour toute question, problème de programmation, il faut aller dans la section Questions (  https://www.gamecodeur.fr/community/vos-questions/ )


   
RépondreCitation
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.