probleme de calcul de rayons pour un moteur de raycasting
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
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/ )
- 6 Forums
- 262 Sujets
- 906 Posts
- 0 En ligne
- 45.6 {numéro}K Membres