Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

bsp6: gouraud shading - vertex normals clippen

0 views
Skip to first unread message

Martin Groedl

unread,
Dec 16, 2003, 4:55:39 AM12/16/03
to
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.z - n_1.z)
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

unread,
Dec 16, 2003, 2:35:22 PM12/16/03
to
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)

Martin Grödl

unread,
Dec 20, 2003, 3:47:19 PM12/20/03
to
komme da echt nicht weiter... hat keiner einen hinweis wie man das macht?

Chris Chiu

unread,
Dec 21, 2003, 7:32:12 AM12/21/03
to
Probier's mal mit vertexNormals[num-1] (das wär ja der "letzte"
Normalvektor).

Ciao,
Christoph
ch...@cg.tuwien.ac.at

"Martin Grödl" <e022...@student.tuwien.ac.at> schrieb im Newsbeitrag
news:3fdf5e77$0$33210$3b21...@tunews.univie.ac.at...

Martin Grödl

unread,
Dec 21, 2003, 1:34:05 PM12/21/03
to
Chris Chiu wrote:
> 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[€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

unread,
Dec 21, 2003, 1:43:33 PM12/21/03
to
Chris Chiu wrote:

> 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

0 new messages