UV-Koordinaten bei gewölbter Fläche

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Kruemelator

Betreff: UV-Koordinaten bei gewölbter Fläche

BeitragMo, Sep 30, 2013 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe eine quadratische Fläche die einer Seite eines Würfel entspricht. Sie ist in viele kleine Polygone unterteilt (tesseliert). Jeder Vertex dieser Fläche erhält nun eine neue Position indem der Positionsvektor normiert wird. Dadurch hat jeder vertex den Abstand 1 zum Zentrum. Wie muss ich hierbei die UV-Koordinaten anpassen um eine möglichst geringe Verzehrung zu erhalten. Die UV-Koordinaten dürfen von 0-1 gehen.

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
ClsColor 127,127,127

;Global--------------------------------------------
Global camera
Global mxs
Global mys
Global mzs
Global mht1
Global mht2

;Start--------------------------------------------
camera = CreateCamera()
AmbientLight 255,255,255


;Textur-------------------------------------------
tex = CreateTexture(128,128)
SetBuffer TextureBuffer(tex)
Color 255,0,0
Rect 0,0,128,128,1
Color 255,255,255
For y=0 To 16
For x=0 To 16
Rect x*2*8+(y Mod 2)*8,y*8,8,8,1
Next
Next
SetBuffer BackBuffer()

;Mesh---------------------------------------------
mesh = CreateMesh()
sur = CreateSurface(mesh)
br# = 64
For y=0 To br
For x=0 To br
xpos# = x/br*2-1
ypos# = y/br*2-1
zpos# = -1
l# = Sqr(xpos*xpos + ypos*ypos + zpos*zpos)
xpos = xpos / l
ypos = ypos / l
zpos = zpos / l
AddVertex(sur,xpos,ypos,zpos,x/br,1-y/br)
Next
Next
For y=0 To br-1
For x=0 To br-1
v0 = y*(br+1)+x
v1 = v0+1
v2 = (y+1)*(br+1)+x
v3 = v2+1
AddTriangle(sur,v1,v2,v3)
AddTriangle(sur,v0,v2,v1)
Next
Next
PositionEntity mesh,0,0,10
EntityTexture mesh,tex

;Hauptschleife------------------------------------
fps = CreateTimer(60)
While Not KeyHit(1)
WaitTimer(fps)
Cls
WireFrame KeyDown(57)
mx = MouseX()
my = MouseY()
mz = MouseZ()
mxs = MouseXSpeed()
mys = MouseYSpeed()
mzs = MouseZSpeed()
mht1 = MouseHit(1)
mht2 = MouseHit(2)


cammove()



UpdateWorld()
RenderWorld()

Flip 0
Wend
End

;Funktionen---------------------------------------
Function cammove()
If MouseDown(2) Then
RotateEntity camera,EntityPitch(camera)+mys/10.0,EntityYaw(camera)-mxs/10.0,0
speed# = 0.1
If KeyDown(17) Then MoveEntity camera,0,0,speed#
If KeyDown(31) Then MoveEntity camera,0,0,-speed#
If KeyDown(30) Then MoveEntity camera,-speed#,0,0
If KeyDown(32) Then MoveEntity camera,speed#,0,0
MoveEntity camera,0,speed#*mzs*5,0
MoveMouse 400,300
EndIf
End Function

Xeres

Moderator

BeitragMo, Sep 30, 2013 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Vorschlag:
BlitzBasic: [AUSKLAPPEN]
For y=0 To br
For x=0 To br
xpos# = x/br*2-1
ypos# = y/br*2-1
zpos# = -1

l# = Sqr(xpos*xpos + ypos*ypos + zpos*zpos)

u# = xpos * (1.0/l#)
v# = ypos * (1.0/l#)

xpos = xpos / l
ypos = ypos / l
zpos = zpos / l

AddVertex(sur,xpos,ypos,zpos, u#, v#)
Next
Next

Weiß nicht, wie man das genau nennt; aber die inverse Normalisierung sollte die Verzerrung halt ausgleichen...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Kruemelator

BeitragMo, Sep 30, 2013 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht war Verzehrung das falsche Wort.
Jeder Texel nimmt die selbe Fläche in der Textur ein. Die Oberflächen die von den Texeln bedeckt sind weichen aber zwischen den einzelnen Texeln ab. Ich suche nun eine Möglichkeit diese abweichung zu minimieren.
Xeres, bei deiner Idee nehmen die Texel am Rand wesendlich mehr Oberfläche ein als in der Mitte.
Meine Beste Idee ist bisher meine und deine Idee in einem bestimmten Verhältnis zu kombinieren.
 

Mr.Floppy

BeitragMi, Okt 09, 2013 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir nicht ganz sicher ob ich dein Problem richtig verstehe, aber ich versuche es trotzdem.

Die UV-Koordinaten sind 2D und insofern musst du die ursprünglichen UV-Koordinaten der "einfachen Fläche" analog zur 3D-Tesselierung unterteilen. Das heißt, dein (gedachtes) UV-Gitter bleibt quadratisch und hat nun so viele Kästchen, wie dein Face einzelne Quads hat. Die entstehenden Krümmungen bleiben komplett unberücksichtigt.

Mit einer gewissen Verzerrung, je nach grad der Wölbung, musst du leben. Sobald eine Fläche um mehr als eine Dimension gewunden wird, kannst du keine UV-Map erstellen, welche gleichzeitig seamless ist und keine Verzerrungen hat. Bei einem Zylinder würde es noch funktionieren, die Kappen mal außen vor gelassen. Jedoch bei einer Halbkugel, wie quasi in deinem Fall, klappt das nicht.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group