draw3d - bild skalieren / auflösung,seitenverhältnisse

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

judos

Betreff: draw3d - bild skalieren / auflösung,seitenverhältnisse

BeitragSo, Okt 03, 2010 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Ich bin gerade dabei die draw3D2 Lib zu verwenden um Bilder schneller als mit loadimage,scale,drawimage zu laden,skalieren und zu zeichnen. Ich bin allerdings noch nicht geläufig mit dem Koordinaten System und den Befehlen der draw3d2.

Hier mein Problem: Ich habe ein Bild (Auflösung 1181x1800) das auf einen Teil des Bildschirms gezeichnet werden soll (Grösse 640x720). Dabei skaliere ich es mit einem Faktor damit es in dieser Fläche Platz hat.
Das Bild wird jetzt allerdings nahezu quadratisch dargestellt. (also ziemlich verzerrt)

Die Auflösung meines Fensters ist 1280x800 und ich setze Origin3d auf 1280,800.

Der Skalierungsfaktor für das Bild wird wie folgt berechnet:
BlitzBasic: [AUSKLAPPEN]
;Skaliert ein Bild damit es in ein Bereich passt
;unter beibehalten des Seitenverhältnisses
Function ResizeImageMax#(iw,ih,maxwidth,maxheight)
Local f1#,f2#
f1#=Float(maxwidth)/iw
f2#=Float(maxheight)/ih
If f2#<f1# Then f1#=f2#
Return f1#
End Function


Um das Bild zu zeichnen verwende ich dann:
BlitzBasic: [AUSKLAPPEN]
DrawImage3D image1,-320,+40,0,0,image1f#

image1f# ist der Faktor der mithilfe der Funktion oben berechnet wurde.

Wie kann ich jetzt machen, dass das Bild unter beibehalt des Seitenverhältnisses richtig in die obere linke Hälfte des Bildschirms eingezeichnet wird?

Da ich ja nur ein Faktor berechne und diesen dann bei DrawImage3D verwende (ändert dann x&y) nehme ich an es hat mit der Auflösung zu tun, dass das Bild verzerrt ist.

Vielen Dank für die Hilfe!
mfg judos
  • Zuletzt bearbeitet von judos am So, Okt 03, 2010 22:00, insgesamt einmal bearbeitet

ToeB

BeitragSo, Okt 03, 2010 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig verstanden habe, musst du die Neue Bild größe nehmen (Also alte bildgröße * Scalierungsfaktor) und die dann bei dem Malen des bildes eimntragen, etwa so :
Code: [AUSKLAPPEN]
DrawImage3D Image, -(GWidth/2-NewSize). GHeight/2-NewSize, 0, 0, Scale


Btw. : Bilder sollten nur mit gleicher Kanten größe geladen werden, die dazu noch einer größe von 2^X, also 16*16, 32*32, 128*128 usw.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

judos

BeitragSo, Okt 03, 2010 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Position ist nach bereits ok. Das Bild wird genau dort gezeichnet wo ich es will.

Leider liegen mir Fotos vor, die nur äusserst selten quadratisch sind. Gibt es trotzdem eine Möglichkeit die Bilder in originalem Seitenverhälntniss zu zeichnen?

mfg judos

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Re: draw3d2 - bild skalieren / auflösung,seitenverhältnisse

BeitragSo, Okt 03, 2010 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
judos hat Folgendes geschrieben:
...Ich habe ein Bild (Auflösung 1181x1800)...


Das ist erst einmal schon eine problematische Auflösung, da empfohlen wird Texturen mit einer zweier Potenz Kantenlänge zu erstellen. Andere werden in der Standardversion der Draw3D2 auch nicht mehr geladen, um größtmögliche Kompatibilität zu gewährleisten. Nimm das Bild und speichere es auf einer 1024x1024 Texturauflösung.

Gegrabte Bilder lassen sich nachträglich in X und Y getrennt voneinander skalieren. Wichtig ist nur, den ursprünglichen Formfaktor wieder herzustellen: XScale#=1.0, YScale#=1800.0/1181.0

Wenn man davon ausgeht, das eine gewöhnliche Bildschirmauflösung immer breiter als hoch ist, und man möchte das Bild links und rechts am Bildschirmrand anstoßen, kann man folgende Berechnung hinzu anwenden: +(X/Y)Scale auf beide Achsen, =Bildschirmbreite/Bildbreite. Wobei Bildschirmbreite die Draw3D2-Einheitenbreite die auf Graphics3D oder Origin3D angewendet wurde. Dann ließe sich das Bild durch Neupositionierung der Y-Achse hoch und runter scrollen.

Alle Angaben sind ''on the fly''

Edit2: Nun steht Edit1: unten ausgeführt...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
  • Zuletzt bearbeitet von hectic am So, Okt 03, 2010 21:56, insgesamt 2-mal bearbeitet
 

judos

BeitragSo, Okt 03, 2010 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt, es liegen mir Fotos vor, die nicht in quadratischer Auflösung vorhanden sind. Das Laden und das Zeichnen geht aber soweit.
Es wäre für mich nur viel umständlicher wenn ich das Bild zuerst noch quadratisch machen müsste und dann würde ich einfach wieder LoadImage,Scaleimage,DrawImage vom normalen bb verwenden.

Zitat:
Gegrabte Bilder lassen sich nachträglich in X und Y getrennt voneinander skalieren. Wichtig ist nur, den ursprünglichen Formfaktor wieder herzustellen: XScale#=1.0, YScale#=1800.0/1181.0


Wie kriege ich den das hin? Das Handle das mir LoadImage3d zurückliefert ist ja eine bank oder?

mfg judos


/edit: Ah gefunden: GradImage3D ist wohl die Lösung dazu. Mal versuchen...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 03, 2010 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, ich hatte zu spät gemerkt, dass es sich um Fotos handelt. Dazu hab ich folgendes geschrieben:

Edit1: ok, es geht um Fotos...

Beachte, das heute nur noch wenige Grafikkarten nicht quadratische Texturen laden können. Bzw. es beim laden schon umskalieren.

Empfehlung: Lass erst einmal Origin3D aus dem Spiel.

Prüfe ob das zu ladende Bild im Seitenverhältnis höher ober breiter als der Bildschirm ist, und speichere die Info ab, bzw. arbeite mit einer If-Abfrage mit anschließender Else-Bearbeitung.

Wenn das zu ladende Bild im Formfaktor höher als der Bildschirm ist, wird Y als Referenz genommen. Ansonsten X... Die allgemeine X/Y-Skalierung hängt dann von der tatsächlichen Y-Auflösung des Bildes zu der Bildschirmauflösung Y ab. Skale ist dann einfach =BildschirmY/BildY ansonsten =BildschirmX/BildX wenn das Bild breiter als der Bidlschirm im Formfaktor sein sollte.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

judos

BeitragSo, Okt 03, 2010 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem.

Meine Grafikkarte kriegt es anscheinend hin und damit kann ich leben, da das Programm nur für mich ist, bzw privaten Gebrauch. Smile

Wichtig: Ich habe gerade gemerkt, dass ich mit der Draw3D.V.3.2 vom15.04.2008 arbeite.
Mit der neuen Draw3D2 geht das Laden der Bilder bereits nicht mehr. Also bleibe ich mal dabei.

Ok Origin3D habe ich mal auskommentiert.

Also wenn ich die Ursprüngliche Grösse die Soll Grösse und den Faktor dazwischen habe, wie muss ich jetzt mit GrabImage3d vorgehen, damit das Bild dann richtig dargestellt wird?
z.B:
Ursprünglich: 1181 x 1800
Faktor berechnet: 0.4
Soll Grösse: 472 x 720 (passt gerade noch in den Bereich)
Bildschirmauflösung: 1280 x 800

mfg judos

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 03, 2010 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If Float(472)/Float(720)>Float(1181)/Float(1800) Then
   ;Y als Referenz
Else
   ;X als Referenz
End If


Sicherheitsabfrage der Draw3D2 ist bei Zeile 2290. Auskommentieren...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

judos

BeitragMo, Okt 04, 2010 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs hingekriegt. Und zwar wie folgt:

BlitzBasic: [AUSKLAPPEN]
Graphics3D 1280,800,16,2
...
Include "Include\Draw3D2.bb" ;RuntimeError auskommentiert damit das Laden gelingt
DrawInit3D(Camera)
Origin3D 1280,800
...
image1=LoadImage3D(bilder$(index),1,1,0)
i1w=GetImageSize(bilder$(index),0)
i1h=GetImageSize(bilder$(index),1)
image1=GrabImage3D(image1,0,0,i1w,i1h,1,1)

image1f#=ResizeImageMax#(i1w,i1h,640,720)
image1w=image1f#*i1w
image1h=image1f#*i1h
...
DrawImage3D2 image1,-320,40,image1w,image1h
...
Function DrawImage3D2(image,x,y,w,h)
Local w2=w/2
Local h2=h/2
DrawQuad3D image,x-w2,y+h2,x+w2,y+h2,x+w2,y-h2,x-w2,y-h2,0,0
End Function


Ich dachte irgendwie GrabImage3D brauche ich jetzt nicht mehr wenn ich DrawQuad3D verwende. Aber wenn ich den Befehl GrabImage3D dort rausnehme, dann wird nur noch ein kleiner Teil (Auschnitt oben links des Bild) in den Bildschirm mit der richtigen Grösse eingezeichnet.

Auf jeden Fall funktioniert es jetzt so wie ich es wollte Very Happy
Vielen Dank für die Hilfe.

mfg judos

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group