3D in 2D Positionierung von 3D Objekten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

EPS

Betreff: 3D in 2D Positionierung von 3D Objekten

BeitragDi, Jan 24, 2006 9:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen. Ich hab mal wieder ne kleine Frage. Zunächst wieder die kleine Vorgeschichte.

Um vernünftig 2D in 3D, und somit Effekte wie Alpha etc., nutzen zu können, habe ich ein paar Funktionen zusammengesucht. Hier mal die 3 wichtigsten:

Code: [AUSKLAPPEN]
Function SpriteGraphics(width, height, depth, display)
;======================================
; create virtual 2D Screen
;======================================
   Graphics3D width,height,depth,display

   Local aspect#, scale#, cam, light

   cam = CreateCamera()
   CameraRange cam, .1, 1000
   CameraClsMode cam, 0, 1

   SpriteControl = CreatePivot()

   light = CreateLight()

   aspect = Float(height) / width
   PositionEntity SpriteControl, -1, aspect, 1
   scale = 2.0 / width

   ScaleEntity SpriteControl, scale, -scale, -scale
End Function



Function SpriteDraw(image, x, y, frame=0)
;======================================
; draw sprite
;======================================
   Local brush = GetEntityBrush(image)
   Local tex = GetBrushTexture(brush)
   
   EntityTexture image, tex, frame

   PositionEntity image, x-.5, y-.5, 0
End Function



Function SpriteLoad(file$, alpha#=1, mode=2)
;======================================
; load sprite
;======================================
   Local tempmesh = CreateMesh()
   Local tempsurface = CreateSurface(tempmesh)

   AddVertex tempsurface,-1,1,0 ,0,0 : AddVertex tempsurface,1,1,0 , 1,0
   AddVertex tempsurface,-1,-1,0 ,0,1 : AddVertex tempsurface,1,-1,0 , 1,1
   AddTriangle tempsurface,0,1,3
   AddTriangle tempsurface,0,3,2
   
   Local temptexture = LoadTexture(file$,mode)
   Local size = TextureWidth(temptexture)
   EntityTexture tempmesh, temptexture
   EntityFX tempmesh,1
   EntityParent tempmesh, SpriteControl
   ScaleEntity tempmesh, size/2, size/2,1
   EntityAlpha tempmesh, alpha
   
   SpriteHandle(tempmesh,-1,-1)

   Return tempmesh
End Function


Ein Beispielcode hierfür wäre z.B:

Code: [AUSKLAPPEN]
SpriteGraphics 800,600,32,2

Global Cam
Global SpriteControl

Global sprite1 = SpriteLoad("circle.png",1,3): EntityOrder sprite1,0: SpriteDraw(sprite1,400,300)

usw....



...so, das Darstellen von 2D Grafiken in 3D klappt somit ganz prima. Meine Frage ist jetzt wie ich ein 3D Modell noch in diese Szene bekomme, genauer gesagt wohin ich es positionieren und wie ich es skalieren muß damit ich es sehe.

Beispiel: Ich lade mit Hilfe der Funktionen ein 64x64 Pixel großes Bild und möchte ausserdem noch ein 3D Modell abbilden welches ebenfalls mit 64 Pixeln Höhe dargestellt wird.

Also 2 Fragen insgesamt:

1. Wohin muß das 3D Modell (eine Umrechnungsmethode auf X,Y des Screens wäre klasse)
2. Wie skaliere ich ein 3D Modell auf ein Pixelgenaues Maß, Höhe oder Breite, die jeweils andere Seite kann ich dann denke ich selbst berechnen.

Ich wäre sehr dankbar für etwas Hilfe oder einen Denkanstoss, ich hab schon alles mögliche versucht, bekomme es aber einfach nicht hin.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.
 

Ava

Gast

BeitragDi, Jan 24, 2006 9:59
Antworten mit Zitat
Hallöchen! Smile

Ich würde ja meinen, dass es mit den Modellen von der Positionierung und Skalierung her genauso funktioniert, wie mit den Sprites ... ?! - das ist jetz hoffentlich nicht völlig abwegig ... Very Happy

+ Ava +
 

antome

!!! gesperrt !!!

BeitragDi, Jan 24, 2006 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir so spontan dazu einfällt:

Zu Frage 1:
Müsstest du wohl für jedes Mesh extra berechnen, da ja ein geladenes
Mesh intern schon öfter mal nicht genau auf 0,0,0 sitzt.
Aber mit FitMesh könnest du das evtl. hinbekommen.

Zu Frage 2:

Mit MeshHeight die Höhe berechnen und dann entsprechend skalieren
oder FitMesh nehmen.
antome

EPS

BeitragDi, Jan 24, 2006 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Da magst du recht haben, nur wird bei den Sprites die Skalierung von der Größe der Textur abhängig gemacht (wenn ich den Code richtig verstehe, er ist ja nicht von mir) und ich möchte es aber bei den 3D Modellen genau anders herum haben, ich möchte das 3D Modell an eine gewünschte Größe anpassen wobei ich es aber gerne an eine X,Y Position setzen würde.

Sowas wie 2 Funktionen bräuchte ich also, einmal SetModelTo(x,y) und SkaleModelTo(Height,Width)

Hätte ich den "SpriteCode" selbst gemacht wäre das sicher alles kein Thema, nur hab ich mit 3D noch nicht lange zu tun und bin schon froh das ich mit den Routinen da oben klar komme Wink .
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.
 

antome

!!! gesperrt !!!

BeitragDi, Jan 24, 2006 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Willst du die Sprites und ein Mesh im 3D - Raum erstellen ?
Oder nur von einer Seite abbilden ?
antome

stfighter01

BeitragDi, Jan 24, 2006 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
mir dünkt du hast den code noch nicht zur gänze verstanden.

ausserdem sieht der code auch fehlerhaft aus.
das spritecontrol sollte ein child von der kamera sein.

da die spriteposition und die camerapostion zudem mit floats dargestellt wird, hast du dann das problem das die bilder beim bewegen zu "zittern" beginnen.

am besten wäre eine eigene spritekamera an die du dein spritecontrol bindest u. die weit weg vom eigentlichen geschehen positioniert ist.

dann musst du beim rendern 1mal die hauptkamera aktivieren, u. anschliessend die spritekamera um die sprites darüberzurendern.

(edit)
achso, du willst 3D objekte im hud darstellen.
dazu schaltest du den cameraprojmode der spritekamera auf 2
dann hast du keine seltsame verzerrungen durch die nahen distanzen.
die umrechnung der postionen erfolgt dann propotional den bildschirmkoordiaten.
(/edit)

mfg stfighter
Denken hilft!
  • Zuletzt bearbeitet von stfighter01 am Di, Jan 24, 2006 11:02, insgesamt einmal bearbeitet
 

Dreamora

BeitragDi, Jan 24, 2006 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code scheint nicht vollständig ... sehe zumindest nicht wo der Projektionsmodus geändert würde, was zwingend notwendig ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

EPS

BeitragDi, Jan 24, 2006 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
hui...da rasseln ja die Antworten...

[edit]stimmt, da hatte ich wohl ein Stück Code vergessen. Dieses hier:

Code: [AUSKLAPPEN]
Function SpriteHandle(image,handle_x,handle_y)
;===================================
; set sprite handle to left, top corner
;===================================
   Local surf = GetSurface(image,1)
   VertexCoords surf,0, VertexX(surf,0)-handle_x, VertexY(surf,0)+handle_y, VertexZ(surf,0)
   VertexCoords surf,1, VertexX(surf,1)-handle_x, VertexY(surf,1)+handle_y, VertexZ(surf,1)
   VertexCoords surf,2, VertexX(surf,2)-handle_x, VertexY(surf,2)+handle_y, VertexZ(surf,2)
   VertexCoords surf,3, VertexX(surf,3)-handle_x, VertexY(surf,3)+handle_y, VertexZ(surf,3)
End Function

[/edit]

also:

@antome...das ich das für jedes 3D Objekt extra machen müsste ist mir klar, das sollte auch kein Problem sein.

@stfighter01...richtig, den Code hab ich nicht verstanden und da liegt ja auch der Hase im Pfeffer. Hab mit 3D halt noch nicht so lange zu tun.

Das mit dem CameraProjectMode werd ich mal probieren und auch an den sonstigen Tipps werd ich mich mal probieren. Wenn ich es nicht hinbekomme meld ich mich nochmal, aber das sind schonmal einige Denkanstösse - DANKE
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group