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
Einfach mit den Pfeiltasten die "Position" des Übergangs steuern
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
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] 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) 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 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
|