Hirdetés

Aktív témák

  • 3man

    csendes tag

    Ideje atlepni a 3. dimenzioba. Ehhez kell definialni egy view matrixot, ami a kamera terbeli iranyat adja meg. Ehhez jarna egy projection matrix is, ami a perspektivat adna meg, de mivel most egy sugar koveteshez {raytrace} hasonlo modon fogok szamolni, erre nem lesz szukseg.
    Egy uj utasitas lep a kepbe, a lerp(). Linear_interpolation,
    vagyis a linearis interpolacio. Ezzel a shaderek nyelvehez tartozo utasitassal ket vektor kozt egy vonalon barmelyik pontot egyszeruen megkapjuk, csak egy 0 es 1 kozti szamot kell megadni.
    A view matrix definialasahoz szukseges a szem(eyes) pozicioja, es hogy hova akarunk nezni (lookat). A float3(0,1,0) a felfele iranyt adja meg a terben.Ez termeszetesen modosithato, de mindig normalizalni kell.
    Az view x iranyat a cross segitsegevel lehet megkapni. Az eredmeny vektor iranyara a linken megtalalhato kez-szabaly ervenyes.
    Cross_product

    Az osszes tengely kiszamitasa utan vegigmegyek a kepernyo pixelein. A screen koordinatabol felveheto egy sugar(ray), aminek a metszespontjat kell megtalalni egy sikkal (plane). A sik alabbol az xz sik, de ha aktivva teszem a ket sort, akkor megadhato a sik normalja.
    A jelenlegi grafikai megjelenitok (meg) nem igy dolgoznak, a folyamat forditott. A bemeno ertek egy haromszog sarkainak 3d koordinataja, amibol egy 2d kepernyo koordinatat kell kiszamolni.

    float3 lerp(float3 par1,float3 par2,float sc)
    {
    return par1 + (par2-par1)*sc;
    }

    void draw_function()

    {
    float3 LookAt=float3(0,0,0);
    float3 Eyes=float3(350,250,130);
    float3 ViewMatrix_z=LookAt-Eyes;
    ViewMatrix_z.Normalize();
    float3 ViewMatrix_x=ViewMatrix_z.cross(float3(0,1,0));
    float3 ViewMatrix_y=ViewMatrix_x.cross(ViewMatrix_z);

    for(int y=-y_size/2;y<y_size/2;y++)
    for(int x=-x_size/2;x<x_size/2;x++)
    {
    float3 screen=float3(x,y,300);
    float3 ray=ViewMatrix_x*screen.x + ViewMatrix_y*screen.y+ ViewMatrix_z*screen.z;
    ray.Normalize();

    float3 plane_origo=float3(0,0,0);
    float dist=(plane_origo.y-Eyes.y)/ray.y;

    //float3 plane_normal=float3(10,200,120).Normalize();
    //dist=plane_normal.dot(plane_origo-Eyes)/plane_normal.dot(ray);

    float3 plane=Eyes + ray*dist;

    plane.y=0.0;
    float3 color=plane*0.002;
    if(dist<0.0) color=lerp(float3(0,1,1),float3(0,0,1),ray.y);

    pixelv(screen,color);
    }
    }

    [ Szerkesztve ]

Aktív témák