komisches koordinatensystem in Dx



  • weil wahrscheinlich davor eine translate funktion aufgerufen wurde...wie auch immer das bei directx heissen mag



  • tomf schrieb:

    weil wahrscheinlich davor eine translate funktion aufgerufen wurde...wie auch immer das bei directx heissen mag

    Translate wirkt sich aber nicht auf transformierte Vertices aus.

    Also wenn du transformierte Vertices benutzt, musst du damit leben dass (0|0) oben links ist (das ist nun mal Standar***d***) und es dir halt selber umrechnen. Im anderen Fall nimmst du einfach nicht-transformierte Vertices 😉



  • hab jetzt ein tut gefunden.
    MFG und dannke für eure hilfe



  • FrauBolaIstDumm schrieb:

    tut mir leid aber 😕 😕 😕
    MFG

    Was verstehst Du denn net?
    So wie Du das angegeben hast benutzt Du TRANSFORMIERTE Vertices, d.h. die Koordinaten werden Bildschirm-relational angegeben: 0/0 ist oben links, falls Du eine Auflösung von 1024x768 fährst ist unten rechts 1023/767.
    Wenn Du NICHT TRANSFORMIERTE (a.k.a. "normale") Vertices benutzt, werden die Koordinaten im 3D-Raum angegeben, also von einem Nullpunkt aus gesehen. Wenn Du Deine Kamera dann auf denselbigen richtest, erscheint das Dreieck in der Mitte - genau wie Du es haben willst...



  • hallo.
    ich hab ne kamera.
    standort: 0,0,-6
    blick zu: 0,0,0
    oben : 0,1,0

    und ein dreieck:
    0,1,0
    -1,0,0
    1,0,0

    vorher hatte ich das aber net so habe es jetzt geändert hab ja auch das tut gefunden.
    MFG



  • hallo.
    ich muss schon wieder stören.
    ich hab jetzt ein paar funktionen geschjrieben mit dem dan ein dreieck ausgegeben werden soll es lässt sich auch alles kompilieren und linken aber wenn ich das progg starte sehe ich kein dreieck.
    hier ist der code

    #include "grafic.h"
    #include "D3d.h"
    #include "Logbuch.h"
    #include <d3dx9.h>
    #include <d3d9.h>
    #define D3D8T_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    
    struct MyVertex{
        FLOAT x, y, z; // Position des Vertex
        DWORD color;        // Farbe des Vertex
    };
    MyVertex MyVertices[] ={
      {  0.0f,  1.0f, 1.0f, 0x000000FF }, // x, y, z, color
      {  1.0f, -1.0f, 1.0f, 0x0000FF00 },
      { -1.0f, -1.0f, 1.0f, 0x00FF0000 }
    
    /*  { -1.0f, -1.0f, 0.0f, 0xFF0000FF },
      { -1.0f,  1.0f, 0.0f, 0x0000FF00 },
      {  1.0f, -1.0f, 0.0f, 0x00FF0000 },
      {  1.0f,  1.0f, 0.0f, 0x00FFFFFF }*/
    };
    
    IDirect3DVertexBuffer9 *MyVB=NULL;
    
    void InitScene(void)
      {
    
    HRESULT hr;
      void *vb_vertices;
    
      D3DXMATRIX view_matrix;
      D3DXMATRIX matProj;
      De->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
      De->SetRenderState(D3DRS_LIGHTING, FALSE);
    
      // wie im letzen Tutorial Speichern wir die Vertices in einem VertexBuffer.
      // Bloß dieses mal benutzen wir nur einen VertexBuffer für das Dreieck und das Viereck
       hr=De->CreateVertexBuffer(3*sizeof(MyVertex), 
                                           D3DUSAGE_WRITEONLY,  
                                           D3D8T_CUSTOMVERTEX,  
                                           D3DPOOL_MANAGED,     
                                           &MyVB, NULL);
       if(FAILED(hr)){
          meinLogbuch.Error(1, "Konnte keinen vertexbuffer erstellen");
       }
       meinLogbuch.Ok(0, "VertexBuffer wurde erstellt");
    
       hr=MyVB->Lock(0,
                     0,
                     &vb_vertices,
                     0);
    
       if(FAILED(hr)){
          meinLogbuch.Error(1, "Konnte vertexbuffer nicht sperren");
       }
       meinLogbuch.Ok(0, "Vertexbuffer wurde gesperrt");
       memcpy(vb_vertices, MyVertices, sizeof(MyVertices) );
    
       MyVB->Unlock();
    
       // Hier erstellen wir unseren SichtMatrix. Denkt einfach es ist
       // eure Kamera, von der aus wir sehen. Als erstes setzen wir die Camera
       // um 8 Einheiten zurück auf der Z-Achse.
       D3DXMatrixLookAtLH(&view_matrix,&D3DXVECTOR3( 0.0f, 0.0f,-2.0f ),
                                       &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
                                       &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ));
    
       // Da sich unsere Camera nicht bewegt legen wir sie einfach fest
       De->SetTransform(D3DTS_VIEW,&view_matrix);
    
       D3DXMatrixPerspectiveFovLH(&matProj, //Resultierende Matrix
                                  D3DX_PI/4,//Radius der ansicht
                                  (800.0f / 600.0f),
                                  1.0f,     // Mindeste nähe
                                  100.0f ); // Maximal sichtbare Entfernung
    
       // Unsere Projektion wird sich niemals bewegen, also setzen wir sie fest
       De->SetTransform( D3DTS_PROJECTION, &matProj );
    	meinLogbuch.Info(0, "Scene wurde Initalisiert");
    }
    
    void KillScene(void)
      {
        if(MyVB)
          {
          MyVB->Release();
          MyVB=NULL;
          }
    
      }
    
    void RenderPolygon(void)
    {
    	//RENDERING
    /*D3DXMATRIX matWorld;
      D3DXMATRIX rot_matrix;   //Our rotation matrix
      D3DXMATRIX trans_matrix; //Our translation matrix
      static float rot_triangle_X=0; //Tracks rotation for our triangle
      static float rot_triangle_Y=0;
      static float rot_triangle_Z=0;
      static float rot_square=0;  //Tracks rotation for our square
      rot_triangle_X+=0.004f;
      rot_triangle_Y+=0.009f;
      rot_triangle_Z+=0.006f;
    
      rot_square+=0.007f;*/
    
    	  De->SetFVF(D3D8T_CUSTOMVERTEX);
    
          De->SetStreamSource(0,MyVB,sizeof(MyVertex), NULL);
    
          // Die Rotation um alle Achsen.
          //D3DXMatrixRotationYawPitchRoll(&rot_matrix,rot_triangle_X,rot_triangle_Y,rot_triangle_Z);
          // Verschiebe das Dreieck um 1.2 nach links
          //D3DXMatrixTranslation(&trans_matrix,-1.2,0.0f,0.0f);
          // Kombiniere das Teil mit der Welt
          //D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
    
          //De->SetTransform(D3DTS_WORLD,&matWorld );
    
          // Nun zeichnen wir wieder das Dreieck
          De->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    
          /*// Rotation um die Y Achse
          D3DXMatrixRotationY(&rot_matrix,rot_square);
    
          D3DXMatrixTranslation(&trans_matrix,1.2,0.0f,0.0f);
    
          D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
    
          De->SetTransform( D3DTS_WORLD, &matWorld );
    
          // Jetzt zeichnen wir das Viereck. Man beachte, das der Offset
          // nun auf 3 steht!
          De->DrawPrimitive(D3DPT_TRIANGLESTRIP,3,2);*/
    
    //RENDERING
    
    }
    

    Ich hab vieles ausgelassen.
    damit ich besser den fehler finden konnte ich hab aber leider net den fehler gefunden. 😞
    (Drehen muss sich das dreieck net ich will es aber sehen)
    VielenVielenDank
    MFG



  • Öhm, wo ist denn in deinem Renderer ein BeginnScene(), EndScene, und Present()? 😉



  • hallo. die frage habe ich mir schon gedacht 😃
    also ich hab ne loop.
    dei heist gameloop();
    und darin ist die clear-anweisung dann beginscene();
    und dann kommt meine funktion DrawPolygon();
    und dann kommt end-scene();
    und present();
    und die scene tue ich auch initalisieren also die funktion aufrufen
    MFG



  • Sollte zwar keinen Unterschied machen, aber schreib die Methoden mal in deinen Renderer rein.



  • Gern geschehen.

    Bye, TGGC (Der Held ist zurück)



  • Hallo.
    hab ich auch schon versucht aber ohne erfolg. 😞 😞 😞
    MFG



  • verbessert mich, wenn ich falsch liege, aber in dem code wird die world matrix nicht gesetzt, oder? (bzw. diese zeile ist "wegkommentiert")



  • hm...
    die welt-matrix habe ich auch schon mal drin-gelassen.
    aber ohne erfolg. 😞 😞 😞
    Danke für eure hilfe.
    MFG


Anmelden zum Antworten