cs_Geff
Messages postés192Date d'inscriptionvendredi 2 mars 2001StatutMembreDernière intervention10 janvier 2006
-
20 juin 2003 à 16:09
cs_Geff
Messages postés192Date d'inscriptionvendredi 2 mars 2001StatutMembreDernière intervention10 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.
cs_Geff
Messages postés192Date d'inscriptionvendredi 2 mars 2001StatutMembreDernière intervention10 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
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
20 juin 2003 à 16:09
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