3D in 2D Positionierung von 3D Objekten
Übersicht

![]() |
EPSBetreff: 3D in 2D Positionierung von 3D Objekten |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hallöchen! ![]() 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 ... ![]() + Ava + |
||
antome!!! gesperrt !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
antome!!! gesperrt !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Willst du die Sprites und ein Mesh im 3D - Raum erstellen ?
Oder nur von einer Seite abbilden ? |
||
antome |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group