REGLAGES OPENGL

cs_Geff Messages postés 192 Date d'inscription vendredi 2 mars 2001 Statut Membre Dernière intervention 10 janvier 2006 - 20 juin 2003 à 16:09
cs_Geff Messages postés 192 Date d'inscription vendredi 2 mars 2001 Statut Membre Dernière intervention 10 janvier 2006 - 20 juin 2003 à 16:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/7559-reglages-opengl

cs_Geff Messages postés 192 Date d'inscription vendredi 2 mars 2001 Statut Membre Dernière intervention 10 janvier 2006
20 juin 2003 à 16:09
Même remarque que sur le code précédent! Utilise les normales!!!! Surtout pour pouvoir apprécier les ombres, c'est pour ca que tu n'obtient rien au niveau de l'affichage hormis un bloc monocolore! Donc je te donne un exemple de code qui te permet de faire ca ::

Ca te permet d'obtenir le vecteur normal à la face formée par 3 points
Coord1(0)=Point1.X :: Coord1(1)=Point1.Y :: Coord1(2)=Point1.Z
Coord2(0)=Point2.X :: Coord2(1)=Point2.Y :: Coord2(2)=Point2.Z
Coord3(0)=Point3.X :: Coord3(1)=Point3.Y :: Coord3(2)=Point3.Z

Private Sub CalculNormal(Coord1() As Single, Coord2() As Single, coord3() As Single)
Dim va(3) As Single, vb(3) As Single, vr(3) As Single, Val As Single

va(0) = Coord1(0) - Coord2(0)
va(1) = Coord1(1) - Coord2(1)
va(2) = Coord1(2) - Coord2(2)

vb(0) = Coord1(0) - coord3(0)
vb(1) = Coord1(1) - coord3(1)
vb(2) = Coord1(2) - coord3(2)

vr(0) = va(1) * vb(2) - vb(1) * va(2)
vr(1) = vb(0) * va(2) - va(0) * vb(2)
vr(2) = va(0) * vb(1) - vb(0) * va(1)

Val = CSng(Sqr(vr(0) ^2 + vr(1) ^2 + vr(2) ^2 ))
If Val = 0 Then Exit Sub
glNormal3f vr(0) / Val, vr(1) / Val, vr(2) / Val
End Sub


J'ai directement utilisé ton code pour que tu comprennes le mécanisme :

glenable glcNormalize

Dim Point1(2) As Single
Dim Point2(2) As Single
Dim Point3(2) As Single

With Element.STL_def
For J = 0 To .NmbVertex - 3 Step 3
glBegin Mode
For n = 0 To 2
glVertex3f .Vertex(J + n).X, .Vertex(J + n).Y, .Vertex(J + n).Z
glNormal3f .Vertex(J + n).X, .Vertex(J + n).Y, .Vertex(J + n).Z
Next
Point1(0) = .Vertex(J).X
Point1(1) = .Vertex(J).Y
Point1(2) = .Vertex(J).Z

Point2(0) = .Vertex(J + 1).X
Point2(1) = .Vertex(J + 1).Y
Point2(2) = .Vertex(J + 1).Z

Point3(0) = .Vertex(J + 2).X
Point3(1) = .Vertex(J + 2).Y
Point3(2) = .Vertex(J + 2).Z
CalculNormal Point1, Point2, Point3
glEnd
Next
End With

On voit deja plus claire!
Tu peux bien sur stocker les normales des faces une fois pour toute dans une structure dès le chargement de ton objet, ca te permet d'économiser du temps de calcul!
La méthode que je te propose permet d'obtenir une normal bien délimitée pour chaque face, il existe des méthodes qui permettent d'avoir des normales dépendant de la courbure locale de ton objet dans la zone de la face, ca permet d'avoir un rendu de bien meilleur qualité, sans zones bien délimitées!
Autre détail tres important : je trouve que ta méthode pour bouger ta scène (rotation, zoom, translation) n'est vraiment pas intuitive à utiliser de plus ton code est assez gros pour ce genre de tache! Je te conseillerais ca :

Sub PicOutPut_MouseMove
if Button=1 then
Angle(0)=X-Souris.x
Angle(1)=Y-Souris.y
else
Zoom=int((X-Souris.x)^2+(Y-Souris.Y)^2)
end if
end sub

Souris est une structure permettant d'avoir la position de la souris lors du clik sur PicOUtPut:

Sub Pic_OutPut_MouseDown
Souris.X=X
Souris.Y=Y
end sub

puis dans ta routine d'affichage tu met juste avant glBegin

glRotatef Angle(0), 1,0,0
glRotatef Angle(1), 0,1,0

wala maintenant tu peux recoder ton programme pour qu'il soit plus facile à utiliser et pour que la manipulation des lumières servent a quelquechose!

Au fait, pense à ceux qui sont en 800*600!!

Bon Coding ++
GEFF
Rejoignez-nous