π
<-
Chat plein-écran
[^]

Petit moteur 3D

Pour TI-Nspire 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:
Show/Hide spoilerAfficher/Masquer le spoiler
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

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..
Nouveau sur le site, Anonymous ? Avant de poster sur le chat et sur le forum, n'oublie pas de lire les règles. En cas de problème, tu peux m'envoyer un message, je réponds rapidement.

Liens utiles:
Image
Découvre mes programmes et mon site!
Avatar de l’utilisateur
WistaroSuper Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 87.5%
 
Messages: 3153
Images: 37
Inscription: 25 Fév 2013, 16:21
Localisation: Toulouse
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: Ingénieur en électronique
YouTube: Wistaro
Twitter/X: 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 ;)
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
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
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

Suivante

Retourner vers Nspire-Lua

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 18 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
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 Calculatrices à acheter chez Calcuso
-
Stats.
2505 utilisateurs:
>2493 invités
>7 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)