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'

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.

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