Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 24.11.2003, 10:09 Titel: Normalen,Tangenten,Binormalen |
|
|
Hallo kann mir jemand sagen wie ich aus einem Normalenvector einen Tangenten und Binormalenvector erstellen kann ?
Zur Erklärung:
Angenommen der Normalenvector zeigt in die Y-Richtung (0,1,0) dann müsste die Tangente in die X-Richtung (1,0,0) und die Binormale in die Z-Richtung (0,0,1) zeigen.
Ich brauche das fürs DP3-Bumpmapping.
Danke schon mal. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
robx Mini JLI'ler
Anmeldedatum: 02.12.2003 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 02.12.2003, 21:55 Titel: |
|
|
rein theorethisch geht das garnicht. du brauchst imho schon einen texture space, also die uv koordinaten - daraus kannst mit jede menge mathe binormale und tangente bestimmen..
aber es gibt da einen trick
du nimmst die einen beliebigen vector 'dummy', z.b. (0,1,0). dann kannst du binormale und tangente folgendermaßen berechnen:
tangente = normale x dummy
binormale = normale x tangente
(x ist cross-product)
normale und dummy sollten vorher normalisiert sein, sonst gibts fehler.
der haken ist, dass es nicht funktioniert, wenn normale==dummy ist, kann unter umständen da unschön aussehen.
ob das ganze fürs bump-mapping funzt und sinn macht weiß ich nicht, es ist halt nur fake. _________________ just my two cents. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.12.2003, 11:36 Titel: |
|
|
Bei Landschaften hab ich das so ähnlich gemacht wie du. Da sieht das ganze noch recht spitze aus. Ich brauche das aber noch für Modelle da man das dort nicht so sehr effektiv anwenden kann wie hier. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
robx Mini JLI'ler
Anmeldedatum: 02.12.2003 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 03.12.2003, 12:30 Titel: |
|
|
ok, dann brauchst du irgendeinen space aus dem du tangente und binormale berechnen kannst, ich glaube das kann man aus den u,v koordinaten ableiten. hab ich aber noch nie gemacht.
am besten google fragen. _________________ just my two cents. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.12.2003, 10:26 Titel: |
|
|
Was willst du überhaupt mit den UV-Koordinaten ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
robx Mini JLI'ler
Anmeldedatum: 02.12.2003 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 04.12.2003, 10:43 Titel: |
|
|
na ermitteln, wie die texture auf das modell gemapped ist.
und daraus kannst du dann den tangent-space ableiten. oder nicht ? hm.. _________________ just my two cents. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.12.2003, 10:49 Titel: |
|
|
Die UV-Koordinaten brauche ich aber erst im Pixelshader wo ich die ganzen Vektoren schon haben müsste. Das klappt ja auch alles schon.
(Muss wohl bald mal meinen Quellcode hochladen) _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 31.12.2003, 13:34 Titel: |
|
|
So also das mit den Uv Kordinaten stimmt. Du must erstmal für jedes Dreieck eine Tangnetspace erstellen so bekommst du die benötigten Kordinaten. Hier mal der Code zur erstellung des TangentVectors:
Code: | Dim i, u As Integer
Dim fu21, fv21, fu31, fv31 As Single
Dim vc, vcA, vcB, vcC As Vector3
Dim tangent As Vector3
Dim v As VERTEX_NORMAL() = CType(vb.Lock(0, 0), VERTEX_NORMAL())
For i = 0 To v.GetUpperBound(0) - 1
u = u + 1
If u = 3 Then
fu21 = v(i - 1).tex0.X - v(i - 2).tex0.X
fv21 = v(i - 1).tex0.Y - v(i - 2).tex0.Y
fu31 = v(i).tex0.X - v(i - 2).tex0.X
fv31 = v(i).tex0.Y - v(i - 2).tex0.Y
vcA = MakeVec3(v(i - 1).pos.X - v(i - 2).pos.X, fu21, fv21)
vcB = MakeVec3(v(i).pos.X - v(i - 2).pos.X, fu31, fv31)
vc = Vector3.Cross(vcA, vcB)
If vc.X <> 0 Then
v(i - 2).Custom1v3.X = -vc.Y / vc.X
v(i - 2).Custom2v3.X = -vc.Z / vc.X
End If
vcA = MakeVec3(v(i - 1).pos.Y - v(i - 2).pos.Y, fu21, fv21)
vcB = MakeVec3(v(i).pos.Y - v(i - 2).pos.Y, fu31, fv31)
vc = Vector3.Cross(vcA, vcB)
If vc.X <> 0 Then
v(i - 2).Custom1v3.Y = -vc.Y / vc.X
v(i - 2).Custom2v3.Y = -vc.Z / vc.X
End If
vcA = MakeVec3(v(i - 1).pos.Z - v(i - 2).pos.Z, fu21, fv21)
vcB = MakeVec3(v(i).pos.Z - v(i - 2).pos.Z, fu31, fv31)
vc = Vector3.Cross(vcA, vcB)
If vc.X <> 0 Then
v(i - 2).Custom1v3.Z = -vc.Y / vc.X
v(i - 2).Custom2v3.Z = -vc.Z / vc.X
End If
v(i - 2).Custom1v3.Normalize()
v(i - 2).Custom2v3.Normalize()
v(i - 1).Custom1v3 = v(i - 2).Custom1v3
v(i - 1).Custom2v3 = v(i - 2).Custom2v3
v(i).Custom1v3 = v(i - 2).Custom1v3
v(i).Custom2v3 = v(i - 2).Custom2v3
v(i - 2).Custom3v3 = Vector3.Cross(v(i - 2).Custom1v3, v(i - 2).Custom2v3)
v(i - 2).Custom3v3.Normalize()
If (Vector3.Dot(v(i - 2).Custom3v3, v(i - 2).normal) < 0) Then
v(i - 2).Custom3v3.Scale(-1)
End If
v(i - 1).Custom3v3 = Vector3.Cross(v(i - 1).Custom1v3, v(i - 1).Custom2v3)
v(i - 1).Custom3v3.Normalize()
If (Vector3.Dot(v(i - 1).Custom3v3, v(i - 1).normal) < 0) Then
v(i - 1).Custom3v3.Scale(-1)
End If
v(i).Custom3v3 = Vector3.Cross(v(i).Custom1v3, v(i).Custom2v3)
v(i).Custom3v3.Normalize()
If (Vector3.Dot(v(i).Custom3v3, v(i).normal) < 0) Then
v(i).Custom3v3.Scale(-1)
End If
u = 0
End If
Next
vb.Unlock()
|
So dieser Code berechnet für jedes Dreieck den Tangentenvector. Das gibt eine etwas unschönen Flat Effect du must also noch wie beim GroudShading statt der Face Tangenten die Edge Tangenten berechnen. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 31.12.2003, 14:40 Titel: |
|
|
Gibts da denn keine einfachere Möglichkeit ? Die von robx fand ich da ein wenig einfacher (auch wenn sie nicht immer funzt). _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 31.12.2003, 17:42 Titel: |
|
|
Und ich brauche ja die Tangenten... Vectoren für jeden Vertex und nicht nur für jedes Polygon. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 01.01.2004, 15:01 Titel: |
|
|
Habe ich doch schon gesagt du must danach einfach über alle Vertexe drübergehen und die die sich eine Ecke Teilen aufsummieren und dan den Mittelwert bilden. |
|
Nach oben |
|
|
|