Hlavní navigace

Texturování ve VRML

Pavel Tišnovský 18. 12. 2007

Texturování, neboli nanášení obrázků na povrch 3D objektů, tvoří nedílnou součást moderních metod zobrazování 3D scén. Z tohoto důvodu je texturování podporováno i v jazyce VRML, a to dokonce ve více variantách: texturu je možné mít uloženou přímo ve VRML souboru, v externím obrázku nebo jako animaci.

Obsah

1. Texturování ve VRML
2. Uzel typu PixelTexture
3. První demonstrační příklad: použití uzlu typu PixelTexture
4. Uzel typu ImageTexture
5. Druhý demonstrační příklad: použití uzlu typu ImageTexture
6. Uzel typu MovieTexture
7. Transformace textur
8. Třetí demonstrační příklad: transformace textury
9. Obsah následující části tohoto seriálu

1. Texturování ve VRML

Jak již bylo řečeno v perexu článku, jsou v jazyce VRML podporovány tři formy texturování. Pomocí uzlu typu PixelTexture je možné uložit data textury, tj. barvy jednotlivých pixelů, přímo ve VRML souborech. Je zřejmé, že tento způsob ukládání textur (rastrových obrázků s volitelným alfa-kanálem), je omezen pouze na textury s menším rozlišením, ale i ty jsou v některých případech docela dobře použitelné, například při vytváření pruhů (textura má v jednom směru snížené rozlišení až na pouhý jeden pixel).

Druhý typ uzlu, který se používá pro nanesení textury na povrch tělesa, se jmenuje ImageTexture a jak již jeho název napovídá, jedná se o uzel, ve kterém je (kromě dalších volitelných atributů) uloženo jméno externího obrázku, přesněji řečeno jeho URL (Uniform Resource Locator). To mimo jiného znamená, že obrázek může být uložený na zcela jiném místě v rámci sítě Internet než samotný VRML soubor, což by nemělo být překvapením, protože samotné VRML bylo navrženo jako „3D varianta“ k technologii HTML.

Třetí typ uzlu, MovieTexture jde v možnostech texturování ještě dále, protože umožňuje místo statického obrázku použít jako texturu i externí soubor s animací nebo filmem. Vytvoření např. modelu televize, která ve scéně skutečně vysílá pořad, je tedy s tímto typem textury poměrně jednoduchá úloha.

Ve druhé kapitole si ukážeme způsob zápisu rastrových obrázků představujících texturu přímo ve VRML souborech, v kapitole čtvrté použití externích obrázků typu PNG, GIF a JPEG a konečně v kapitole šesté způsob nanášení celých animací či filmů ve formě textury. Vzhledem k tomu, že je možné texturu při nanášení na povrch objektu různým způsobem transformovat, tj. zvětšovat, zmenšovat, otáčet atd., popíšeme si v osmé kapitole uzel typu TextureTransform, ve kterém lze specifikovat právě tyto poměrně často používané operace.

2. Uzel typu PixelTexture

Nejjednodušší formu textur představují textury zapsané přímo ve VRML souborech, tj. v uzlu typu PixelTexture. Jedná se vlastně o malé rastrové obrázky, u nichž jsou barvy pixelů zakódovány různým způsobem. Podporovány jsou obrázky ve stupních šedi (jedna číselná hodnota na pixel), obrázky ve stupních šedi s přidaným alfa-kanálem (dvě číselné hodnoty na pixel), obrázky v kódování RGB (tři číselné hodnoty na pixel) a konečně obrázky v kódování RGB s přidaným alfa-kanálem (čtyři číselné hodnoty na jeden pixel). V případě zápisu dvojic, trojic a čtveřic číselných hodnot se typicky tyto hodnoty slučují do jednoho hexadecimálního čísla podobným způsobem, jaký je použit při specifikaci barvy v HTML nebo CSS. Uzel typu PixelTexture je zapisován s následující syntaxí:

PixelTexture {
    image      0 0 0  # specifikace rozlišení a typu pixelů (0 0 0 jsou implicitní hodnoty)
    repeatS    TRUE   # povolení či zákaz opakování textury ve směru souřadnice S
    repeatT    TRUE   # povolení či zákaz opakování textury ve směru souřadnice T
} 

První dvě číselné hodnoty slouží ke specifikaci rozlišení textury, tj. velikosti rastrového obrázku, který texturu představuje. Většinou se používají textury, jejichž šířka i délka jsou mocninami čísla 2, tj. například se může jednat o rozlišení 64×64 pixelů, 128×128 pixelů a 256×256 pixelů, ve VRML však toto omezení není popsáno, takže by prohlížeče měly akceptovat i jiné poměry stran. Třetí číselnou hodnotou je zapsán počet složek reprezentujících jeden pixel. Jsou povoleny následující hodnoty:

  • 0 – textura neobsahující žádná data (implicitní hodnota, povrch objektu není definován)
  • 1 – pixel je reprezentován hodnotou šedi (grayscale)
  • 2 – pixel je reprezentován hodnotou šedi a alfa-kanálem (grayscale+alpha channel)
  • 3 – pixel je reprezentován třemi hodnotami R, G a B (RGB triplet)
  • 4 – pixel je reprezentován čtyřmi hodnotami: R, G, B a alfa-kanálem (RGB triplet+alpha channel)

Za touto zjednodušenou hlavičkou textury jsou již umístěna data jednotlivých pixelů, typicky uložená ve formě hexadecimální hodnoty začínající prefixem „0ד. Dále se mohou v uzlu PixelTexture vyskytovat dva příznaky, pomocí nichž je povoleno či naopak zakázáno opakování textury ve směru osy S a T v případě, že je textura zmenšena na takovou velikost, že nepokryje celý povrch tělesa.

6901

3. První demonstrační příklad: použití uzlu PixelTexture

V dnešním prvním demonstračním příkladu je ukázáno použití uzlu typu PixelTexture pro specifikaci jednoduché textury o rozlišení 10×10 pixelů. Pixely textury (někdy také nazývané texely) jsou reprezentovány trojicí hodnot R, G a B, která je zapsána formou jednoho hexadecimálního čísla v rozsahu 0×000000 až 0×ffffff. Textura je použita pro nanášení na povrch jednotkové krychle, jak je však patrné z druhého obrázku, dá se tatáž textura nanést i na geometricky značně odlišné těleso – kouli. Zdrojový kód prvního demonstračního příkladu má tvar:

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Prvni demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje jednoduche
# otexturovane teleso. Textura je zadana pomoci dat
# ulozenych primo ve VRML souboru.
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
#
# Textura byla ziskana ze stranky:
# http://www.ballreich.net/vrml/texture/vrml-2.html
# ---------------------------------------------------------

WorldInfo {
    title "Prvni 3D scena s ukazkou texturovani"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 1.5 7.0
}

# nastaveni svetelneho zdroje
# (ve skutecnosti neni ve scene pouzit)
PointLight {
    color     1.0 1.0 1.0      # barva svetla
    intensity 1.0              # intenzita bodoveho svetla
    location  0.0 4.0 1.0      # pozice svetelneho zdroje
}

# otexturovane teleso ve tvaru osove orientovane krychle
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        texture PixelTexture {
            image 10 10 3 0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA
                          0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0x511504 0x511504 0x511504 0x511504 0xAAAAAA
                          0x511504 0x511504 0x511504 0x511504 0x511504
                          0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA
                          0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA 0xAAAAAA
        }
    }
    # tvar objektu - geometricke informace
    geometry Box {
    }
}

# pomocne teleso slozene z usecek (ctverice usecek)
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        # u usecek neni mozne pouzit Phonguv osvetlovaci model
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4 -4 -4,
                 4  4  4,
                 4 -4  4,
                -4  4 -4,
                 4  4 -4,
                -4 -4  4,
                 4 -4 -4,
                -4  4  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
             6  7 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6902

4. Uzel typu ImageTexture

Výše uvedený uzel typu PixelTexture se používá pouze v případech, že nanášená textura má malé rozlišení (výhody jsou zřejmé – vše je uloženo v jednom souboru). Ovšem pokud máme k dispozici textury složitější (například fotografie), došlo by k přílišnému nárůstu velikosti VRML souborů, protože použitý formát ukládání pixelů je velmi neefektivní – v některých případech může pomoci komprimace VRML souboru.

Z tohoto důvodu je ve VRML možné se odkazovat na externí grafické soubory uložené ve formátech GIF, PNG či JPEG, přičemž odkaz je uvedený ve formě URL, tj. samotný soubor s obrázkem se může nacházet na jiném počítači než samotný VRML soubor. Vlastní zabezpečení přístupu VRML prohlížeče na Internet je ponecháno na operačním systému, popř. na nastavení proxy serveru (pokud je VRML prohlížeč nainstalován jako součást Webového prohlížeče, měl by použít jeho komunikační kanály). Vlastní zápis uzlu ImageTexture je poněkud jednodušší, než tomu bylo u uzlu PixelTexture, protože není nutné zapisovat formát obrázku (ten je zjištěn z hlavičky externího souboru):

ImageTexture {
    url        [ ]    # seznam URL obrázků
    repeatS    TRUE   # povolení či zákaz opakování textury ve směru souřadnice S
    repeatT    TRUE   # povolení či zákaz opakování textury ve směru souřadnice T
} 

Všimněte si, že se nemusí zadat pouze jedno URL obrázku, ale hned celý seznam. Je tomu tak z toho důvodu, že obrázek nemusí být na jednom serveru dostupný (přetížený server, výpadek připojení k serveru apod.), proto může VRML prohlížeč stáhnout obrázek z jiného umístění. Jedná se o seznam s implicitní prioritou, tj. nejdříve uvedené URL je použito pro první pokus o stažení textury, druhý pokus využije druhé URL atd.

6903

5. Druhý demonstrační příklad: použití uzlu typu ImageTexture

Dnešní druhý demonstrační příklad se svojí strukturou příliš neliší od příkladu prvního, ovšem s tím rozdílem, že místo rastrového obrázku uloženého přímo ve VRML souboru je použit externí obrázek uložený ve formátu PNG. Je samozřejmě možné použít i obrázky s alfa-kanálem (ten je plně v PNG podporován), ovšem s tím, že ne všechny VRML prohlížeče dokážou takto vytvořené trojrozměrné scény korektně vykreslit.

6904

Zdrojový kód druhého demonstračního příkladu má tvar:

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Druhy demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje jednoduche
# otexturovane teleso.
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
# ---------------------------------------------------------

WorldInfo {
    title "Druha 3D scena s ukazkou texturovani"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 1.5 7.0
}

# nastaveni svetelneho zdroje
# (ve skutecnosti neni ve scene pouzit)
PointLight {
    color     1.0 1.0 1.0      # barva svetla
    intensity 1.0              # intenzita bodoveho svetla
    location  0.0 4.0 1.0      # pozice svetelneho zdroje
}

# otexturovane teleso ve tvaru osove orientovane krychle
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        texture ImageTexture {
            url "lena_logo.png"  # URL obrazku (muze byt i na jinem serveru)
        }
    }
    # tvar objektu - geometricke informace
    geometry Box {
    }
}

# pomocne teleso slozene z usecek (ctverice usecek)
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        # u usecek neni mozne pouzit Phonguv osvetlovaci model
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4 -4 -4,
                 4  4  4,
                 4 -4  4,
                -4  4 -4,
                 4  4 -4,
                -4 -4  4,
                 4 -4 -4,
                -4  4  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
             6  7 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6905

Textura s alfa kanálem

6906

Některé prohlížeče nedokážou korektně pracovat s poloprůhlednými texturami

6907

Texturu je možné mapovat i na tělesa s ploškami ve tvaru kružnic

6. Uzel typu MovieTexture

V první kapitole jsme si řekli, že VRML podporuje i dynamické textury, které jsou uloženy ve formátu videa (například klasického MPEG 1, 2, 4 či přes speciální plugin lze použít i formát Flashe). Takovou texturu je možné použít při modelování televize, tvorbě složitějších 3D světů s animacemi, výbuchy, ohněm, vodopádem apod. Specifikace tohoto typu textury se provádí pomocí uzlu MovieTexture s následující syntaxí:

MovieTexture {
    loop       TRUE   # určení, zda se má přehrávání opakovat stále dokola
    speed      1      # relativní rychlost přehrávání (záporná čísla - zpětné převinutí filmu)
    startTime  0      # časová značka začátku přehrávání udaná ve formátu Unixového času (epochy)
    stopTime   0      # časová značka konce přehrávání udaná ve formátu Unixového času (epochy)
    url        [ ]    # seznam URL video souborů
    repeatS    TRUE   # povolení či zákaz opakování textury ve směru souřadnice S
    repeatT    TRUE   # povolení či zákaz opakování textury ve směru souřadnice T
} 

Zbývá vysvětlit způsob určení časových značek. Samotný svět vymodelovaný ve VRML souboru je podle definice vytvořen o půlnoci 1.1.1970, tj. jedná se o začátek Unixové epochy. Specifikací atributů startTime a stopTime je možné nastavit čas spuštění a zastavení animace. Dále se pomocí atributu loop určuje, zda se má animace neustále opakovat, nebo zda je přehrána pouze jedenkrát.

7. Transformace textur

Důležitou součástí texturování je i určení způsobu nanášení textur na povrch těles. Ve VRML jsme poněkud omezeni tím, že se nedá přesně popsat způsob nanášení, tj. mapování texelů na povrch, nicméně ve většině případů si vystáčíme s implicitním chováním, které bylo ukázáno v předchozích příkladech – textura je na plošku namapována tak, aby ji celou vyplnila. Souřadnice do textury je však možné specifikovat u výškových polí i těles popsaných uzlem IndexedFaceSet. Kromě toho je možné pro celou texturu globálně zadat způsob mapování pomocí lineární transforamce zapsané jako změna měřítka, rotace a posun. K tomuto účelu slouží uzel TextureTransform s následující syntaxí (vypsány jsou i implicitní hodnoty):

TextureTransform {
    scale       1 1
    rotation    0
    center      0 0
    translation 0 0
} 
6908

Aplikace transformace při mapování textury

8. Třetí demonstrační příklad: transformace textury

Ve třetím demonstračním příkladu je ukázána jednoduchá transformace textury nanesené na povrch jednotkové krychle. Textura je podrobena transformaci změny měřítka, což konkrétně znamená, že se na povrch každé stěny krychle vykreslí celkem čtyřikrát. Kromě toho je provedeno i natočení textury o 0.785398 radů (π/4), což je zhruba 45°. Všimněte si, že zvětšení textury je zapsáno pomocí dvojice hodnot 2.0×2.0, ovšem to je změna měřítka v prostoru textury, tj. prostoru specifikovaném souřadnicemi S a T. Zvětšení textury v tomto prostoru znamená, že se textura po namapování na povrch objektu ve skutečnosti zmenší. Zdrojový kód třetího demonstračního příkladu má tvar:

#VRML V2.0 utf8
# verze 2.0 vyzaduje kodovani UTF-8

# ---------------------------------------------------------
# Treti demonstracni priklad trojrozmerne sceny
# popsane jazykem VRML 2.0, ktera obsahuje otexturovane
# teleso. Na texturu je aplikovana transformace.
#
# Priklad je soucasti serialu "Graficke formaty"
# (/serialy/graficke-formaty/)
# vychazejiciho na Root.cz (http://www.root.cz)
# ---------------------------------------------------------

WorldInfo {
    title "Treti 3D scena s ukazkou texturovani"
    info ["Autor: Pavel Tisnovsky, 2007"
         "sireno pod licenci GPL "]
}

# nastaveni barevneho prechodu na pozadi sceny
Background {
    skyColor [1 1 0,
              1 0 0]
    skyAngle [3.14]
}

# nastaveni pozice pozorovatele
Viewpoint {
    position 0.0 1.5 7.0
}

# nastaveni svetelneho zdroje
# (ve skutecnosti neni ve scene pouzit)
PointLight {
    color    1.0 1.0 1.0 # barva svetla
    intensity 1.0        # intenzita bodoveho svetla
    location 0.0 4.0 1.0 # pozice svetelneho zdroje
}

# otexturovane teleso ve tvaru osove orientovane krychle
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        texture ImageTexture {
            url "lena_logo.png"  # URL obrazku (muze byt i na jinem serveru)
        }
        # transformace textury
        textureTransform TextureTransform {
            #translation 0.5 0.5
            scale 2.0 2.0      # zmena meritka - ve skutecnosti zmenseni textury
            rotation 0.785398  # rotace textury zadana v radianech
        }
    }
    # tvar objektu - geometricke informace
    geometry Box {
    }
}

# pomocne teleso slozene z usecek (ctverice usecek)
Shape {
    # vzhled objektu - negeometricke informace
    appearance Appearance {
        # u usecek neni mozne pouzit Phonguv osvetlovaci model
        material Material {
            emissiveColor 0 0 1
        }
    }
    # tvar objektu - geometricke informace
    geometry IndexedLineSet {
        # interni poduzel se souradnicemi bodu
        coord Coordinate {
            point [
                -4 -4 -4,
                 4  4  4,
                 4 -4  4,
                -4  4 -4,
                 4  4 -4,
                -4 -4  4,
                 4 -4 -4,
                -4  4  4
            ]
        }
        # indexy do predchoziho pole
        # (pouze usecky) oddelene
        # indexem s hodnotou -1
        coordIndex [
             0  1 -1
             2  3 -1
             4  5 -1
             6  7 -1
        ]
    }
}



# ---------------------------------------------------------
# finito
# --------------------------------------------------------- 
6909

Zdrojové kódy s demonstračními příklady i přiloženými texturami můžete získat pod tímto odkazem.

9. Obsah následující části tohoto seriálu

V další části seriálu o grafických formátech a metaformátech si ukážeme práci s multimédii a také s takzvanými senzory, které se používají pro přidání interaktivních prvků do vytvářených prostorových scén, tj. prvků, které určitým způsobem reagují na pohyb uživatele (resp. jeho avatara) či manipulaci s jednotlivými objekty.

Našli jste v článku chybu?

20. 12. 2007 10:08

Pavel Tisnovsky (neregistrovaný)
Jeste jsem si vecer uvedomil, ze by to opravdu chtelo nejaky priklad na mapovani textur pomoci texCoord a texCoordIndex a vazba na transformace textur. Bude to uvedeno v nasledujici casti serialu, diky za upozorneni.

19. 12. 2007 22:31

Pavel Tisnovsky (neregistrovaný)
Ono se to vzajemne doplnuje. U IndexedFaceSet apod. se opravdu mohou specifikovat souradnice do textury (tedy souradnice v prostoru textury), ale u dalsich typu objektu, napr. koule ci textu to neni mozne. A prave z tohoto duvodu je tady jako urcita nahrazka (urcite ne dokonala) prave transformace textur pred jejich automatickym mapovanim na tyto objekty. Jinak je samozrejme mozne pouzivat tecCoord spolecne s transformacemi a provadet tak jednoduche animace (mraky o Quaka?)
Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky