JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=4023f1deaae8fa22305b22cca6447677Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Normalen,Tangenten,Binormalen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 24.11.2003, 10:09    Titel: Normalen,Tangenten,Binormalen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
robx
Mini JLI'ler



Anmeldedatum: 02.12.2003
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 02.12.2003, 21:55    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 03.12.2003, 11:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
robx
Mini JLI'ler



Anmeldedatum: 02.12.2003
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 03.12.2003, 12:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.12.2003, 10:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
robx
Mini JLI'ler



Anmeldedatum: 02.12.2003
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 04.12.2003, 10:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.12.2003, 10:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 31.12.2003, 13:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 31.12.2003, 14:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 31.12.2003, 17:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 01.01.2004, 15:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum