Mesh Morphing

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Chrise

Betreff: Mesh Morphing

BeitragDi, Apr 21, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich hatte jetzt doch mal den Entschluss das ganze zu versuchen. Keine Ahnung ob das jemand vor mir schon mal gemacht hatte. Wir werden sehen Wink

Einfach mit den Pfeiltasten die "Position" des Übergangs steuern Smile
Ist aber noch nicht ganz ausgereift. Ich denke bei Objekten die ein Mesh mit getrennten Teilen besitzen, könnte es zu Grafikfehlern kommen...

Einfach mit
MeshNeu=InitMorph(Mesh1,Mesh2)
Die Morphdaten laden und das neue Objekt erstellen, das transformiert werden soll.
Mesh1 und Mesh2 dienen also nur als Formvorlage und können nach dem Befehl auch wieder gelöscht werden.
Und dann mit MorphEntity(Mesh,stärke#) das morphen steuern Smile

BlitzBasic: [AUSKLAPPEN]

Graphics3D 800,600,0,2
Timer=CreateTimer(25)

Camera=CreateCamera()
PositionEntity Camera,0,0,-5
CameraClsColor Camera,64,64,64

Light=CreateLight()
RotateEntity Light,90,0,0

Mesh1=CreateSphere()
RotateEntity Mesh1,20,50,50
EntityFX Mesh1,2

Su=CountSurfaces(Mesh1)
For I=1 To Su
SuA=GetSurface(Mesh1,I)
For V=0 To (CountVertices(SuA)-1)
VertexColor Sua,V,255,0,0,0
Next
Next

Mesh2=CreateCube()
EntityFX Mesh2,32

Mesh=InitMorph(Mesh1,Mesh2)
FreeEntity Mesh1
FreeEntity Mesh2

Tex=CreateTexture(16,16)
SetBuffer TextureBuffer(Tex)
Color 0,0,255
For i=0 To 15 Step 2
Rect 0,i,16,1,1
Next

EntityTexture Mesh,Tex
TextureBlend Tex,3

SetBuffer BackBuffer()
While Not KeyHit(1)
If KeyDown(203) Then s#=s#-0.025
If KeyDown(205) Then s#=s#+0.025
If s#>1 Then s#=1
If s#<0 Then s#=0

MorphEntity(Mesh,s#)
TurnEntity Mesh,1,0.5,0.25

RenderWorld

Rect 50,50,400,10,0
Rect 50,50,s#*400,10,1

WaitTimer Timer
Flip 0
Wend

Function MorphEntity(Mesh,m1#)
Local m2#,data1#,data2#,data3#,data4#,S,V
m2#=1-m1#
For MorphData.Morph=Each Morph
If MorphData\mesh=Mesh Then
S=MorphData\S
V=MorphData\V
data1#=MorphData\x1#*m1#+MorphData\x2#*m2#
data2#=MorphData\y1#*m1#+MorphData\y2#*m2#
data3#=MorphData\z1#*m1#+MorphData\z2#*m2#
VertexCoords S,V,data1#,data2#,data3#
data1#=MorphData\nx1#*m1#+MorphData\nx2#*m2#
data2#=MorphData\ny1#*m1#+MorphData\ny2#*m2#
data3#=MorphData\nz1#*m1#+MorphData\nz2#*m2#
VertexNormal S,V,data1#,data2#,data3#
data1#=MorphData\u1#*m1#+MorphData\u2#*m2#
data2#=MorphData\v1#*m1#+MorphData\v2#*m2#
data3#=MorphData\w1#*m1#+MorphData\w2#*m2#
VertexTexCoords S,V,data1#,data2#,data3#
data1#=MorphData\r1*m1#+MorphData\r2*m2#
data2#=MorphData\g1*m1#+MorphData\g2*m2#
data3#=MorphData\b1*m1#+MorphData\b2*m2#
data4#=MorphData\a1#*m1#+MorphData\a2#*m2#
VertexColor S,V,data1#,data2#,data3#,data4#
EndIf
Next
End Function

Function InitMorph(Mesh1,Mesh2)
Local I,J,K,L,M,VDist#,Dx#,Dy#,Dz#
Local MinDist#,MinS,MinV
Local S,V,MeshTemp,Mesh3
Local Surfaces1,Surfaces2,Surface1,Surface2
Local Vertices1,Vertices2
Local MorphData.Morph
Vertices1=EasyCountVertices(Mesh1)
Vertices2=EasyCountVertices(Mesh2)
If Vertices2>Vertices1 Then Mesh3=Mesh1:Mesh1=Mesh2:Mesh2=Mesh3
Mesh3=CopyEntity(Mesh1)
Surfaces1=CountSurfaces(Mesh1)
Surfaces2=CountSurfaces(Mesh2)
For I=1 To Surfaces1
Surface1=GetSurface(Mesh1,I)
For J=0 To (CountVertices(Surface1)-1)
;Für alle Vertices des 1 Objekts
M=0
For K=1 To Surfaces2
Surface2=GetSurface(Mesh2,K)
For L=0 To (CountVertices(Surface2)-1)
Dx#=VertexX(Surface1,J)-VertexX(Surface2,L)
Dy#=VertexY(Surface1,J)-VertexY(Surface2,L)
Dz#=VertexZ(Surface1,J)-VertexZ(Surface2,L)
VDist#=(Dx#*Dx#+Dy#*Dy#+Dz#*Dz#)^0.333333
If M=0 Then
MinDist#=VDist#
MinS=Surface2
MinV=L
M=1
Else If VDist#<MinDist# Then
MinDist#=VDist#
MinS=Surface2
MinV=L
M=1
EndIf
Next
Next
;Weiter
MorphData.Morph=New Morph
S=Surface1
V=J
MorphData\mesh=Mesh3
MorphData\s=S
MorphData\v=V

MorphData\x1#=VertexX(S,V)
MorphData\y1#=VertexY(S,V)
MorphData\z1#=VertexZ(S,V)
MorphData\nx1#=VertexNX(S,V)
MorphData\ny1#=VertexNY(S,V)
MorphData\nz1#=VertexNZ(S,V)
MorphData\u1#=VertexU(S,V)
MorphData\v1#=VertexV(S,V)
MorphData\w1#=VertexW(S,V)
MorphData\r1#=VertexRed(S,V)
MorphData\g1#=VertexGreen(S,V)
MorphData\b1#=VertexBlue(S,V)
MorphData\a1#=VertexAlpha(S,V)

MorphData\x2#=VertexX(MinS,MinV)
MorphData\y2#=VertexY(MinS,MinV)
MorphData\z2#=VertexZ(MinS,MinV)
MorphData\nx2#=VertexNX(MinS,MinV)
MorphData\ny2#=VertexNY(MinS,MinV)
MorphData\nz2#=VertexNZ(MinS,MinV)
MorphData\u2#=VertexU(MinS,MinV)
MorphData\v2#=VertexV(MinS,MinV)
MorphData\w2#=VertexW(MinS,MinV)
MorphData\r2#=VertexRed(MinS,MinV)
MorphData\g2#=VertexGreen(MinS,MinV)
MorphData\b2#=VertexBlue(MinS,MinV)
MorphData\a2#=VertexAlpha(MinS,MinV)
Next
Next
Return Mesh3
End Function
Function EasyCountVertices(Mesh)
Local Surfaces,Vertices,I
Surfaces=CountSurfaces(Mesh)
For I=1 To Surfaces
Vertices=Vertices+CountVertices(GetSurface(Mesh,I))
Next
Return Vertices
End Function
Type Morph
Field mesh,s,v
Field x1#,y1#,z1#,nx1#,ny1#,nz1#,u1#,v1#,w1#,r1,g1,b1,a1#
Field x2#,y2#,z2#,nx2#,ny2#,nz2#,u2#,v2#,w2#,r2,g2,b2,a2#
End Type
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group