DrawLine3D ungenau und verzerrt

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Megamag

Betreff: DrawLine3D ungenau und verzerrt

BeitragDi, März 02, 2010 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Tag auch.
In meinem Projekt wollte ich ganz gerne eine Art Lebensbehälter machen. Der ist in der unteren rechten Ecke des Bildschirms und soll aufgefüllt werden können.

Hier einmal die leere Version:
user posted image

Hier ist die volle Version:
user posted image

Wie ihr euch denken könnt, möchte ich das eine über das andere ausrollen, um Sachen zu machen, die nachher in etwa so aussehen sollten:
user posted image

Da ich die Draw3D verwende, dachte ich, ich nehme den Befehl Drawline3D. Ich habe den Befehl schonmal verwendet und er hat auch gut funktioniert, aber für den Zweck ist er die Hölle. Nachdem ich also erstmal solange mit den Koordinaten rumgespielt hatte, bis das Image vom leeren Behälter richtig platziert war, wollte ich den roten Behälter mit Drawline3D drüberlegen. Aber das ging natürlich nicht so einfach, wie ich mir das dachte...

Man kann bei dem Befehl keine gesamt-Skalierung festlegen, sodass ich das Image an sich ersteinmal um die Hälfte vekleinern musste, damit es über das andere passt. Dann kam das nächste Problem. Ich wollte das ganze ja von unten nach ober ausrollen, der Drawline3D-Befehl dreht das Image um 90°, wenn ich das mache, also musste ich das Image noch einmal an sich drehen, sodass es passt.

Nun kam letztendlich das Problem, dass ich absolut keine Ahnung vom Draw3D-Koordinatensystem habe, was darin resultierte, dass ich eine viertelstunde solange Werte für x,y,x2,y2 und Dicke rumprobieren musste, bis es passte. Jetzt waren die Beiden übereinander (in Modus 0 = Strecken). Völlig glücklich stelle ich jetzt den Modus 1 (= Ausrollen) ein und was sehe ich:
Das Image ist auf einmal total verzerrt nach oben hin und zur Hälfte abgeschnitten, obwohl es mit Modus 0 noch gepasst hat. Änderungen der BIld-Skalierung haben auch nichts bewirkt. An dem Punkt habe ich einfach aufgegeben und hoffe, dass ihr mir vielleicht eine Alternative sagen könnt.

Danke für's lesen.


Nachtrag:
Ich hab' die Codes vergessen, vielleicht helfen sie ja weiter...

BlitzBasic: [AUSKLAPPEN]

;Einladen und skalieren der Images.
Global I_CanShoot1=LoadImage3D("data\gfx\CanShoot1.png",2,2,0,-10)
Global I_CanShoot2=LoadImage3D("data\gfx\CanShoot2.png",2,2,0,-11)
Global CanShoot1=GrabImage3D(I_CanShoot1,0,256,256,256,.5,.5)
Global CanShoot2=GrabImage3D(I_CanShoot2,0,256,256,256,.5,.5)

;Zeichen des leeren Containers
DrawImage3D CanShoot1,-450,-320,0,0,1,0

;Dieser Code hier passt auf den anderen Container drauf:
DrawLine3D CanShoot2,-450,-385,-450,-255,65,0,0

;Mit Modus 1 geht's nicht mehr:
DrawLine3D CanShoot2,-450,-385,-450,-255,65,1,0

mpmxyz

BeitragDi, März 02, 2010 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde den Befehl wechseln:
DrawRect3D
Damit sollte das locker gehen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Silver_Knee

BeitragDi, März 02, 2010 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
du rollst die halbtransparenz über ne halbtranzparent und wunderst dich dass die gesamttranzparenz dsich ändert.. du musst das graue von oben einrollen wenn du das rote von unten ausrollst

Megamag

BeitragDi, März 02, 2010 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht hier doch überhaupt nicht um die Transparenz?
Mir ist schon klar, dass der Rand dann grauer ist, es geht einfach darum, dass DrawLine3D eine komplett falsche Darstellung des Images macht, aber ich glaube DrawRect3D könnte funktionieren, ich muss mal ein wenig rumprobieren Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 02, 2010 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry Megamag, immer wenn du mit der Draw3D nicht weiter kommst, dann klingt das so, als wäre die Draw3D für dich ein unausweichliches Übel. Und bisher war nicht einmal die Draw3D an etwas fehlerhaft, sondern du hast einige Sachen nicht bedacht. Wie auch in diesem Fall, mekerst aber immer so, als wäre die Draw3D nur scheisse:

- Wenn du ein Bild mit W=256, H=256 grabst und es auf W*0.5, H*0.5 skallierst, hat es eine Breite/Höhe von 128, (dies gilt jedoch nicht für DrawLine3D im Mode=0 und Mode=1, da hier jeweils die Breite im Befehl selbst eingegeben wird und die Länge sich aus den beiden Koordinaten ergibt. Nur im Mode=2 [ausrichten] wird dann die skallierte Dimension zu der Länge addiert, was auch logisch ist). In so einem Fall wäre ein gestreckt gezeichnetes Bild (Mode=0) aus entsprechend mit 128 Länge einzuzeichnen. Du hast aber DrawLine3D CanShoot2,-450,-385,-450,-255,65,0,0 eingezeichnet. Und die Entfernung zwischen -385 und -255 ist 130 und nicht 128. Das ergibt 2 Pixel verzerrung innerhalb der gezeichneten Linie. Somit stimmt es nicht mehr überein.

- Um das zu umgehen, kann man auch einfach im Mode=2 (ausrichten) zeichnen. Dann übernimmt die Draw3D die vorgegebenen 128 Pixel und richtet das Bild nur noch aus. Dann ist es egal ob du 130, 128, 2 oder 5000 als Entfernung eingibst, lediglich die Richtung (nach oben) muß stimmen. Der Rest stimmt dann absolut pixelperfekt mit Mode=1 (ausrollen) überein.

- Dann wäre für mich interessant zu wissen, wie man es schnell und einfach zu programmieren sein könnte(also nicht bezogen auf mich der die Draw3D erstellt, sondern bezogen auf andere Programmierer die damit arbeiten), dass ein Bild horizontal oder vertikal ausgerollt werden soll. Je nachdem, wie man es gerade braucht? Eine Möglichkeit wäre natürlich eine Parameterübergabe zum Beispiel: 0=nach oben, 1=nach rechts, 2 nach unten und 3 nach links. Halte ich für unnötig. Oder automatisch? Und was machen dann die Leute die eine Linie in beliebigen Winkeln einzeichnen? Dann poppt immer wieder ein neuer Zeichenmodus auf? Bevor man sich hier beschwert bitte einmal überlegen, wie man es besser machen könnte. Ich bin nach wie vor für jeden Tipp dankbar. Also immer her mit den Tipps. In so einem Fall - Bilder immer in der Horizontalen lage nach rechts auslesen um auszurollen - ist eine kontrollierte Situation und kann in den meisten Fällen am besten verwendet werden. Zum Beispiel für Ladebalken.

Lösung:

Code: [AUSKLAPPEN]
   DrawLine3D CanShoot2,-450,-383,-450,-255,64,0,0
   
   DrawLine3D CanShoot2,-450,-383,-450,-255+MouseY3D,64,1,0


Und wenn man damit nicht ganz klar kommt, kann man auch einfach beide Linien mit Mode=1 zeichnen, dann sind beide Zeichenstyle identisch (ausrollend). Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Megamag

BeitragDi, März 02, 2010 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldige bitte, wenn das als "meckern" empfunden wurde. Ich wollte mit meinem Post keinesfalls sagen, dass die Draw3D "scheiße" ist, sondern einfach ausdrücken, dass ich mit DrawLine3D nicht klarkomme, bzw. dieser Befehl für mein Anliegen offenbar falsch ist, was sich bereits in der Tatsache zeigt, dass eine "Linie" gezeichnet wird, die natürlich das Bild auch entschprechend dreht, daher habe mir jetzt was mit DrawRect3D gebastelt, was für den Zweck wohl besser geeignet ist, da ich dort die Textur einfach verschieben kann. Ich hatte einfach vorher nicht genau verstanden, wie der Befehl überhaupt funktioniert und habe mich wohl deshalb etwas darüber aufgeregt, was allerdings keine Kritik an deiner Draw3D sein sollte als vielmehr an meiner eigenen Unfähigkeit. Also entschuldige bitte das Misverständnis Embarassed

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 02, 2010 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst dich nicht zu entschuldigen, da ich dir auch ein paar Tipps zur Lösung deines Problems gegeben hab. Ein Zeichen dafür, dass es mir doch hauptsächlich um eine Hilfestellung ging. Wink

Ich war wohl auch etwas überreizt. Crying or Very sad

Was ich auch hervorbringen wollte ist, dass du dir das hättest selbst lösen können, indem du beide Linien mit den selben Mode=1 (ausrollen) zeichnen sollen. Denn dann wären selbst bei einer fehlerhaften Darstellung (was sie jedoch nicht ist, habe extra mit diesem Befehl viele Programmierstunden zusammen verbracht) keine Unterschiede zwischen beiden Linien erkennbar gewesen. Nur so als Tipp. Vermeide also bei solchen Überlagerungen nach Möglichkeit generell verschiedene Zeichenarten. Macht die Sache sonst unnötig kompliziert.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Silver_Knee

BeitragMi, März 03, 2010 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinen Post bitte gekonnt ignorieren. war schwachsinn ^_^"

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group