Konsole im DirectX Programm



  • Hi!

    Ich möchte in einem DirectX 3D programm (dx 9) eine Konsole realisieren.
    Gedacht ist es so das bei Tastendurck "^" das Bild abgegraut wird. (ob es im Hintergrund weiterläuft oder nicht ist erstmal nicht so wichtig)
    Dann möchte ich mit DX font dort Text darstellen. Ich habe jetzt nur 3 Fragen zu einem Ansatz:

    1. Wie kann ich bestehenden Text des Interfaces (www.youtube.com/watch?v=sUIkMuBg4x8) zwingen hinter so einem leicht transparent grauen Layer zu liegen?

    2. Wie könnte man das Zeilensystem realisieren? So dass geschriebene Zeilen von oben nach unten Nachrücken und dann am bildrand verschwinden. Gibt es dort vlt schon Gute ansätze?

    und 3. eigentlich eine allgemeine Frage:
    Wenn ich DirectX font in der Schriftgröße nicht ausreichend groß mache. z.B. Größe 12 oder 14 dann ist es abhängig davon wo die rect. position ist. Z.B. wird der Text mit Positionshöhe 50 gut dargestellt und mit 51 fehlt ein Stück. (immer vertikal 1-2 pixel weggeschnitten) worran liegt das? Create sieht bei mir so aus:

    D3DXCreateFont(	m_d3ddev, 18, 0, 600, 0, FALSE, 
    					DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
    					ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
    					TEXT("Arial"), &m_font );
    

    Gruß, Chris



  • cl90 schrieb:

    1. Wie kann ich bestehenden Text des Interfaces (www.youtube.com/watch?v=sUIkMuBg4x8) zwingen hinter so einem leicht transparent grauen Layer zu liegen?

    Indem du einen leicht transparenten, grauen Layer über das Interface renderst!?

    cl90 schrieb:

    2. Wie könnte man das Zeilensystem realisieren? So dass geschriebene Zeilen von oben nach unten Nachrücken und dann am bildrand verschwinden. Gibt es dort vlt schon Gute ansätze?

    Wo genau liegt das Problem!? Du wirst eben irgendeinen Buffer brauchen, der den Text der Konsole enthält...std::vector dürfte bekannt sein!?



  • Warum so unfreundlich? Dann antworte lieber gar nicht.

    Die frage war ja auch nicht was, sondern wie.



  • Ich sehe das weniger als Unfreundlich. Er hat dir ja gesagt wie.

    Render dein Spiel und das UI, render ein transparentes graues Quadrat drüber.

    Den Inhalt deines Konsolen Fensters speicherst du als std::string in std::vector.

    Zum Rendern nimmste die die Breite und die Höhe deines Ausgabefensters und rechnest dir aus wieviele Zeilen in die Höhe reingehen, wenn du Monospaced Schriftarten wie Courier verwendest kannst du auch ausrechnen wieviele Zeichen in die Breite pro Zeile reingehen. Dann fängste beim letzten string an und arbeitest dich solange zum 1. vor bis deine Zeilen ausgeschöpft sind oder die Strings alle sind. Je hübscher du es haben willst umso aufwendiger wird es natürlich. Halbe Zeilen zu rendenr oder nicht Monospaced Schriftarten zu verwenden erhöht natürlich den Aufwand den du hast um die Schrift passend zu rendern.

    Zu deinem 3. Problem kann ich nicht viel sagen. Such dir am besten ein Programm das Schriftarten auf Texturen Rendern kann und dir passende Texturkoordinaten gibt. Das geht schnell und du musst nurnoch die Textur laden und deine Rechtecke mit passenden Koordinaten versehen.



  • Xebov schrieb:

    Such dir am besten ein Programm das Schriftarten auf Texturen Rendern kann und dir passende Texturkoordinaten gibt

    BMFont
    http://www.angelcode.com/products/bmfont/



  • Wenn du eine möglichst effiziente Lösung suchst: Ich würde die Konsole wohl als Ringbuffer implementieren. Das is sehr kompakt und kommt ohne ständige Heapallokationen aus. Auch die Anzahl der maximal sichtbaren Buchstaben lässt sich wohl nach oben abgrenzen (insbesondere wenn du eine Monospace Font verwendest), sodass für die Glyphen ein VertexBuffer fixer Größe verwendet werden kann, der nicht unbedingt in jedem Frame neu befüllt werden muss...



  • Danke für die hilfe, das hat mir einige gute Denkanstöße gegeben 🙂

    Ich hab mir etwas hübsches für den Text überlegt, das klappt auch alles sehr gut.

    für den Grauen Hintergrund habe ich ein rechteck direkt vor die Kammeraposition gelegt und eine transparente Textur drauf gelegt...
    Macht man das so? Also z.b. in Spielen.. das Menü oder das GUI, wird das einfach im 3D raum vor die Kamera gesetzt? Klingt irgendwie so improvisiert...



  • Warum in 3D, du kannst das Quad doch einfach im Clipspace platzieren und fertig!?



  • ok.. das hört sich nach der Lösung an die ich mir am sinnvollsten vorgestellt, aber nicht gefunden habe.
    Wie genau mach ich das? also code.



  • Gegenfrage: Welcher Teil genau ist dir unklar?



  • Wie ich ein 3D objekt im Raum plaziere und darstelle ist mir klar.
    Aber wie zeichne ich ein Img oder ein 3D Objekt wie ein Rechteck mit Textur DIREKT auf die Schnittebene.
    gibts da einen DrawToClippingPlane Befehl oder sowas?



  • Fangen wir mal da an: Wie genau funktioniert denn das mit dem "platzieren im 3D Raum"? 😉



  • mit Matrizen Position/Rotation vorgeben, dann mit SetTransform diesen Ort/Ausrichtung setzen und das Zeichnen beginnen...

    m_d3ddev->SetTransform(D3DTS_WORLD, &((m_matSelectSize * matViewRot2 * matViewRot1) * matPos));
    	for(i = 0; i < m_mesh[0].numMaterials; i++)
    	{
    		m_d3ddev->SetMaterial(&m_mesh[0].meshMaterials[i]);
    		m_mesh[0].mesh->DrawSubset(i);
    	}
    

    lass mich raten...

    m_d3ddev->SetClipPlane
    

    Setzt den Zeichenbereich direkt zur Schnittebene?



  • Richtig

    Und was genau tun diese Matritzen jeweils?

    SetClipPlane tut was völlig anderes.



  • m_matSelectSize = größe des Auswahlvierecks
    matViewRot2 = zweite Rotationsachse des Betrachters
    matViewRot1 = erste Rotationsachse des Betrachters
    matPos = Position des Auswahlvierecks.

    Was letztendlich passiert ist das an der Position eines Ausgewählten Objektes ein Auswahlviereck entsteht das immer Parallel zur Clipplane steht.
    edit: sprich Translation und Rotation



  • Ich meinte was anderes: Wie genau kommen denn deine 3D Punkte auf 2D Pixelkoordinaten? Welche Rolle spielen World, View und Projection Matrix, also was genau tut die Transformationspipeline, was kommt hinten raus?



  • Das kann ich dir nicht wirklich beantworten...
    Ich weiß wie die Helligkeit, sprich Farbe der einzelnen Ebenen Zustande kommt,
    aber wie die Objekte ausgelesen werden, wie entschieden wird welche Faces gar nicht gezeichnet werden müssen, oder was überhaupt genau in der Pipeline passiert weiß ich nicht.



  • Darum geht's auch nicht. Beantworte einfach mal dir selbst und uns hier die Frage, was genau eigentlich World, View und Projection Matrix tun.



  • Die Viewmatrix beinhaltet einmal Position der Kamera, wo die Kamera hinzeigt und welche wo "oben" ist.

    Die Projektionsmatrix erstellt so wie ich das deute, den Sichtkegel.
    Ich gebe an die Größe des Screens (größe der Clipingebene, also das 2D feld das auf meinen Bildschirm geworfen wird), das field of view in rad, sowie den Sichtbereich mit min und max.
    Aus diesen beiden Matrizen kann man sehr gut den Sichtkegel bauen. Ich weiß wo er anfängt, wo er hinzeigt, wie sich die Sichtbereiche in Rad ausbreiten, etc...
    wie auf diesem bild gut sichtbar:
    http://directx9kick.uw.hu/files/01fig02.gif

    und die Weltmatrix müsste dann ja jetzt auch vom kartesischem Nullpunkt das darzustellende Objekt beschreiben. Wie ist es gedreht, wohin wird es verschoben etc.

    Seh ich das richtig das ich jetzt meine Projektionsmatrix/Viewmatrix vor dem ausgeben der ebene, direkt zu 0/0/0 schieben soll und dann die Ebene ohne Weltmatrix (oder Einheitsmatrix) ausgeben soll?



  • Ok, dir fehlt es offenbar an den mathematischen Grundlagen. Ich würde dir sehr empfehlen, dich damit zu beschäftigen.

    Aber gut, dann hier einfach der Trick: Du setzt World, View und Projection auf Identity, dann gehen deine Vertices direkt in den Clipspace. Der Punkt (-1, 1, 0) mapped dann auf die linke obere und (1, -1, 0) auf die rechte untere Ecke des Viewport auf der Near Plane. D.h. (-1, 1, 0), ( 1, 1, 0), ( 1,-1, 0), (-1,-1, 0) sind dann die Koordinaten der Eckpunkte eines bildfüllenden Vierecks auf der Near Plane im Uhrzeigersinn beginnend mit links oben...


Anmelden zum Antworten