Spezifikation von 16bit-Graustufen-TIFFs?



  • Hi(gh)!

    Da es bei meinem anderen Projekt, yip, im Moment nicht weitergeht: mein sauerländischer Schmuseluchs 😉 und ich haben vor, aus großformatigen Höhenkarten diverser Planeten und Monde, die als 16bit-Graustufen-TIFFs vorliegen, mesh2-Objekte für POV-Ray zu erzeugen. Dazu müssten wir die numerischen Grauwerte irgendwie aus den TIFFs auslesen können... gibt es irgendwo im Netz eine vollständige und aktuelle Spezifikation des TIFF-Formats - wenn ja, wo?

    Bis bald im Khyberspace!

    Yadgar



  • Bist du echt so faul? Wenn du "tiff specification" bei google eintippst, kriegst es gleich. Wenn du auf Wikipedia schaust, kriegst es auch gleich.
    Und warum suchst du die Spezifikation, und nicht eine fertige Bibliothek? Da würde man sicherlich eine ganze Weile brauchen, das zu implementieren.



  • @mechanics
    Na gut, dann die Bibliothek! Ich habe leider die Erfahrung gemacht, dass Google nicht mein Freund ist, sondern mir viel zu oft den Bildschirm nur mit nutzlosem Linkmüll vollknattert...

    ...oder besser, vergessen wir das alles wieder! Mit yip habe ich schon genug Stress um die Ohren... zwar habe ich langfristig auch vor, aus den ganzen tollen PDS-Höhenkarten von den NASA-Servern Planeten und Monde für mein virtuelles Sonnensystem zu bauen - aber heute Abend ist einfach überall der Wurm drin, führen die Download-Links nur zu kaputten 404er-Seiten... außer Freeciv zocken und dabei die Fleet Foxes hören geht im Moment nicht viel!



  • @yadgar sagte in Spezifikation von 16bit-Graustufen-TIFFs?:

    Na gut, dann die Bibliothek! Ich habe leider die Erfahrung gemacht, dass Google nicht mein Freund ist, sondern mir viel zu oft den Bildschirm nur mit nutzlosem Linkmüll vollknattert...

    Ich weiß nicht, wie man von "TIFF Bibliothek" auf andere Stichwörter für Google als tiff+bibliothek oder tiff+library kommen kann ...



  • @swordfish

    Ich hatte den Fehler gemacht, statt während des Wartens auf eine Lösung für mein aktuelles yip-Problem mich einfach nur mit Daddeln abzulenken, gleichzeitig auch noch ein neues Projekt starten zu wollen - und das war dann (mal wieder!) zu viel für meine Nerven...



  • @yadgar sagte in Spezifikation von 16bit-Graustufen-TIFFs?:

    während des Wartens auf eine Lösung für mein aktuelles yip-Problem

    Ja, die Lösungtm kommt sicher wenn man nur lange genug darauf wartet.



  • @swordfish sagte in Spezifikation von 16bit-Graustufen-TIFFs?:

    Ja, die Lösungtm kommt sicher wenn man nur lange genug darauf wartet.

    Wenn ich selbst nicht mehr weiter weiß, muss ich andere Leute fragen - und im Internet kann es halt dauern, bis die antworten... das meinte ich mit "Warten"!



  • Mir war schon klar, was Du mit "warten" gemeint hast.



  • Benutz doch bitte erstmal das hier statt alles selbst machen zu wollen und zu scheitern: http://www.povray.org/documentation/view/3.7.1/279/



  • @tggc sagte in Spezifikation von 16bit-Graustufen-TIFFs?:

    Benutz doch bitte erstmal das hier statt alles selbst machen zu wollen und zu scheitern: http://www.povray.org/documentation/view/3.7.1/279/

    Oh, ein POVer hier an Bord! Sympathisch...

    Nein, natürlich weiß ich, was ein Heightfield ist und wie es aufgebaut ist - mir geht es hier aber um sphärische Objekte (Planeten, Monde, Asteroiden), nicht um "flache" Geländereliefs!

    So etwas habe ich durchaus auch schon selbst programmiert, allerdings mit rot/grün-kodierten 24bit-TGAs als Quelle:

    #declare sc=1; // 1 POV unit = 13347 kilometres
    #declare test=0; // Test flag, triggers dummy textures
    #declare pw=5; // minimum pixel size for small moons and asteroids to be rendered as meshes
    #declare rs=1; // radiosity flag, 0 = radiosity off
    
    global_settings
    {
      max_trace_level 5
      #if (rs)
        radiosity
        {
          brightness 3.75
          always_sample off
          error_bound 1.2
          count 100
        }
        ambient_light 0
      #end
      assumed_gamma 1.5
    }
    
    #declare bodies = array [82][12]
    {
    [...]
      {   227939100,       3396.2,   3396.2,  3376.2,   25.19,     1.85,    0.093315,    286.537,    49.562,   0.00589,   52.8865, 317.68143 }   //   5 - Mars
      {        9377.2,       13.4,     11.2,     9.2,    0,        1.093,   0.0151,       -1,        -1,      -1,         -1,       -1       }   //   6 - Phobos (Mars I)
    [...]
    }
    
    #declare Pos_Mars    = bodies[5][0]*<sin(radians(214)), 0, cos(radians(214))>;
    #declare Pos_Phobos  = Pos_Mars + bodies[6][0]*<sin(radians(78.1)), 0, cos(radians(78.1))>;
    
    #if (vlength(camPos-Pos_Phobos)/sc < bodies[6][1]*2*(image_width/(pw*2))/tan(radians(camAng/2))/sc) // if Phobos is larger than 5 pixels across
      #include "phobos_mesh.inc"
      #declare PhobosRelief =
      pigment
      {
        image_map { tga "solarsys/phobos_topo.tga" }
      }
    
      object
      {
        phobos_mesh
        texture
        {
          pigment
          { 
            image_map
            {
              jpeg "solarsys/phobos_cyl_cor_control.jpg" 
              map_type 1
            }
            rotate <0, 180, 0>
          }
          finish { F_Standard_Planetary_Surface }
        }
        scale 1/sc
        // rotate y*180
        translate Pos_Phobos/sc 
      } 
    #else
      sphere // Phobos
      {
        0, 1
        texture
        {
          pigment
          { 
            image_map
            {
              jpeg "solarsys/phobos_cyl_cor_control.jpg" 
              map_type 1
            }
            rotate <0, 180, 0>
          }
          finish { F_Standard_Planetary_Surface }
        }
        scale <bodies[6][1], bodies[6][2], bodies[6][3]>/sc
        translate Pos_Phobos/sc
             
      } 
    #end
    

    Erzeugt wurde das mesh2 für Phobos mit diesem POV-Ray-Skript:

    #include "povsolar_scale.inc"
    #include "functions.inc"
    
    #declare xx=800;
    #declare yy=400;
    #declare minrad=8.1;
    #declare maxrad=14;
    
    
    #declare PhobosRelief =
    pigment
    {
      image_map { tga "solarsys/phobos_topo.tga" }
    }
    
    #declare vertices=2+xx*(yy-2);
    
    #fopen phobos_mesh_inc "phobos_mesh.inc" write
    #write (phobos_mesh_inc, 
            "#declare phobos_mesh =\n
            mesh2\n
            {\n
              vertex_vectors\n
              {\n",
                vertices,"\n",
                <0, -8.434537, 0>," // south pole \n") // number of vertices: 2+b*(a-2) [2+xx*(yy-2)]
    #declare a=1;
    #while (a<yy-1)
      #declare b=0;
      #declare rdcum = 0;
      #while (b<xx)
        #declare redval=eval_pigment(PhobosRelief, <(0.5+b)*(1/xx), (0.5+a)*(1/yy), 0>).red * (maxrad-minrad);
        #declare greenval=eval_pigment(PhobosRelief, <(0.5+b)*(1/xx), (0.5+a)*(1/yy), 0>).green * ((maxrad-minrad)/255);
        #declare rd=minrad+redval+greenval;
        #if (a=1 | a=yy-2)
          #declare rdcum=rdcum+rd;
        #end
        #write (phobos_mesh_inc, 
               (rd*<sin(radians(b*(360/xx)))*cos(radians(-90+a*(180/(yy-2)))), sin(radians(-90+a*(180/(yy-2)))), cos(radians(b*(360/xx)))*cos(radians(-90+a*(180/(yy-2))))>)," // ",rd,"\n") 
        #declare b=b+1;
      #end
      #declare a=a+1;
    #end  
    
    #write (phobos_mesh_inc, <0, 9.800271, 0>,"// north pole\n
                            }\n
                            face_indices\n
                            {\n",
                               xx*2+xx*2*(yy-3),"\n") // number of faces: b*2+b*2*(a-3) [xx*2+xx*2*(yy-3)]
    #declare a=0;
    #while (a<yy-1)  
      #declare b=0;
      #while (b<xx) 
        #switch (a)
          #case (0)
            #if (b < xx-1)
              #write (phobos_mesh_inc, <0, a+1+b, a+1+mod(b+1,xx)>, "\n") // b faces, all sharing first vertex (#0)
            #else
              #write (phobos_mesh_inc, <0, a+1+b, 1>, "\n" // last triangle connecting to first one
            #end
          #break
          #range (1, yy-3)
            #if (b < xx-1)
              #write (asteroid_mesh_inc, <1+(a-1)*xx+b, 1+(a-1)*xx+mod(b+1,xx), 1+a*xx+b>,",",<1+a*xx+b, 1+a*xx+mod(b+1,xx), 1+(a-1)*xx+mod(b+1,xx)>, "\n") // b*2*(a-3) faces 
            #else
              #write (asteroid_mesh_inc, <1+(a-1)*xx+b, 1+(a-1)*xx, 1+a*xx+b>,",",<1+a*xx+b, 1+(a-1)*xx, 1+a*xx>, "\n") // last pair of triangles in row connecting to first pair
            #end
          #break
          #case (yy-2)
            #write (phobos_mesh_inc,  <1+(a-1)*xx+b, 1+(a-1)*xx+mod(b+1,xx), vertices-1>) // b faces, all sharing last vertex
          #break
        #end
        #declare b=b+1;
      #end
      #declare a=a+1;
    #end
    #write (phobos_mesh_inc, "  }\n}")      
    
    #fclose phobos_mesh_inc
    

    Als POVer solltest du die (traditionelle) POV-Ray-Technik für 16-bit-Heightfields kennen: eben nicht 65536 Graustufen, sondern 256 Rotstufen, unterteilt in 256 Grünstufen... und eben diese Sorte Datei wird hier als Ausgangsmaterial verwendet. Strenggenommen ist es auch hier ursprünglich ein 8bit-Graustufenbild gewesen, das ich mit HF-Lab in ein solches klassisches POV-Ray-16bit-Heightfield umgewandelt hatte...

    Der PDS-Server der NASA bietet hingegen 16bit-Graustufenkarten an - und da stehe ich auf dem Schlauch! Ich bin nicht ganz auf dem Laufenden, ob POV-Ray 3.71 mittlerweile 16bit-Graustufenbilder unterstützt... und wenn ja, wie ich diese für mesh2-Objekte nutzbar machen kann!

    Bis bald im Khyberspace!

    Yadgar



  • Ja, das unterstützt es (seit bestimmt 10 Jahren...) und das steht auch in dem Link. Es steht dir auch frei aus den Heightfields andere Objekte zusammenzusetzen.



  • @tggc sagte in Spezifikation von 16bit-Graustufen-TIFFs?:

    Ja, das unterstützt es (seit bestimmt 10 Jahren...) und das steht auch in dem Link. Es steht dir auch frei aus den Heightfields andere Objekte zusammenzusetzen.

    Tut es leider nicht - ich hatte vorhin ein kleines Testprogramm geschrieben, das ein solches 16bit-TIFF mittels eval_pigment() abtasten sollte, da bekam ich prompt die Fehlermeldung, dass 16bit-TIFFs als image_map nicht zulässig sind!



  • Hast du eigentlich gelesen, was ich dir verlinkt habe? Du musst deine Graustufen Bilder einfach nur in ein png umwandeln.

    Because PNG files can store up to 16 bits in grayscale images they will be as smooth as TGA and PPM images

    Das kann z.B. ImageMagick. Auch schon seit 10 Jahren.


Anmelden zum Antworten