UpdateNormals: unerwartetes Ergebnis
Übersicht

KruemelatorBetreff: UpdateNormals: unerwartetes Ergebnis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe bei einem Mesh die Vertex selbst gesetzt und Triangles erstellt. Dann natürlich Updatenormals benutzt, aber das scheint irgendwie zu spinnen. Und ich habe noch nicht mal annähernd eine Idee warum.
Mehrere Triangles benutzen den selben Vertex, aber dass dürfte dann doch nicht so extrem ausfallen oder irre ich mich da? Hier noch ein Bild was es gut verdeutlicht. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
UpdateNormals richtet die Normalen aus, nicht jedoch die Zeichenrichtung der Triangles. Wenn du nun willkürlich deine Triangles gezeichnet hast, dann kann UpdateNormals nicht bestimmen, wie die Normalen zu deiner Zufriedenheit ausgerichtet werden sollen.
Ich hab aber eine ganz dunkle Ahnung im Hinterkopf, dass es im Codearchiv eine Funktion geben könnte, die genau das macht. Nämlich alle Triangles eines Meshes so ausrichtet, wie man es als Benutzer zu erwarten hätte. Ob meine Ahnung nur ein Traum von mir war, oder es tatsächlich gibt, kann ich nicht sagen. Auch nicht, wonach man suchen sollte. Alternativ bleibt dir natürlich das Mesh entsprechend nachzubearbeiten, oder dir eine Funktion zu schreiben, die das selbst überprüft und ggf. ändert. Wichtig ist also die Drehrichtung (im Uhrzeigersinn / gegen den Uhrzeigersinn) wie ein Triangle gezeichnet wurde. Denn diese entscheidet nicht nur das Backface-Culling, sondern liefert eben die ''Nahrung'' für UpdateNormals aus einem Geflecht die Normalen auszurichten. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin mir nicht sicher ob ich dich verstanden habe, aber die Triangles sind alle "richtig herum gedreht". Ich nutze kein EntityFx 16. Die Dunklen Stellen bleiben auch immer so dunkel, egal wie das Entity gedreht ist, die hellen passen sich jedoch entsprechen an. Und wenn ich die Vertexe nur leicht verschiebe im Mesh dann entstehen komplett neue "Muster".
Wenn ich für jedes Triangle eigene Vertexe nutze, würde es dann einen großen Leistungsunterschied geben? Vor allem bei mehreren Objekten? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmmm, nee, sorry, dann fällt mir auch erstmal nichts weiteres dazu ein. Ich hätte ja noch gesagt, dass ein möglicher Grund noch sein könnte, das nicht jede Bindestelle durch nur einen Vertice besteht. Aber dann müsste man harte Kanten erkennen, die die einzelne Triangles abbilden. Das ist aber nicht der Fall. Lediglich etwas schleierhaft finde ich die Stelle unten/links. Da sieht es so aus, als ob ein zusätzliches Quad über den Mesh gezeichnet wurde. Also doppelt gemoppelt.
Was sagt den der: - Polygon-Count - Vertices-Count ? |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm, das ist sehr eigenartig.
Kann es sein, dass die Vertices/Dreiecke nicht alle auf einer Surface liegen? Ansonsten poste mal deinen Code, nur so fällt mir grade auch nichts mehr ein. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hast du evtl vertexfarben verwendet bzw nicht und texturkoordinaten nicht richtig gesetzt? | ||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mal bisschen rumgekramt und den Code gefunden ![]() Er ist von sswift. Zitat: This function calculates both the face and vertex normals for a mesh using a method which does NOT smooth across vertcies that sit at the same location in space. If two faces do not share a vertex, no smoothing will take place. This allows you to more easily build levels which have sharp corners. For exmaple, if you make a cube which has six seperate sides, with no vertcies shared between sides, this function will smooth it properly, whereas the built in function will not.
BlitzBasic: [AUSKLAPPEN] Dim Face_NX#(32768) Ist das Ergebnis in Ordnung? |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@hectic:
Triangle: 3072 Vertexe: 1266 Surface: 1 @Noobody: Die Vertexe und Triangles sind alle in einem Surface. @Silver_Knee: EntityColor ist das einzige mit dem ich das Entity einfärbe. Weder Texture noch Vertexfarben. @NightPhoenix: Mit der Funktion wird alles korrekt dargestellt. Worin unterscheidet sich diese dann von UpdateNormals? Ich dachte immer das ist genau das was UpdateNormals macht. |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Funktion setzt für alle Vertex die Normalen einzeln neu. Sie setzt sie dabei senkrecht zur Ausrichtung jedes Vertex, so kommt auch die richtige Beleuchtung zustande. Die Funktion baut auf Vektoren auf. | ||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein. Ein Vertex hat per se keine "Richtung". Die Funktion von sswift berechnet die Vertexnormale einfach aus den Normalen (also "Richtungen") der Dreiecke, zu denen ein Vertex gehört. Das UpdateNormals![]() |
||
MrKeks.net |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Mr.Keks:
Das würde voraussetzen dass mehrere Vertexe auf der selben Position sind, dies ist aber bei dem Mesh nie der Fall. Und es erklärt leider auch nicth weshalb bei einer minimalen Verschiebung der Vertexe ein komplett neues "Muster" entsteht oder auch alles wieder richtig dargestellt wird. Es dürfte dann doch nur eine minimale Abweichung entstehen. Außerdem ist der Vertex immer so dunkel egal wie das Entity gedreht wird. So als hätte der Vertex keine Normale. |
||
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja, es sei denn, du hast, wie hier schon mehrfach vermutet, irgendwo verkehrt gedrehte oder unendlich schmale tris drin, die du eben nicht wahrnimmst und die dafür sorgen, dass da 0-vektoren als normalen entstehen (was eigentlich von blitz abgefangen werden sollte...) mit denen funktioniert beleuchtung naheliegenderweise auch nicht ordentlich.
aber wir haben halt etwas wenig infos darüber, was du da wirklich machst. |
||
MrKeks.net |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Benutzt Du EntityFx 16 oder doppelseitige Polygone? Klingt als wäre die Struktur Deines Meshs nicht ganz sauber.
Jedes Vertex müsste nach UpdateNormals eine Normale besitzen - die Frage ist nur in welche Richtung diese ausgerichtet ist. So würde z.B. bei einer entgegengesetzten Normalen die vom Licht abgewandte Seite beleuchtet. Wobei, vielleicht könnte sich die Berechnung gegenseitig aufheben so dass 0 als Normale rauskommt? Wie auch immer - wenn Du meine Eingangsfrage mit Ja beantwortest könnte das solche Auswirkungen haben. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier mal der Code, vielleicht findet ihr ja den Grund, aufjedenfall setze ich jetzt die Vertexnormals selber, so dass es funktioniert. Trotzdem danke für die Hilfe. ![]() Code: [AUSKLAPPEN] ;Variablen--------------------------------
Global xfenster = 800 Global yfenster = 600 Global farbtiefe = 16 Global windowmod = 2 ;Globale---------------------------------- Global mxs# Global mys# Global mzs# Global mht1 Global mht2 ;3D Welt---------------------------------- Graphics3D xfenster,yfenster,farbtiefe,windowmod SetBuffer BackBuffer() WireFrame 0 ClsColor 255,255,255 Color 0,0,0 SeedRnd MilliSecs() Global camera = CreateCamera() CameraRange camera,0.001,100 CameraClsColor camera,255,255,255 PositionEntity camera,0,1,-3 Local light = CreateLight() ;Welt------------------------------------- Global monster = CreateCube() For a=0 To -1 mesh2 = CreateCube() PositionMesh mesh2,Rand(-1,1)*2,Rand(-1,1)*2,Rand(-1,1)*2 AddMesh mesh2,monster FreeEntity mesh2 Next ScaleMesh monster,0.5,0.5,0.5 ScaleEntity monster,1,1,1 PositionEntity monster,0,1,0 EntityColor monster,150,150,150 ;Start------------------------------------ einflaechenmesh(monster) For a=0 To 200 teilen(monster,0.3) Next glaetten(monster,0.2) ;Ende------------------------------------- fpsrate = CreateTimer(60) While Not KeyHit(1) WaitTimer(fpsrate) Cls mxs# = MouseXSpeed() mys# = MouseYSpeed() mzs# = MouseZSpeed() mht1 = MouseHit(1) mht2 = MouseHit(2) cammove() aendern() TurnEntity monster,0,04,0 UpdateWorld RenderWorld Flip 0 Wend End ;Funktionen------------------------------- Function aendern() WireFrame MouseDown(1) If KeyDown(57) Then teilen(monster,0.2) If KeyHit(28) Then glaetten(monster,0.2) EndIf End Function Function einflaechenmesh(mesh) Local surface Local a,b,c,on,wert,anzahl Local v1,v2,v3,va,vb Local xwert#,ywert#,zwert# Local xwert2#,ywert2#,zwert2# Local bank Local tribank bank = CreateBank(0) tribank = CreateBank(0) For a=1 To CountSurfaces(mesh) surface = GetSurface(mesh,a) anzahl = 0 ;bank = CreateBank(0) For b=0 To CountVertices(surface)-1 xwert# = VertexX(surface,b) ywert# = VertexY(surface,b) zwert# = VertexZ(surface,b) xwert2# = xwert#+1 ywert2# = ywert# zwert2# = zwert# on = 0 For c=0 To anzahl If anzahl <> 0 Then xwert2# = PeekFloat(bank,c*12+0) ywert2# = PeekFloat(bank,c*12+4) zwert2# = PeekFloat(bank,c*12+8) EndIf If (xwert=xwert2) + (ywert=ywert2) + (zwert=zwert2) <> 3 Then on = 1 Exit EndIf Next If on = 1 Then wert = BankSize(bank) ResizeBank bank,wert+12 PokeFloat bank,wert+0,xwert# PokeFloat bank,wert+4,ywert# PokeFloat bank,wert+8,zwert# anzahl = anzahl + 1 EndIf Next ;tribank = CreateBank(banksize(tribank)+CountTriangles(surface)*12) wert = BankSize(tribank) ResizeBank tribank,wert+CountTriangles(surface)*12 For b=0 To CountTriangles(surface)-1 v1 = TriangleVertex(surface,b,0) v2 = TriangleVertex(surface,b,1) v3 = TriangleVertex(surface,b,2) v1 = neuvertexindex(surface,bank,v1) v2 = neuvertexindex(surface,bank,v2) v3 = neuvertexindex(surface,bank,v3) PokeInt tribank,wert+b*12+0,v1 PokeInt tribank,wert+b*12+4,v2 PokeInt tribank,wert+b*12+8,v3 Next ClearSurface surface ;For b=0 To BankSize(bank)/12-1 ; AddVertex(surface,PeekFloat(bank,b*12+0),PeekFloat(bank,b*12+4),PeekFloat(bank,b*12+8)) ;Next ;For b=0 To BankSize(tribank)/12-1 ; AddTriangle(surface,PeekInt(tribank,b*12+0),PeekInt(tribank,b*12+4),PeekInt(tribank,b*12+8)) ;Next ;FreeBank bank ;FreeBank tribank Next For b=0 To BankSize(bank)/12-1 AddVertex(surface,PeekFloat(bank,b*12+0),PeekFloat(bank,b*12+4),PeekFloat(bank,b*12+8)) Next For b=0 To BankSize(tribank)/12-1 AddTriangle(surface,PeekInt(tribank,b*12+0),PeekInt(tribank,b*12+4),PeekInt(tribank,b*12+8)) Next FreeBank bank FreeBank tribank UpdateNormals mesh End Function Function neuvertexindex(surface,bank,v) Local xwert#,ywert#,zwert# Local xwert2#,ywert2#,zwert2# Local a xwert# = VertexX(surface,v) ywert# = VertexY(surface,v) zwert# = VertexZ(surface,v) For a=0 To BankSize(bank)/12-1 xwert2# = PeekFloat(bank,a*12+0) ywert2# = PeekFloat(bank,a*12+4) zwert2# = PeekFloat(bank,a*12+8) If (xwert=xwert2) + (ywert=ywert2) + (zwert=zwert2) = 3 Then Return a EndIf Next RuntimeError "Vertex ist bei der Suche nciht gefunden worden.!" End Function Function glaetten(mesh,staerke#=0.2) Local surface Local a,b,c,on Local v1,v2,v3,va,vb Local xwert#,ywert#,zwert#,anzahl Local bank For a=1 To CountSurfaces(mesh) surface = GetSurface(mesh,a) bank = CreateBank(CountVertices(surface)*16) ;0 x ;4 y ;8 z ;anzahl For b=0 To CountVertices(surface)-1 PokeFloat bank,b*16+0,0.0 PokeFloat bank,b*16+4,0.0 PokeFloat bank,b*16+8,0.0 PokeInt bank,b*16+12,0 For c=0 To CountTriangles(surface)-1 v1 = TriangleVertex(surface,c,0) v2 = TriangleVertex(surface,c,1) v3 = TriangleVertex(surface,c,2) on = 1 Select b Case v1 va = v2 vb = v3 Case v2 va = v1 vb = v3 Case v3 va = v1 vb = v2 Default on = 0 End Select If on Then xwert# = PeekFloat(bank,b*16+0) + VertexX(surface,va)-VertexX(surface,b) ywert# = PeekFloat(bank,b*16+4) + VertexY(surface,va)-VertexY(surface,b) zwert# = PeekFloat(bank,b*16+8) + VertexZ(surface,va)-VertexZ(surface,b) anzahl = PeekInt(bank,b*16+12) PokeFloat bank,b*16+0,xwert# PokeFloat bank,b*16+4,ywert# PokeFloat bank,b*16+8,zwert# PokeInt bank,b*16+12,anzahl+1 xwert# = PeekFloat(bank,b*16+0) + VertexX(surface,vb)-VertexX(surface,b) ywert# = PeekFloat(bank,b*16+4) + VertexY(surface,vb)-VertexY(surface,b) zwert# = PeekFloat(bank,b*16+8) + VertexZ(surface,vb)-VertexZ(surface,b) anzahl = PeekInt(bank,b*16+12) PokeFloat bank,b*16+0,xwert# PokeFloat bank,b*16+4,ywert# PokeFloat bank,b*16+8,zwert# PokeInt bank,b*16+12,anzahl+1 EndIf Next Next For b=0 To CountVertices(surface)-1 anzahl = PeekInt(bank,b*16+12) xwert# = PeekFloat(bank,b*16+0)/Float(anzahl)*staerke# + VertexX(surface,b) ywert# = PeekFloat(bank,b*16+4)/Float(anzahl)*staerke# + VertexY(surface,b) zwert# = PeekFloat(bank,b*16+8)/Float(anzahl)*staerke# + VertexZ(surface,b) VertexCoords surface,b,xwert#,ywert#,zwert# Next FreeBank bank Next UpdateNormals mesh End Function Function teilen(mesh,minlaenge# = 0.00) Local surzahl Local surface Local trizahl Local a Local b Local v1,v2,v3 Local mv1,mv2,mlaenge#,msurface Local nv Local wert# surzahl = CountSurfaces(mesh) For a=1 To surzahl surface = GetSurface(mesh,a) trizahl = CountTriangles(surface) For b=0 To trizahl-1 v1 = TriangleVertex(surface,b,0) v2 = TriangleVertex(surface,b,1) v3 = TriangleVertex(surface,b,2) wert# = vertexentf#(surface,v1,v2) If wert# > mlaenge# Then mlaenge# = wert# msurface = surface mv1 = v1 mv2 = v2 EndIf wert# = vertexentf#(surface,v2,v3) If wert# > mlaenge# Then mlaenge# = wert# msurface = surface mv1 = v2 mv2 = v3 EndIf wert# = vertexentf#(surface,v3,v1) If wert# > mlaenge# Then mlaenge# = wert# msurface = surface mv1 = v3 mv2 = v1 EndIf Next Next If minlaenge# >= mlaenge# Then Return ;Liste der Triangle mit beiden Punkte Local deltribank = CreateBank(0) surzahl = CountSurfaces(mesh) surface = msurface trizahl = CountTriangles(surface) For b=0 To trizahl-1 v1 = TriangleVertex(surface,b,0) v2 = TriangleVertex(surface,b,1) v3 = TriangleVertex(surface,b,2) If (v1 = mv1)+(v2 = mv1)+(v3 = mv1)+(v1 = mv2)+(v2 = mv2)+(v3 = mv2) = 2 Then wert = BankSize(deltribank) ResizeBank deltribank,wert+4 PokeInt deltribank,wert,b EndIf Next ;liste mit triangles erstellen Local tribank = CreateBank(0) Local on Local x#,y#,z# Local art,v surzahl = CountSurfaces(mesh) surface = msurface trizahl = CountTriangles(surface) x# = (VertexX(surface,mv1)+VertexX(surface,mv2))/2.0 y# = (VertexY(surface,mv1)+VertexY(surface,mv2))/2.0 z# = (VertexZ(surface,mv1)+VertexZ(surface,mv2))/2.0 nv = AddVertex(surface,x#,y#,z#) For b=0 To trizahl-1 v1 = TriangleVertex(surface,b,0) v2 = TriangleVertex(surface,b,1) v3 = TriangleVertex(surface,b,2) on = 0 For a=0 To BankSize(deltribank)/4-1 If PeekInt(deltribank,a*4) = b Then on = 1 Exit EndIf Next If on = 0 Then wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,v1 PokeInt tribank,wert+ 4,v2 PokeInt tribank,wert+ 8,v3 Else If v1 <> mv1 And v1 <> mv2 Then art = 1 EndIf If v2 <> mv1 And v2 <> mv2 Then art = 2 EndIf If v3 <> mv1 And v3 <> mv2 Then art = 3 EndIf If art = 1 Then wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,v1 PokeInt tribank,wert+ 4,v2 PokeInt tribank,wert+ 8,nv wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,v1 PokeInt tribank,wert+ 4,nv PokeInt tribank,wert+ 8,v3 EndIf If art = 2 Then wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,nv PokeInt tribank,wert+ 4,v2 PokeInt tribank,wert+ 8,v3 wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,v1 PokeInt tribank,wert+ 4,v2 PokeInt tribank,wert+ 8,nv EndIf If art = 3 Then wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,nv PokeInt tribank,wert+ 4,v2 PokeInt tribank,wert+ 8,v3 wert = BankSize(tribank) ResizeBank tribank,wert+12 PokeInt tribank,wert+ 0,v1 PokeInt tribank,wert+ 4,nv PokeInt tribank,wert+ 8,v3 EndIf EndIf Next ;surface loeschen ClearSurface surface,0,1 ;neue triangle erstellen For a=0 To BankSize(tribank)/12-1 AddTriangle(surface,PeekInt(tribank,a*12),PeekInt(tribank,a*12+4),PeekInt(tribank,a*12+8)) Next UpdateNormals mesh FreeBank tribank FreeBank deltribank End Function Function vertexentf#(surface,v1,v2) Local xwert# = VertexX(surface,v1)-VertexX(surface,v2) Local ywert# = VertexY(surface,v1)-VertexY(surface,v2) Local zwert# = VertexZ(surface,v1)-VertexZ(surface,v2) Return (xwert*xwert+ywert*ywert+zwert*zwert)^0.5 End Function Function cammove() TurnEntity camera,mys#/20,mxs#/-20,0 RotateEntity camera,EntityPitch(camera),EntityYaw(camera),0 MoveMouse 400,300 If KeyDown(17) Then MoveEntity camera,0,0,0.1 If KeyDown(31) Then MoveEntity camera,0,0,-0.1 If KeyDown(30) Then MoveEntity camera,-0.1,0,0 If KeyDown(32) Then MoveEntity camera,0.1,0,0 TranslateEntity camera,0,mzs#/2,0 End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group