Discussion:
bsp6: gouraud shading - vertex normals clippen
(zu alt für eine Antwort)
Martin Grödl
2003-12-16 19:35:22 UTC
Permalink
hi,
mein gouraud shading funktioniert schon, nur das clippen der
vertex-normals macht noch probleme:

wenn ich das richtig verstanden habe, muss in den überschriebenen
methoden clipPoint(), und closeClip() immer wenn ein punkt ins
clipped-array aufgenommen wird, auch der geclippte vetex-normalvektor
nach clippedNormals[cnt] geschrieben werden.

den geclippten normalvektor müsste man durch interpolation aus den
endpunkt-normalvektoren der geclippten edge bekommen, etwa durch:

n_clip.x = n_1.x + (v_clip.x - v_1.x)/(v_2.x - v_1.x) * (n_2.x - n_1.x)
n_clip.y = ...
n_clip.z = ...

wobei v_1 und v_2 die endpunkte der edge, n_1 und n_2 die normalen an
den eckpunkten sind.

mein problem ist jetzt die konkrete implementierung in
CG1GouraudShadesPolygon.clipPoint:

der geclippte punkt ist ja iPt
der eine endpunkt ist vertices[num], wenn ich beim aufruf von clipPoint
in clip den index des punktes mit übergebe. (oder einfach point)
der dazugehörige normalvektor ist dann vertexNormals[num].

der zweite punkt ist dann s[edge], aber wie bekomme ich den zugehörigen
normalvektor??

im closeClip hab ich auch das gleiche problem...
Martin Grödl
2003-12-20 20:47:19 UTC
Permalink
komme da echt nicht weiter... hat keiner einen hinweis wie man das macht?
Chris Chiu
2003-12-21 12:32:12 UTC
Permalink
Probier's mal mit vertexNormals[num-1] (das wär ja der "letzte"
Normalvektor).

Ciao,
Christoph
Post by Martin Grödl
hi,
mein gouraud shading funktioniert schon, nur das clippen der
wenn ich das richtig verstanden habe, muss in den überschriebenen
methoden clipPoint(), und closeClip() immer wenn ein punkt ins
clipped-array aufgenommen wird, auch der geclippte vetex-normalvektor
nach clippedNormals[cnt] geschrieben werden.
den geclippten normalvektor müsste man durch interpolation aus den
n_clip.x = n_1.x + (v_clip.x - v_1.x)/(v_2.x - v_1.x) * (n_2.x - n_1.x)
n_clip.y = ...
n_clip.z = ...
wobei v_1 und v_2 die endpunkte der edge, n_1 und n_2 die normalen an
den eckpunkten sind.
mein problem ist jetzt die konkrete implementierung in
der geclippte punkt ist ja iPt
der eine endpunkt ist vertices[num], wenn ich beim aufruf von clipPoint
in clip den index des punktes mit übergebe. (oder einfach point)
der dazugehörige normalvektor ist dann vertexNormals[num].
der zweite punkt ist dann s[edge], aber wie bekomme ich den zugehörigen
normalvektor??
im closeClip hab ich auch das gleiche problem...
Martin Grödl
2003-12-21 18:34:05 UTC
Permalink
Post by Chris Chiu
Probier's mal mit vertexNormals[num-1] (das wär ja der "letzte"
Normalvektor).
also ich hab jetzt zwei arrays firstIdx[] und sIdx[] hinzugefügt, die
die analog zu first[] und s[] den Index des Punktes speichern.

funktioniert aber leider immer noch nicht :(
Loading Image...

wenn cross(point, s[edge], edge) in clipPoint true gibt und edge<TOP ist
dann rufe ich clipPoint(iPt, num, edge+1) auf.
ist edge=TOP dann wird ja der Punkt iPt nach clipped[cnt] übernommen.
clippedNormals[cnt] wird dann aus vertices[num], vertices[sIdx[edge]],
vertexNormals[num], vertexNormals[sIdx[edge]] und iPt interpoliert.

wenn inside(point, edge) true gibt dann wird auch clipPoint(point, num,
edge+1) aufgerufen.
sonst wird point übernommen und clippedNormals[cnt] = vertexNormals[num].

in closeClip:
ist cross(s[edge], first[€dge], edge] true und edge<TOP wird
clipPoint(iPt, firstIdx[edge], edge+1) aufgerufen, sonst
wird iPt in clipped aufgenommen und clippedNormals[cnt] aus
vertices[firstIdx[edge]], vertices[sIdx[edge]],
vertexNormals[firsIdx[edge]], vertexNormals[sIdx[edge]] und iPt
interpoliert.

irdendwas passt da noch nicht... vieleicht geht's ja auch ohne
firstIdx[] und sIdx[] aber wie??? das mit dem vertexNormals[num-1] hat
auch nicht geklappt...

bin für hilfe sehr dankbar...
Martin Grödl
2003-12-21 18:43:33 UTC
Permalink
Post by Chris Chiu
Probier's mal mit vertexNormals[num-1] (das wär ja der "letzte"
Normalvektor).
also ich hab jetzt zwei arrays firstIdx[] und sIdx[] hinzugefügt, die
die analog zu first[] und s[] den Index des Punktes speichern.

funktioniert aber leider immer noch nicht
http://stud4.tuwien.ac.at/~e0226538/bsp6.jpg

wenn cross(point, s[edge], edge) in clipPoint true gibt und edge<TOP ist
dann rufe ich clipPoint(iPt, num, edge+1) auf.
ist edge=TOP dann wird ja der Punkt iPt nach clipped[cnt] übernommen.
clippedNormals[cnt] wird dann aus vertices[num], vertices[sIdx[edge]],
vertexNormals[num], vertexNormals[sIdx[edge]] und iPt interpoliert.

wenn inside(point, edge) true gibt dann wird auch clipPoint(point, num,
edge+1) aufgerufen.
sonst wird point übernommen und clippedNormals[cnt] = vertexNormals[num].

in closeClip:
ist cross(s[edge], first[edge], edge] true und edge<TOP wird
clipPoint(iPt, firstIdx[edge], edge+1) aufgerufen, sonst
wird iPt in clipped aufgenommen und clippedNormals[cnt] aus
vertices[firstIdx[edge]], vertices[sIdx[edge]],
vertexNormals[firsIdx[edge]], vertexNormals[sIdx[edge]] und iPt
interpoliert.

irdendwas passt da noch nicht... vielleicht geht's ja auch ohne
firstIdx[] und sIdx[] aber wie??? das mit dem vertexNormals[num-1] hat
auch nicht geklappt...
ich bin mir bei den clipPoint aufrufen in clipPoint und closeClip auch
nicht sicher welches num man da übergeben muss. ist ja wegen des
rekursiven aufbaus nicht grade leicht durchzudenken bzw. zu debuggen :(

bin für hilfe sehr dankbar...

martin

Loading...