TARGET PHOTOMETRIC LIGHTS:
1. Aseta renderöintiengineksi mental ray.
2. Tee kaareva taustaplane Plane-objektista, jatkamalla sen takana olevaa edgeä ylös sekä lisäämällä TurboSmoothin.
3. Tee teepannu ja aseta se origoon. Laita siihen default Arch & Design -materiaali.
4. Tee Target Light Photometric-valikosta ja aseta sen target origoon.
5. Shadows: Ray Traced Shadows, Emit light from: Rectangle, Light Shape Visible in Rendering päälle sekä Adv Effectsistä Specular pois.
6. Valitse intensity eli valovoima sopivaksi. Yksiköt:
Valovoiman mittayksikkö on kandela (cd).
Valovirta eli luumen (lm) kuvaa kuinka paljon näkyvää valoa valonlähde säteilee kokonaisuudessaan.
Valovirta siis kertoo kuinka voimakas valonlähde on kokonaisuudessaan, kun taas valovoima kertoo valonlähteen havaitun voimakkuuden tietylle alalle eli yhtä steradiaania kohden.
1 kandela (cd) = yksi kynttilä
1 luumen (lm) = 1 kandela * steradiaani (sr)
1 luksi (lx) = 1 lm / m².
7. Valitse pelkkä lamppu ja siirrä sitä shift-pohjassa tehdäksesi uuden, jolloin target pysyy samassa paikassa.
8. Tee tarvittaessa vielä yksi lamppu kopioimalla jompikumpi lampuista objektin yläpuolelle.
9. Erota teepannuobjektin osat omiksi mat id:eikseen ja tee tee pannulle multi sub object -materiaali ja eri id:eille oma materiaali.
10. Säädä Exposure Controlista Exposure Value (EV) -arvo sopivaksi.
HDR ENVIRONMENT:
1. Valitse Environment Mapiksi HDR-kuva ja aseta White Point sopivaksi.
2. Tee HDR-mapista Instance-kopio Material Editoriin raahaamalla se sinne.
3. Aseta HDR-mapin Mapping Sphericaliksi.
4. Tee skeneen pallo ja laita siihen kromimatsku, josta näkee miten päin HDR-map on skenessä.
5. Muuta tarvittaessa HDR-mapin Offsetin U-arvoa kääntääksesi HDR-kuvaa sekä Outputin Output Amountia tehdäksesi siitä kirkkaamman.
6. Tee skeneen Skylight-valo-objekti ja laita Use Scene Environment päälle.
7. Jos haluat valaistuksesta kirkkaamman ilman että HDR:stä tulee kirkkaampi, nosta Skylightin Multiplier-arvoa.
perjantai 12. kesäkuuta 2015
Photoshop: 3d-rendauksen tyylittely 1
Avaa rendaus Photarissa.
Laita siihen seur. järjestyksessä:
- Oil paint -filtteri
- Accented Edges
- Spatter
- Pieni Noise ja blur
Sitten kopioi lopputulos uudelle layerille, laita siihen Gauss Blur ja blend modeksi Overlay ja laske opacityä.
Laita siihen seur. järjestyksessä:
- Oil paint -filtteri
- Accented Edges
- Spatter
- Pieni Noise ja blur
Sitten kopioi lopputulos uudelle layerille, laita siihen Gauss Blur ja blend modeksi Overlay ja laske opacityä.
Unity: C#-perusteet
https://www.youtube.com/watch?v=apJoi_YFVqk
Variablet eli muuttujat pitävät sisällään tietoa.
------------------
//variables.cs:
using UnityEngine;
using System.Collections;
public class Variables : MonoBehaviour
//MonoBehav. on yläluokka, jonka alla kaikki muut skriptit ovat.
//Huomaa että määritellyn luokan pitää olla sama kuin skriptitiedoston nimi:
//ko. tapauksessa Variables.
{
public string myName = "Jonathan";
//luodaan myName-niminen "julkinen" tekstimuuttuja ja annetaan sille arvo "Jonathan".
public float speed = 5.5f;
//luodaan speed-niminen julkinen desimaalilukumuuttuja ja annetaan sille arvo 5.5. Huomaa f-kirjain!
private int myAge 22;
//luodaan myAge-niminen "yksityinen" kokonaislukumuuttuja ja annetaan sille arvo 22.
//Koska ko. muuttuja on yksityinen, mikään muu luokka ei voi päästä siihen käsiksi,
//vain tämä skripti.
public bool isCool = true;
//luodaan isCool-niminen "julkinen" totuusarvomuuttuja ja annetaan sille arvoksi "true" eli tosi.
}
------------------
//IfThenStatements.cs:
using UnityEngine;
using System.Collections;
public class IfThenStatements : MonoBehaviour
{
public int myAge = 22;
private bool canDrink = false;
void Start () //Ko. funktio suoritetaan ohjelman käynnistyessä.
{
if (myAge > 17)
{
Debug.Log("Olen yli 17-vuotias.");
canDrink = true; //Muutetaan canDrink-boolean todeksi.
}
else if (myAge < 5)
{
Debug.Log("Olen alle 5-vuotias.");
canDrink = false; //Muutetaan canDrink-boolean epätodeksi.
}
else
{
Debug.Log("Ikäni on 5 ja 17 välillä.");
canDrink = false;
}
//Jos kok.luku myAge on suurempi kuin 17, tehdään if-toiminto,
//mutta jos kok.luku myAge on pienempi kuin 5, tehdään else if toiminto.
//Jos kok.luku on 5 ja 17 välillä, tehdään else-toiminto.
}
void Update () //Ko. funktiota suoritetaan kokoajan ohjelman aikana.
{
if (canDrink == true)
{
Debug.Log("Saat juoda!");
}
else
{
Debug.Log("Olet liian nuori juomaan!");
}
//Jos boolean-arvo canDrink on tosi, tehdään if-toiminto, muuten else-toiminto.
}
}
------------------
//LogicOperators.cs:
using UnityEngine;
using System.Collections;
public class LogicOperators : MonoBehaviour
{
public int a;
public int b;
public int c;
private int average;
void Start ()
{
average = (a + b + c) / 3;
Debug.Log(average);
// Määritetään kok.luku averagen arvo laskemalla a, b ja c yhteen ja jakamalla summa kolmella.
// Tämän jälkeen tulostetaan muuttujan average arvo konsoliin.
}
}
------------------
//SwitchStatements.cs
using UnityEngine;
using System.Collections;
public class SwitchStatements : MonoBehaviour
{
public int a;
public int b;
public int c;
private int average;
void Start ()
{
average = (a + b + c) / 3;
switch(average)
{
case 16:
Debug.Log("Keskiarvo on 16!");
break;
case 10:
Debug.Log("Keskiarvo on 10!");
break;
default:
Debug.Log("Keskiarvo on jokin muu kuin 16 tai 10.");
break;
//Jos kok.luvun average-arvo on 16 tai 10, tehdään kaksi ylintä casea, muuten tehdään default-case.
//Ikään kuin tehokkaampi tapa ilmaista if-else-lausekkeita.
}
}
}
--------------------
//SwitchStatements.cs, toinen esimerkki:
using UnityEngine;
using System.Collections;
public class SwitchStatements : MonoBehaviour
{
public int selectedSkillLevel;
private int easy = 0, medium = 1, hard = 2;
void Start ()
{
switch(selectedSkillLevel)
{
case 0:
Debug.Log("You selected easy!")
break;
case 1:
Debug.Log("You selected medium!")
break;
case 2:
Debug.Log("You selected hard!")
break;
default:
Debug.Log("Invalid skill level!");
break;
//Jos kok.luvun selectedSkillLevel arvoksi laitetaan 0-2, tehdään caset 0-2,
//muuten tehdään default-case.
}
}
}
--------------------
//Loops.cs:
//For-luuppi:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int apples = 100;
void Start ()
{
for(int i = 1; i <= apples; i++)
{
Debug.Log(i);
}
Debug.Log("All the apples found!");
//Kok.luku i:n arvo on alussa 1.
//Niin kauan, kuin i-arvo on pienempi tai yhtä suuri kuin apples-arvo,
//kasvatetaan i-arvoa yhdellä (i++)
//kunnes apples-arvo saavutetaan.
//Tämän jälkeen tulostetaan konsoliin alempi debuglog.
}
}
//Foreach-luuppi, periaatteessa sama kuin for-luuppi:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int[] numbers = {5, 6, 7, 8}; //Array
void Start ()
{
foreach(var number in numbers)
{
Debug.Log(number);
}
//Tulostetaan konsoliin kukin numbers-arrayn arvo.
}
}
//While-luuppi:
//Vaarallinen luuppi, koska voidaan päätyä loputtomaan luuppiin ja Unity/kone voi kaatua.
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int apples = 100;
void Start ()
{
while(apples > 1)
{
Debug.Log(apples);
apples--;
}
Debug.Log(The while loop finished! Yay for no crash!");
//Niin kauan, kuin apples on arvo on suurempi kuin yksi, tulostetaan apples-arvo konsoliin
//ja vähennetään apples-arvoa yhdellä.
// Tämän jälkeen tulostetaan alempi debuglog.
}
}
//Do-luuppi; luuppi tehdään ainakin kerran:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
void Start ()
{
do
{
Debug.Log("Apples: " + apples);
apples--;
}while(apples >= 1);
}
}
Variablet eli muuttujat pitävät sisällään tietoa.
------------------
//variables.cs:
using UnityEngine;
using System.Collections;
public class Variables : MonoBehaviour
//MonoBehav. on yläluokka, jonka alla kaikki muut skriptit ovat.
//Huomaa että määritellyn luokan pitää olla sama kuin skriptitiedoston nimi:
//ko. tapauksessa Variables.
{
public string myName = "Jonathan";
//luodaan myName-niminen "julkinen" tekstimuuttuja ja annetaan sille arvo "Jonathan".
public float speed = 5.5f;
//luodaan speed-niminen julkinen desimaalilukumuuttuja ja annetaan sille arvo 5.5. Huomaa f-kirjain!
private int myAge 22;
//luodaan myAge-niminen "yksityinen" kokonaislukumuuttuja ja annetaan sille arvo 22.
//Koska ko. muuttuja on yksityinen, mikään muu luokka ei voi päästä siihen käsiksi,
//vain tämä skripti.
public bool isCool = true;
//luodaan isCool-niminen "julkinen" totuusarvomuuttuja ja annetaan sille arvoksi "true" eli tosi.
}
------------------
//IfThenStatements.cs:
using UnityEngine;
using System.Collections;
public class IfThenStatements : MonoBehaviour
{
public int myAge = 22;
private bool canDrink = false;
void Start () //Ko. funktio suoritetaan ohjelman käynnistyessä.
{
if (myAge > 17)
{
Debug.Log("Olen yli 17-vuotias.");
canDrink = true; //Muutetaan canDrink-boolean todeksi.
}
else if (myAge < 5)
{
Debug.Log("Olen alle 5-vuotias.");
canDrink = false; //Muutetaan canDrink-boolean epätodeksi.
}
else
{
Debug.Log("Ikäni on 5 ja 17 välillä.");
canDrink = false;
}
//Jos kok.luku myAge on suurempi kuin 17, tehdään if-toiminto,
//mutta jos kok.luku myAge on pienempi kuin 5, tehdään else if toiminto.
//Jos kok.luku on 5 ja 17 välillä, tehdään else-toiminto.
}
void Update () //Ko. funktiota suoritetaan kokoajan ohjelman aikana.
{
if (canDrink == true)
{
Debug.Log("Saat juoda!");
}
else
{
Debug.Log("Olet liian nuori juomaan!");
}
//Jos boolean-arvo canDrink on tosi, tehdään if-toiminto, muuten else-toiminto.
}
}
------------------
//LogicOperators.cs:
using UnityEngine;
using System.Collections;
public class LogicOperators : MonoBehaviour
{
public int a;
public int b;
public int c;
private int average;
void Start ()
{
average = (a + b + c) / 3;
Debug.Log(average);
// Määritetään kok.luku averagen arvo laskemalla a, b ja c yhteen ja jakamalla summa kolmella.
// Tämän jälkeen tulostetaan muuttujan average arvo konsoliin.
}
}
------------------
//SwitchStatements.cs
using UnityEngine;
using System.Collections;
public class SwitchStatements : MonoBehaviour
{
public int a;
public int b;
public int c;
private int average;
void Start ()
{
average = (a + b + c) / 3;
switch(average)
{
case 16:
Debug.Log("Keskiarvo on 16!");
break;
case 10:
Debug.Log("Keskiarvo on 10!");
break;
default:
Debug.Log("Keskiarvo on jokin muu kuin 16 tai 10.");
break;
//Jos kok.luvun average-arvo on 16 tai 10, tehdään kaksi ylintä casea, muuten tehdään default-case.
//Ikään kuin tehokkaampi tapa ilmaista if-else-lausekkeita.
}
}
}
--------------------
//SwitchStatements.cs, toinen esimerkki:
using UnityEngine;
using System.Collections;
public class SwitchStatements : MonoBehaviour
{
public int selectedSkillLevel;
private int easy = 0, medium = 1, hard = 2;
void Start ()
{
switch(selectedSkillLevel)
{
case 0:
Debug.Log("You selected easy!")
break;
case 1:
Debug.Log("You selected medium!")
break;
case 2:
Debug.Log("You selected hard!")
break;
default:
Debug.Log("Invalid skill level!");
break;
//Jos kok.luvun selectedSkillLevel arvoksi laitetaan 0-2, tehdään caset 0-2,
//muuten tehdään default-case.
}
}
}
--------------------
//Loops.cs:
//For-luuppi:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int apples = 100;
void Start ()
{
for(int i = 1; i <= apples; i++)
{
Debug.Log(i);
}
Debug.Log("All the apples found!");
//Kok.luku i:n arvo on alussa 1.
//Niin kauan, kuin i-arvo on pienempi tai yhtä suuri kuin apples-arvo,
//kasvatetaan i-arvoa yhdellä (i++)
//kunnes apples-arvo saavutetaan.
//Tämän jälkeen tulostetaan konsoliin alempi debuglog.
}
}
//Foreach-luuppi, periaatteessa sama kuin for-luuppi:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int[] numbers = {5, 6, 7, 8}; //Array
void Start ()
{
foreach(var number in numbers)
{
Debug.Log(number);
}
//Tulostetaan konsoliin kukin numbers-arrayn arvo.
}
}
//While-luuppi:
//Vaarallinen luuppi, koska voidaan päätyä loputtomaan luuppiin ja Unity/kone voi kaatua.
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
public int apples = 100;
void Start ()
{
while(apples > 1)
{
Debug.Log(apples);
apples--;
}
Debug.Log(The while loop finished! Yay for no crash!");
//Niin kauan, kuin apples on arvo on suurempi kuin yksi, tulostetaan apples-arvo konsoliin
//ja vähennetään apples-arvoa yhdellä.
// Tämän jälkeen tulostetaan alempi debuglog.
}
}
//Do-luuppi; luuppi tehdään ainakin kerran:
using UnityEngine;
using System.Collections;
public class Loops : MonoBehaviour
{
void Start ()
{
do
{
Debug.Log("Apples: " + apples);
apples--;
}while(apples >= 1);
}
}
3ds Max: Simulaatio kappaleiden pudottamiseksi astiaan
- Mallinna proxy-astia, jonne kappaleet pudotetaan.
- Lisää proxy-malliin Static Rigid Body MassFX-työkalupalkista ja laita sen Shapeksi Original.
- Siirrä kuusi pudotettavaa kappaletta astian yläpuolelle. Jos kappale on kovin yksityiskohtainen, tee siitä lowpoly-malli ja linkkaa hipoly-malli siihen. Siirrä siis vain lowpoly-kappaleita.
- Lisää kuhunkin pudotettavaan kappaleeseen Dynamic Rigidbody ja laita niiden Presetiksi Steel tai Concrete.
- Kopioi sekä hipoly että lowpoly-kappaleita astian yläpuolelle haluttu määrä.
- Piilota hipoly-kappaleet ja toista simulaatio MassFX:n palkista. Pysäytä play, kun olet tyytyväinen simulaatioon. Pidä huoli että hi- ja lowpoly-kappaleiden linkkaus säilyy.
- Jos olet tyytyväinen simulaatioon, konvertoi lowpoly-kappaleet Editable Polyksi, jolloin Rigid Body -modifier häviää niistä.
- Lisää proxy-malliin Static Rigid Body MassFX-työkalupalkista ja laita sen Shapeksi Original.
- Siirrä kuusi pudotettavaa kappaletta astian yläpuolelle. Jos kappale on kovin yksityiskohtainen, tee siitä lowpoly-malli ja linkkaa hipoly-malli siihen. Siirrä siis vain lowpoly-kappaleita.
- Lisää kuhunkin pudotettavaan kappaleeseen Dynamic Rigidbody ja laita niiden Presetiksi Steel tai Concrete.
- Kopioi sekä hipoly että lowpoly-kappaleita astian yläpuolelle haluttu määrä.
- Piilota hipoly-kappaleet ja toista simulaatio MassFX:n palkista. Pysäytä play, kun olet tyytyväinen simulaatioon. Pidä huoli että hi- ja lowpoly-kappaleiden linkkaus säilyy.
- Jos olet tyytyväinen simulaatioon, konvertoi lowpoly-kappaleet Editable Polyksi, jolloin Rigid Body -modifier häviää niistä.
Allegorithmicin PBR-ohjeet
https://www.allegorithmic.com/system/files/software/download/build/PBR_Guide_Vol.1.pdf
https://www.allegorithmic.com/system/files/software/download/build/PBR_Guide_Vol.2.pdf
https://www.allegorithmic.com/system/files/software/download/build/PBR_Guide_Vol.2.pdf
3ds Max: Toimiva skripti verteksien normaalien asettamiseksi facen suuntaisesti
http://wiki.polycount.com/wiki/File:GetVertNormalsFromFace_0_2.ms.zip
sunnuntai 7. kesäkuuta 2015
3ds Max: hipoly-mallista normal map lowpoly-malliin
Mallinna hipoly-objekti esim. subdiv-tekniikalla. Hankalat yksityiskohdat voi toteuttaa ns. floating geometry -tekniikalla.
Kun hipoly-malli on valmis, tee siitä kopio samaan paikkaan ja laita se Lowpoly_Bake-nimiselle layerille. Laita hi- ja lowpoly-malleihin erivärinen default-materiaali, jotta ne erottuvat helposti toisistaan.
Mallinna lowpoly-malli esim. niin, että poistat yksityiskohtia hipoly-mallista. Käytä smoothing groupeja teräviin kulmiin.
Maxin Graphite Modeling Toolsien Conform-työkaluilla on helppo saada lowpoly-malli mukailemaan täydellisesti hipoly-mallin pintaa; valitse Draw On -objektiksi Surface ja valitse Surface-objektiksi hipoly-malli. Tämän jälkeen voit muokata mallia Conform- ja Conform Move Brusheilla.
Lowpoly-mallinnuksen jälkeen mappaa lowpoly-malli niin, että kukin smoothing group muodostaa oman uv-palasen käyttämällä UV Editorin Flatten by Smoothing group -painiketta.
Tämän jälkeen käytä UV Editorin relax-työkalua, jolla uv-palaset saadaan suoristettua. Jos suoristus ei onnistu joihinkin palasiin, jaa uv-palanen pienempiin osiin, siirtele verteksejä jotta palasesta tulee selkeämpi tai kokeile käyttää jotain projektiota ja kokeile uudestaan. Myös Peel-toiminnot voivat toimia hyvin.
Kun mappaus on valmis, renderöi normal map hipoly-mallista käyttäen Render to Texturea ja valitsemalla siinä projisoitavaksi malliksi hipoly-malli ja säätämällä projisointi-cagea, jne...
Renderöimisen jälkeen kopioi lowpoly-malli uudelle Lowpoly_Final-nimiselle layerille. Laita kopioidun mallin mateaaliin renderöimäsi normal map ja laita Realistic Materials with Maps päälle, jotta saat normal mapin näkymään reaaliaikaisesti.
Kun hipoly-malli on valmis, tee siitä kopio samaan paikkaan ja laita se Lowpoly_Bake-nimiselle layerille. Laita hi- ja lowpoly-malleihin erivärinen default-materiaali, jotta ne erottuvat helposti toisistaan.
Mallinna lowpoly-malli esim. niin, että poistat yksityiskohtia hipoly-mallista. Käytä smoothing groupeja teräviin kulmiin.
Maxin Graphite Modeling Toolsien Conform-työkaluilla on helppo saada lowpoly-malli mukailemaan täydellisesti hipoly-mallin pintaa; valitse Draw On -objektiksi Surface ja valitse Surface-objektiksi hipoly-malli. Tämän jälkeen voit muokata mallia Conform- ja Conform Move Brusheilla.
Lowpoly-mallinnuksen jälkeen mappaa lowpoly-malli niin, että kukin smoothing group muodostaa oman uv-palasen käyttämällä UV Editorin Flatten by Smoothing group -painiketta.
Tämän jälkeen käytä UV Editorin relax-työkalua, jolla uv-palaset saadaan suoristettua. Jos suoristus ei onnistu joihinkin palasiin, jaa uv-palanen pienempiin osiin, siirtele verteksejä jotta palasesta tulee selkeämpi tai kokeile käyttää jotain projektiota ja kokeile uudestaan. Myös Peel-toiminnot voivat toimia hyvin.
Kun mappaus on valmis, renderöi normal map hipoly-mallista käyttäen Render to Texturea ja valitsemalla siinä projisoitavaksi malliksi hipoly-malli ja säätämällä projisointi-cagea, jne...
Renderöimisen jälkeen kopioi lowpoly-malli uudelle Lowpoly_Final-nimiselle layerille. Laita kopioidun mallin mateaaliin renderöimäsi normal map ja laita Realistic Materials with Maps päälle, jotta saat normal mapin näkymään reaaliaikaisesti.
Tilaa:
Blogitekstit (Atom)