π
<-
Chat plein-écran
[^]

Petit moteur 3D

Pour OS 3.0 ou ultérieur.

Petit moteur 3D

Message non lude Ti64CLi++ » 07 Déc 2017, 14:51

Bonjour,
J'ai essaye de creer mon petit moteur 3D, je ne pense pas m'etre trompe dans les formules, c'est plus dans le code en lui meme.
Lorsque je le lance, il tourne indefiniment.

Voila mon code:
Code: Tout sélectionner
local screen = platform.window

local RGB = unpack

function addToGC(name, func)
   local tab = platform.withGC(getmetatable)
   tab[name] = func
end

Point2D = class()

function Point2D:init(x,y)
   self.x = x
   self.y = y
   self.zoom = 1
   self.colour = {0,0,0}
   self.inscreen = true
end

function Point2D:isInScreen()
   if self.x >= 0 and self.x < screen.width() and self.y >= 0 and self.y < screen.height() then
      self.inscreen = true
   else
      self.inscreen = false
   end
end

function Point2D:disp(gc)
   self:isInScreen()
   if self.inscreen then
      gc:setColorRGB(RGB(self.colour))
      gc:fillRect(self.x - ((self.zoom - 1) / 2), self.y - ((self.zoom - 1) / 2), self.zoom, self.zoom)
   end
end

Line2D = class()

function Line2D:init(x1,y1,x2.y2)
   self.p1 = Point2D(x1,y1)
   self.p2 = Point2D(x2,y2)
   self.colour = {0,0,0}
   self.inscreen = true
end

function Line2D:isInScreen()
   --a faire
end

function Line2D:disp(gc)
   local dx,dy,cumul,point,i
   point = Point2D(self.p1.x,self.p1.y)
   dx = self.p2.x - self.p1.x
   dy = self.p2.y - self.p1.y
   point:disp(gc)
   cumul = dx / 2
   point.x = point.x + 1
   while point.x <= self.p2.x do
      cumul = cumul + dy
      if cumul >= dx then
         cumul = cumul - dx
         point.y = point.y + 1
      end
      point:disp(gc)
   end
end



Point3D = class()

function Point3D:init(x,y,z)
   self.x = x
   self.y = y
   self.z = z
   self.p2d = Point2D(0,0)
   self.zoom = 1
   self.inscreen = true
   self.colour = {0,0,0}
end

function Point3D:to2D()
   local t = (screen:width() / 2) / (self.z + 5)
   self.p2d.x = self.x * t + (screen:width() / 2)
   self.p2d.y = self.y * t + (screen:height() / 2)
end

function Point3D:isInScreen()
   self.p2d:isInScreen()
   self.inscreen = self.p2d.inscreen
end

function Point3D:disp(gc)
   self:isInScreen()
   self:to2D()
   if self.inscreen then
      gc:setColorRGB(RGB(self.colour))
      gc:fillRect(self.p2d.x - ((self.zoom - 1) / 2),self.p2d.y - ((self.zoom - 1) / 2),self.zoom,self.zoom)
   end
end

Line3D = class()

function Line3D:init(x1,y1,z1,x2,y2,z2)
   self.point1 = Point3D(x1,y1,z1)
   self.point2 = Point3D(x2,y2,z2)
   self.inscreen = true
   self.colour = {0,0,0}
   self.zoom = 1
end

function Line3D:to2D()
   self.point1:to2D()
   self.point2:to2D()
end

function Line3D:disp(gc)
   self:to2D()
   line2d = Line2D(self.point1.p2d.x, self.point1.p2d.y, self.point2.p2d.x, self.point2.p2d.y)
   line2d:disp(gc)
end



--main

lx = {-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1}
ly = {-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1}
lz = {-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1}

local k = 1

function on.paint(gc)
   local line = Line3D(lx[k],ly[k],lz[k],lx[k+1],ly[k+1],lz[k+1])
   line:disp(gc)
end

function on.charIn(ch)
   if ch == '+' and k < 23 then
      k = k + 2
   end
   screen:invalidate()
end


et le lien vers le code pour ceux sur smartphone : https://pastebin.com/4fTdP69w

Voila, si une ame charitable voulait bien m'aider, je lui en serai reconnaissant :)

Merci d'avance
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 07 Déc 2017, 16:38

Voila, apres correction de la petite erreur qui faisait une boucle infini, je n'ai plus d'erreur.
Mais les lignes ne s'affichent pas du tout comme je le voudrais.
Voila un lien vers le nouveau code : https://pastebin.com/gxnZmvBz
Et un petit screenshot de ce que ca fait:

Image
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 07 Déc 2017, 19:26

Je precise que le but est de dessine un cube, avec pour points:
x appartient a [-1;1]
y appartient a [-1;1]
z appartien a [-1;1]
Je fais en sorte de dessiner chaque ligne, en utilisant le meme point deux fois de suite:
je part du coin inferieur gauche, a z = -1, pour aller au coin inferieur gauche en z=1, puis faire le tour et revenir a z=-1 du coin inferieur gauche.
Puis je montes de ce point, vers le coin superieur gauche, a z=-1, pour aller a z=1 du coin superieur gauche, pour descendre au coin inferieur gauche a z=1, puis remonter au point precedent, puis passer au point suivant, donc coin superieur droit a z=1, puis refaire la meme manipulation, puis refaire de meme avec le coin superieur droit a z=-1, et enfin revenir au coin superieur gauche a z=-1.
Logiquement, ca devrait marcher, j'utilise le meme ordre pour representer un cube sur TI 84+ SE en Basic.

Si quelqu'un pouvait m'aider je lui en serait reconnaissant.
Merci d'avance
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 07 Déc 2017, 22:50

Nouveau code, mais cette fois, c'est un probleme de boucle infinie, due a la fonction Line2D:disp(gc) :(
Le code : https://pastebin.com/gxnZmvBz
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

En ligne

Re: Petit moteur 3D

Message non lude Wistaro » 07 Déc 2017, 23:07

J'y connais quasiment rien en Lua, mais vérifie peut-être les conditions de ton while dans Line2D:Disp(gc), c'est peut-être là ta boucle infinie..
Avatar de l’utilisateur
WistaroModo.G
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 29.2%
 
Messages: 2352
Images: 25
Inscription: 25 Fév 2013, 16:21
Localisation: Toulouse
Genre: Homme
Calculatrice(s):
Classe: Etudiant ingénieur (Ex TS - SI)
YouTube: Wistaro
Twitter: @Wistaro
GitHub: Wistaro

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 08 Déc 2017, 12:02

Je ne crois pas. Normalement, c'est un code en C, que j'ai traduit en Lua, et c'est une boucle for(;;) avec un if(x0==x1 && y0==y1) et un break dans ce cas.
Il faut donc un or pour satisfaire les deux conditions ;)
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 08 Déc 2017, 18:05

Finalement j'ai trouvé l'erreur. Dans ma boucle while, je testais des égalités.
Or, je n'avais pas pris en compte le fait qu'avec mes calculs, les valeurs pouvaient être des chiffres décimaux.
Donc le test de la boucle while n'était généralement pas vérifié. Après avoir mis des math.floor, tout marche comme il faut ^^
Dernière édition par TheMachine02 le 08 Déc 2017, 18:07, édité 1 fois.
Raison: Correction orthographe
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 10 Déc 2017, 14:33

Bon, nouveau probleme.
J'ai recommence le moteur de 0, et suis arrive a un truc fonctionnel, mais pas complet du tout :D
Je me suis donc attaque au remplissage des triangles avec une couleur.
Probleme, meme si j'appelle Triangle:fillTriangle(gc,color) ca ne me remplis pas mon triangle, et ca ne m'affiche rien.
C'est a dire que meme si apres j'appelle Triangle:disp(gc) mon triangle ne sera pas affiche :(
Voila le code : https://pastebin.com/E8R3B0Yn
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 11 Déc 2017, 19:19

Bon, j'ai plutot bien avance depuis la derniere fois. Possibilite de creer des Object3D, donc un ensemble d'objet. Ca peut servir notamment pour creer un cube par exemple, comme dans mon exemple.
J'ai reessaye d'implementer la rasterization, mais rien y fait. Aucun triangle plein n'est dessine :'(

Voila le code source, avec toutes les mer*es enlevees (pas de debug et autre):
https://pastebin.com/AnjT3mBF

Et un petit screen pour la route:

Image
(version 0.2, donc quelques petites choses ont ete rajoutees ou modifiees depuis)

Je publierai une version demo des que j'aurai resolu ce probleme de rasterization.
Donc si quelqu'un pouvait m'y aider, je lui en serait reconnaissant :)

Merci d'avance
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Re: Petit moteur 3D

Message non lude Ti64CLi++ » 12 Déc 2017, 01:04

Bonne nouvelle, la rasterization est fonctionnelle :bj:
Voila un petit screen en attendant la demo:

Image
version 0.4
Je suis actuellement en Irlande, et utilise donc un clavier anglais. Merci de ne pas prendre en compte le manque d'accent


Everyone who has never made a mistake has never tried anything new.
Une personne qui n'a jamais commis d'erreur n'a jamais rien essayé de nouveau.

Albert Einstein


Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 45.4%
 
Messages: 2795
Images: 51
Inscription: 04 Juil 2014, 14:40
Localisation: Valence 26
Genre: Homme
Calculatrice(s):
Classe: 1°S-SVT
GitHub: Ti64CLi

Suivante

Retourner vers Programmation Lua

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

-
Rechercher
-
Sujets à la une
"NumWorks++": Challenge de modification matérielle pour rajouter une puce de mémoire Flash !
Offre TI-Planet/Jarrety pour avoir la TI-83 Premium CE avec son chargeur pour 79,79€ port inclus !
Offre TI-Planet/Jarrety pour avoir la TI-Nspire CX CAS à seulement 130€ TTC port inclus!
Jailbreake ta TI-Nspire avec Ndless et profite des meilleurs jeux et applications !
Transforme ta TI-Nspire CX en console Game Boy Advance!
12345
-
Donations/Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
PayPal : paiement en ligne sécurisé - secure online payments
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety 
-
Stats.
500 utilisateurs:
>441 invités
>54 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)