Koordinaten-System

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

  • Hallo,
    Ich hätte mal eine Frage wegen dem Koordinatensystem von OGL.
    Da wird ja etwas anders gerechnet als in Pixeln, wie im normalen
    Grafikmodus. Beispiel :

    Code
    oGL("Origin", 0, 0, -6)


    Wie kommt denn die -6 zustande ? Auch die Kommawerte verstehe ich nicht.
    Wie muß man sich das genau vorstellen ? In der Hilfe ist das nicht so
    ersichtlich.


    Zum Problem selbst :
    Ich will drei weiße Bälle von links nach rechts rollen lassen. Es soll auch
    ziemlich realistisch aussehen.


    Code
    Proc DrawGLSceneoGL("CLear")oGL("Color", 0, 0, 0, 1)oGL("Origin", 1.5, -0.5, -7)oGL("Draw", kugel#)oGL("Show")EndProc
    Declare ende%, kugel#
    Cls 0
    oGL("Init", %HWnd, 0, 0, 0, 1)kugel# = New(oglSprite)
    With kugel#  .typ$    = "sphere"  .posx!   = -5  .posy!   = -2  .posz!   = 0  .roty!   = 0  .rotdy!  = 1  .colorr! = 1  .colorg! = 1  .colorb! = 1  .alpha!  = 1  .textur& = 0  .texturm!= 1  .dtick&  = 10  .x!      = 0.5  .a!      = 32  .b!      = 32EndWithende% = 0SetTimer 10WhileNot ende%  WaitInput  If Iskey(27)     ende% = 1  EndIf  Case %Key = 2 : ende% = 1  If kugel#.posx! < 2.0     kugel#.posx! = kugel#.posx! + 1     Sleep 300  EndIf   DrawGLScene()EndWhileKillTimer
    End





    So gefällt es mir noch nicht richtig. Die sehen auch irgendwie
    etwas unförmig aus. Oder sollte man das lieber mit einer
    Liste machen (oGL("StartList", N)) ? Das scheint ja sowas
    ähnliches zu sein, wie früher ein Makrorekorder, der alle
    Aktionen aufgezeichnet hat und den man dann beliebig
    oft abspielen lassen konnte ?


    Wie kann man das am besten lösen ?


    PS: Wie sieht es wie im obigen Code zu sehen, mit dem
    Timer aus ? Den kann ich ja sonst nicht mehr verwenden,
    da es ja in XProfan nur einen gibt. Bleibt nur noch die
    Möglichkeit einen oder mehrere Timer mit der API zu
    erstellen (so wie es in der Hilfe steht).
    Da Roland ja schon die Grundstrukturen, wie .typ$, posx!
    usw. in OGL gelegt hat, hätte er auch noch einen API-Timer
    implementieren können, den man mit z.B. .timer% in der
    Struktur einstellen kann. Wenn dieser mit einem gültigen
    Wert belegt ist, kann er ja erstellt und benutzt werden.
    Somit könnte der Anfänger mit SetTimer usw. andere Sachen
    erledigen.









  • Heinz, hier steht´s explizit, ohne Matrizenrechnung :8o::
    http://www.tomprogs.at/tutoria…ektive-und-z-buffer.xhtml


    Stelle Dir am besten einen kontinuierlichen Raum vor (sechsstellige Single-precision-Genauigkeit erlaubt das schon!). Den Maßstab deiner Darstellung mußt Du geeignet selbst wählen (Selbst in Profi-Programmen wie AutoCAD ist das schon mal ein Problem, da muß man manchmal nach "Augenmaß" konvertieren!). Wenn der Maßstab dann festliegt, kann man ohnehin noch per Modellmaßstab alles verkleinern/vergrößern. Davon unabhängig ist natürlich die Frage, wie groß das dann angepasste Modell im Bild wird: Das hängt dann davon ab, wie nahe es am Bildschirm ist, und zwar bei einem Modellmaßstab 1:1 perspektivisch nach der Daumenregel:
    Anzeigebreite ~ Modellbreite * 40cm-Auge-vom-Schirm-Entfernung dividiert durch (Negative-Entfernung-auf-der-Z-Achse + 40cm)
    Gruss


    P.S.: Näheres siehe "Strahlensatz" in der Mathematik

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

    4 Mal editiert, zuletzt von p. specht ()

  • Hallo, vergess in OGL deine Pixelgeschichte ob 2D odr 3D in Profan
    Da mußt du in Vertex rechnen usw. in der Bewegung und Collision.


    Der Aufwand lohnt sich nicht in Pofan mit den eigenen Befehlen. Es besteht da zu wenig Grundarchitektur.
    Alle Geschichten dort laufen in der aktuellen Profanversion für dich in einem zu groben Raster ab.


    Es gibt zwar in Profan kleine Demos , aber sind halt nur kurze Demos die für eine längere Geschichte nicht geeignet sind.


    Man hält sich mit Profan und OGL sehr bedeckt, das nicht ohne Grund.
    Du kannst zwar in Profan alle originalen Befehle aus der Ogl-Dll rausziehen , damit schaffst du etwas,
    aber trenn dich dann von den OGL-Befehlen die in Profan eingebaut sind


    Gruss

  • Danke für die Erläuterungen.
    Ich dachte, da ginge einiges einfacher.
    Ist wohl doch nicht so einfach, wie es
    schon OGLBasic (Startseite Profanforum)
    so verspricht. Kleine Demos ja, aber
    Spiele usw. wie dort geschrieben, ist
    wohl, selbst für mich als erfahrener XProfaner,
    etwas zu hoch gegriffen.


    Zitat

    Man hält sich mit Profan und OGL sehr bedeckt, das nicht ohne Grund.

    Jetzt verstehe ich, warum hier mit OGL nicht sehr viel los ist.

  • Ich benutze nur ein kleines verstecktes OGL-Fenster, wo ich 2D-Bilder(Sprite) drehe und die ich dann auf mein normales Profanfenster kopiere als Sprite. Dazu kann man OGL gut nutzen. Als Rotierroutine ist es wunderbar geeignet.


    Gruss

  • Da man die OGL-Funktionen mit OGL-API beliebig kombinieren kann, spielt das keine Rolle. Vor Jahren hab ich ein Spiel begonnen mit riesigem Level und bewegten 3D Figuren, alles kein Problem. Man muss nur clever entscheiden, welche Teile gezeichnet werden müssen und welche nicht...

  • Man muß nur ein wenig ausprobieren.
    Meine Rakete fliegt schon mittlerweile.
    Silvester kommt.
    Zwar noch etwas ruckelig, aber es geht.


    Code
    Proc DrawGLSceneStartoGL("CLear")oGL("Move", -3.0, 0.0, -6)oGL("Print", font&, "Space-Taste !")oGL("Color", 0, 0, 0, 0)oGL("Origin", 1.5, -0.5, -7)oGL("Draw", cyl#)oGL("Draw", spitze#)oGL("Show")EndProc
    Proc StartRaketeStruct pos = wert1!, wert2!Declare werte#[8]Dim werte#[], posfloat werte#[0], 0 = -2.0, -0.7float werte#[1], 0 = -1.0, -0.7float werte#[2], 0 = 0.0, 0.3float werte#[3], 0 = 1.0, 1.3float werte#[4], 0 = 1.6, 1.9float werte#[5], 0 = 3.0, 3.3float werte#[6], 0 = 4.0, 4.3float werte#[7], 0 = 5.0, 5.3float werte#[8], 0 = 6.0, 6.3
    WhileLoop 0, 5    cyl#.posy! = werte#[&LOOP].wert1!    spitze#.posy! = werte#[&LOOP].wert2!    DrawGLSceneStart()    Sleep 120EndWhileDispose werte#[]EndProc
    Declare ende%, cyl#, spitze#, liste&, hfont&, font&
    Cls 0AddHotkey 1000, 32, 0oGL("Init", %HWnd, 0, 0, 0, 1)cyl# = New(oglSprite)spitze# = New(oglSprite)hfont& = create("Font", "Courier New", 12, 0, 0, 0, 0)font& = oGL("OutlineFont", hfont&, 0)deleteobject hfont&
    With cyl#  .typ$    = "cylinder"  .posx!   = -3.0  .posy!   = -2  .posz!   = 0  .roty!   = 0  .rotdy!  = 0  .colorr! = 0.8  .colorg! = 0.8  .colorb! = 0.8  .alpha!  = 1  .textur& = 0  .texturm!= 1  .dtick&  = 10  .x!      = 0.08  .y!      = 0.08  .z!      = 0.3  .b!      = 32EndWithWith spitze#.typ$    = "cylinder"  .posx!   = -3.0  .posy!   = -1.7  .posz!   = 0  .roty!   = 0  .rotdy!  = 0  .colorr! = 1.0  .colorg! = 0  .colorb! = 0  .alpha!  = 1  .textur& = 0  .texturm!= 1  .dtick&  = 10  .x!      = 0.15  .y!      = 0.02  .z!      = 0.2  .b!      = 32EndWith
    ende% = 0SetTimer 10DrawGLSceneStart()
    'oGL("DrawList", liste&)WhileNot ende%  WaitInput  If Iskey(27)     ende% = 1  EndIf  Case %Key = 2 : ende% = 1  If MenuItem(1000)     'Messagebox("Taste", "Info", 0)     StartRakete()  EndIfEndWhileKillTimer
    End



    Nur die Schrift bekomme ich nicht hin, bzw. kleiner.
    Die sollte rechts neben der Rakete stehen, aber in
    einem kleinen Font, daß der Text noch ins Fenster
    paßt.

  • Silvester 2015 kommt bestimmt :-D Warum heißen die eigentlich Silvester-Raketen, wenn sie erst am Neujahrsstag zum Einsatz kommen?

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse