Seite 3 von 4

Verfasst: 23.02.2008 16:09
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...

Verfasst: 23.02.2008 18:03
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

Verfasst: 24.02.2008 12:31
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?!

Verfasst: 24.02.2008 14:37
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.

Verfasst: 24.02.2008 17:08
von LukasBanana
Naja haupt Sache du kannst was mit meiner 3D Engine anfangen <)

Verfasst: 24.02.2008 21:18
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..

Verfasst: 26.02.2008 16:25
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:

Verfasst: 03.03.2008 19:28
von Vermilion
Das sieht aus, als wäre man besoffen, wenn man die linke Maustaste drückt =D Geiler Effekt...

Verfasst: 04.03.2008 21:31
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:

Verfasst: 04.03.2008 22:05
von Vermilion
Das ist mir auch aufgefallen, dass die Sprites am Bildschirmrand bei Position an der Wand verschwinden.