HLC SoftPixel Mini 3D Engine

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

LukasBanana hat geschrieben:@scholly: ich habe deine Frage nicht so ganz verstanden.
Als ich gesehen habe, mit wie wenig Code das HLC_3D_MiniDemo.pb ausgekommen ist, hab ich mich gefragt, ob man nicht das Logo auch auf einen Zylinder legen könnte, der sich nur um die senkrechte Achse dreht.

Ich hab dann in Dein Include geguckt, das gefunden:

Code: Alles auswählen

Procedure.l spCreate3DCylinder(ObjID.l, ImgNr.l, Radius.f = 100, Detail.l = 10, Trans.l = 255)
  i.f = 0.0
  While i < 360
    ;Create3DQuadrangle(ObjID, ImgNr, )
    
    i + 360 / Detail
  Wend
  ; Return Quadrangle Count
  ProcedureReturn CountList(Engine3D())
EndProcedure
und ganz naiv gedacht, daß man nur wenige Änderung bräuchte, um den drehenden Zylinder hinzubekommen.
Mittlerweile haben mir allerdings NTQ und Andreas_S gezeigt, daß da mehr zugehört...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Man kann zwar nicht bei TransformSprite3D() die Texturkoordinaten angeben, aber man kann die (PB)Sprite3D Struktur anzapfen und darin die Texturkoordinaten, auch die Vertexfarbe verändern. Leider finde ich die Funktion gerade nicht, aber du findest sie sicher irgendwo hier im Forum oder in der Lounge.

Edit: habs doch gefunden, hier zwei Funktionen von mir um Vertexkoordinaten/-farben zu verändern (ursprünglicher Code, leider kA mehr von wem, war nur zum verändern der Textur):

Code: Alles auswählen

Structure DDPIXELFORMAT
  dwSize.l
  dwFlags.l
  dwFourCC.l
  dwRGBBitCount.l
  dwRBitMask.l
  dwGBitMask.l
  dwBBitMask.l
  dwRGBAlphaBitMask.l
EndStructure

Structure DDCOLORKEY
  dwColorSpaceLowValue.l
  dwColorSpaceHighValue.l
EndStructure

Structure DDSCAPS2
  dwCaps.l
  dwCaps2.l
  dwCaps3.l
  dwCaps4.l
EndStructure

Structure DDSURFACEDESC2
  dwSize.l
  dwFlags.l
  dwHeight.l
  dwWidth.l
  lPitch.l
  dwBackBufferCount.l
  dwRefreshRate.l
  dwAlphaBitDepth.l
  dwReserved.l
  lpSurface.l
  ddckCKDestOverlay.DDCOLORKEY
  ddckCKDestBlt.DDCOLORKEY
  ddckCKSrcOverlay.DDCOLORKEY
  ddckCKSrcBlt.DDCOLORKEY
  ddpfPixelFormat.DDPIXELFORMAT
  ddsCaps.DDSCAPS2
  dwTextureStage.l
EndStructure

Structure D3DTLVERTEX
  sx.f
  sy.f
  sz.f
  rhw.f
  color.l
  specular.l
  tu.f
  tv.f
EndStructure

Structure PB_Sprite3D
  Texture.IDirectDrawSurface7 
  Vertex.D3DTLVERTEX[4]
  width.w
  Height.w
  unknown.l
EndStructure

Macro RGBA(__Red,__Green,__Blue,__Alpha = $FF)
  ((__Alpha) << 24 + (__Blue) << 16 + (__Green) << 8 + (__Red))
EndMacro

Procedure Sprite3D_SetTextureCoordinates(Sprite3D.l, u0.f, v0.f, u1.f, v1.f, u2.f, v2.f, u3.f, v3.f)
  *Sprite3D.PB_Sprite3D = IsSprite3D(Sprite3D)
  
  If *Sprite3D = 0
    ProcedureReturn #False
  EndIf
  *DDS.IDirectDrawSurface7 = *Sprite3D\Texture
  
  DDSDESC.DDSURFACEDESC2
  DDSDESC\dwSize = SizeOf(DDSURFACEDESC2)
  result = *DDS\GetSurfaceDesc(DDSDESC)
  If result
    ProcedureReturn #False
  EndIf
  
  *Sprite3D\Vertex[0]\tu = u0
  *Sprite3D\Vertex[0]\tv = v0
  
  *Sprite3D\Vertex[1]\tu = u1
  *Sprite3D\Vertex[1]\tv = v1
  
  *Sprite3D\Vertex[2]\tu = u2
  *Sprite3D\Vertex[2]\tv = v2
  
  *Sprite3D\Vertex[3]\tu = u3
  *Sprite3D\Vertex[3]\tv = v3
  
  ProcedureReturn #True
EndProcedure

Procedure Sprite3D_SetVertexColors(Sprite3D.l, color0.l, color1.l, color2.l, color3.l)
  ; Farbe braucht Alphawert, also RGBA-Makro benutzen!!
  
  *Sprite3D.PB_Sprite3D = IsSprite3D(Sprite3D)
  
  If *Sprite3D = 0
    ProcedureReturn #False
  EndIf
  *DDS.IDirectDrawSurface7 = *Sprite3D\Texture
  
  DDSDESC.DDSURFACEDESC2
  DDSDESC\dwSize = SizeOf(DDSURFACEDESC2)
  result = *DDS\GetSurfaceDesc(DDSDESC)
  If result
    ProcedureReturn #False
  EndIf
  
  *Sprite3D\Vertex[0]\color = color0
  *Sprite3D\Vertex[1]\color = color1
  *Sprite3D\Vertex[2]\color = color2
  *Sprite3D\Vertex[3]\color = color3
  
  ProcedureReturn #True
EndProcedure
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag von LukasBanana »

Ja die Funktion 'spCreate3DCylinder' hatte ich mal angefangen aber ich hab dann auch dran gedacht dass das mit den Texture Koordinaten ein kleines Problem ist.
Probier mal mit dem was 'AndyX' geschrieben hat klar zu kommen, allerdings kann ich mir vorstellen dass das, auf Grund deiner Signatur, nicht ganz einfach ist oder?!
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

LukasBanana hat geschrieben: allerdings kann ich mir vorstellen dass das, auf Grund deiner Signatur, nicht ganz einfach ist oder?!
Richtig, ich taste mich gaaanz langsam an den GFx-/Sprite-Bereich heran.
Und für die "Bild auf rotierendem Zylinder"-Darstellung hat NTQ in einem anderen Thread eine FMPOV tolle Lösung gepostet.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag von LukasBanana »

Naja haupt Sache du kannst was mit meiner 3D Engine anfangen <)
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Mhh.. mit "meiner" Funktion sollte es doch relativ einfach sein, einen Zylinder mithilfe von spCreate3DQuadrangle() zu erzeugen...

Ich kann ja eine CreateCylinder()-Func schreiben, wenn ich nachher mal eben ein bisschen Zeit habe..
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag von LukasBanana »

Ja, dann müsste man nur noch in die 'Engine3DStruct' 'TexCoords[4].POINT' hinzufügen und dementsprechend die Funktionen erweitern bzw. eins- zwei neue schreiben.

Ich probier 'deine' Funktionen demnächste vlt. mal aus, aber momentan bin ich an einer richtigen 'C++ OpenGL 3D Engine' :wink:
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Das sieht aus, als wäre man besoffen, wenn man die linke Maustaste drückt =D Geiler Effekt...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ich weiß ja nicht, wie es bei euch aussieht, aber zwei Dinge sind mir aufgefallen.

- das schwarze Vierecke unter dem Spieler beim Starten, ähnlich den Vierecken am Rand, wenn man in der Nähe der Wand steht oder das Mausrad nutzt

- der Würfel, der nur aus seinem Rahmen besteht, wird von dem anderen Würfel überdeckt, wenn man hinter dem RahmenWürfel steht.
Das ist wohl ein Z-Buffer-Problem.

Ansonsten ganz schick.

:allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Das ist mir auch aufgefallen, dass die Sprites am Bildschirmrand bei Position an der Wand verschwinden.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Antworten