sujets spÉciaux - lacimblondin/files/inf5071/aut2015/... · ibn al-haytham au 10e sièce, ibn...
TRANSCRIPT
CHAPITRE11SUJETSSPÉCIAUX
AlexandreBlondinMasséDépartementd'informatique
UniversitéduQuébecàMontréal25novembre2015INF5071-Infographie
COURBESEN3D
PARAMÉTRISATIONRappel
Courbe2D:
Surfacesparamétrées:
Onpeutfacilementgénéraliserauxcourbesen3D:
P(t) = (x(t), y(t)), t ∈ D.
P(u, v) = (x(u, v), y(u, v), z(u, v)), (u, v) ∈ D.
P(t) = (x(t), y(t), z(t)), t ∈ D.
SEGMENTDEDROITE
Soit et deuxpointsdel'espace.
Alorsuneparamétrisationdusegmentdedroiteorienté est
Lavitesseestdonnéeendérivantchaquecomposante:
Onconstatequeladérivéeainsiquesanormesontconstantes.
Commentpeut-onreparamétrisercesegmentetobtenirunevitesseégaleàunnombrefixé ?
P0 P1
P0P1⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
P(t) = (1 − t) + t, t ∈ [0, 1].P0 P1
(t) = − + = , t ∈ [0, 1].P′ P0 P1 P0P1→
v0
COURBESDEBÉZIER
Toutcommeen2D,lescourbesdeBézieren3Dontlaparamétrisationsuivante:
où , , et sontlespointsdecontrôle.
Ilspermettentdedécrirefacilementdestrajectoireslissesdansl'espace.
Attention:lavitessedeparcoursn'estpasconstante:
P(t) = (1 − t + 3(1 − t t + 3(1 − t) + , t ∈ [0, 1].)3P0 )2 P1 t2P2 t3P3
P0 P1 P2 P3
P(t) = 3 [(1 − t + 2t(1 − t) + ] , t ∈ [0, 1].)2P0P1→
P1P2→
t2P1P2→
HÉLICEUnautreexemplecélèbreestceluidel'hélice.Uneparamétrisationest
P(t) = (cos t, sin t, t), t ∈ ℝ,
VITESSED'UNEHÉLICEEndérivantlaparamétrisationprécédente,onobtient
Onconstatequeladérivéen'estpasconstante.Enrevanche,sanormel'est:
(t) = (− sin t, cos t, 1), t ∈ ℝ,P′
.∥ (t)∥P′ =
==
(− sin t + t + 1)2 cos2‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√1 + 1‾ ‾‾‾‾√2‾√
ACCÉLÉRATIONEndérivantunesecondefois,onobtientl'accélération!Parexemple,pourl'hélice,nousavions
et
Ladérivéesecondeest
Dansquelledirectionpointel'accélération?
P(t) = (cos t, sin t, t), t ∈ ℝ,
(t) = (− sin t, cos t, 1), t ∈ ℝ.P′
(t) = (− cos t, − sin t, 0), t ∈ ℝ.P′
ANIMATIONSENBLENDEREnBlender,ilestégalementpossibledeconcevoirdesanimations.Cesanimationspeuventêtreexportées,parexemplesousformatJSON.Ellespeuventégalementêtreenregistréesdansdesvidéossouslesformatssuivants:AVI(avecousanscompression);MPEG,OGG,QuickTime,XVid,etc.
Ilestmêmepossibled'ajouterduson,maiscesujetneserapascouvertdanslecours.
EXEMPLEYourbrowserdoesnotsupportthevideotag.
SCÈNEToutd'abord,ilfautévidemmentconcevoirlesmodèles,ajouterlalumière,lestextures,etc.Danslevidéoprécédent,ilyaUnevoiture(corps+4roues);Unplanavecunetexturedepistedecourse;Unelampedetypesoleil.
Pourquelesobjetssedéplacentenmêmetemps,lecorpsdelavoitureestunparentdesroues.
ANIMATIONLELONGD'UNCHEMIN
Ensuite,onajouteunecourbe(parexempledetypeNURBS)quipermetdedécrirelatrajectoiredelavoiture.
CONTRAINTES
Pouranimerlavoiturelelongdelacourbe,ilsuffitd'insérerunecontrainte.
TRAJECTOIREDELACAMÉRA
Pourlacaméra,ondéfinitégalementunetrajectoireàl'aided'unecourbe.Ensuite,pourquelacourbesuivel'objetprincipal,onfaitensortequelavoituresoitleparentdelacourbe.
CONTRAINTESDELACAMÉRA
Onutiliseunepremièrecontraintequiforcelacaméraàsuivrelatrajectoiredécrite;Unedeuxièmecontrainteindiquequelacaméradoitregarderlavoitureentouttemps.
RENDUVIDÉO
BLENDERETTHREE.JSDeslogicielscommeBlenderpermettentdemodifierfacilementdesmaillagespourlesanimer.Cetteopérations'appellerigging.Plusprécisément,onajoutedesosànotremaillage,puisonétablitunlienentrecesosaveclessommetsdumaillage.Ilestmêmepossibled'exporterunmaillageavecsonarmaturepourl'utiliserdansthree.js.Remarque:lesanimationsdansthree.jsontsubidestransformationsimportantesàl'automne2015etcontinuentd'évoluer.
LEMODÈLE{ "bones": [{ "rotq": [0.502887,0.497096,0.497096,0.502887], "parent": -1, "pos": [2,0,-0], "name": "Bone", "scl": [1,1,1] },{ "rotq": [-0.007989,0.007902,-0.710902,0.703201], "parent": 0, "pos": [0,0,-0.988617], "name": "Bone.001", "scl": [1,1,1] },{ "rotq": [0.005446,3e-05,0.005446,0.99997], "parent": 1, "pos": [-0,0,-1.99448], "name": "Bone.002", "scl": [1,1,1] },{ "rotq": [0.010202,-0.000104,0.010202,0.999896], "parent": 2, "pos": [0,-0,-2.01378], "name": "Bone.003", "scl": [1,1,1] }], "faces": [35,0,1,2,3,0,0,1,2,3,35,4,7,6,5,0,4,5,6,7,35,0,4,5,1,0,0,4,7,1,35,1,5,6,2,0,1,7,6,2,35,7,3,9,11, "uvs": [], "influencesPerVertex": 2, "materials": [{ "DbgName": "Material", "wireframe": false, "colorEmissive": [0,0,0], "visible": true,
LECODESOURCE// Variables globalesvar scene;var camera;var mixer;var distance = 15;
// Initialisation de la scèneinitializeScene();
// Animation de la scèneanimateScene();
function initializeScene(){ // Initialisation du canvas renderer = new THREE.WebGLRenderer({antialias: true}); renderer.setClearColor(0x000000, 1); canvasWidth = 800; canvasHeight = 600; renderer.setSize(canvasWidth, canvasHeight); document.getElementById("canvas").appendChild(renderer.domElement);
// Initialisation de la scène et de la caméra scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(45, canvasWidth / canvasHeight, 1, 1000); camera.position.set(0, distance / 2, distance); camera.lookAt(scene.position); scene.add(camera);
// De la lumière var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5); directionalLight.position.set(0, 100, 0); scene.add(directionalLight); var ambientLight = new THREE.AmbientLight(0xf0f0f0); scene.add(ambientLight);
Voirlerésultat
LANCERSDERAYON
IBNAL-HAYTHAM
Au10esièce,Ibnal-Haythamaobservéquedespetitesparticulessedéplaçaientdansl'espaceetétaientréfléchisversnosyeux.Lesobjetsnesontvisiblesqueparcequ'ilyadelalumière;Réciproquement,onnevoitlalumièrequeparcequ'ilyadesobjets.
LUMIÈREVERSOEIL
Poursimuler,onpeutdoncémettreplusieursrayonsàpartirdelasourcelumineuse;Ensuite,selonqu'ilyadesobstacles,desmilieuxavecréfraction,desmiroirs,etc.,onidentifiequelssontlesrayonsquiatteignentlacible.Inconvénient:beaucoupdecalculsinutiles!
OEILVERSLUMIÈRE
Eninfographie,onprocèdeàl'envers!Oncalcule,àpartirdel'oeil(ouplutôtl'écran)verslessourceslumineuses,defaçondirecteouindirecte.
LUMIÈRE/OMBRE
Ondétecteleszonesombréess'ilyaintersectionavecunobstaclelorsdulancer;Selonlecas,lepixelestilluminéounon.
PSEUDOCODE
Supposonsquelascènecontient objets,lahauteuretlalargeurdel'imagesoient et etquelecoûtmoyenpourdécidersiunrayonintersecteunobjetest .
Quelleestlacomplexitédecetalgorithme?
POUR CHAQUE pixel DANS image Soit R un rayon primaire Soit P le point d'intersection de distance minimale du rayon avec un objet ombre <- VRAI SI P existe ALORS Soit S un rayon émanant de P vers la source lumineuse ombre <- VRAI si et seulement si S intersecte un objet FIN SI SI ombre ALORS RETOURNER RGB(0,0,0) SINON RETOURNER pixel * lumière.intensité FIN SIFIN POUR
nh w
c
RÉFLECTIONETRÉFRACTION
Bienqueleslancersderayonsoientcoûteux,ilspermettentdeprendreencomptedesphénomènescommelaréflectionetlaréfraction.L'équationdeFresneldécritl'interactionentrecesdeuxnotions.
RÉSULTAT
Enplusdedevoireffectueruncalculpourchaquepixel,l'algorithmeestrécursif.Eneffet,lesrayonspeuventsubirdestransformationsenpercutantlesobjetsàl'infini.Enpratique,onfixeunseuilderécursionpourqueleprocessusarrête.
CODEMINIMALCarted'affairede :AndrewKensler
#include <stdlib.h> // card > aek.ppm#include <stdio.h>#include <math.h>typedef int i;typedef float f;struct v{f x,y,z;v operator+(v r){returnv(x+r.x,y+r.y,z+r.z);}v operator*(f r){return v(x*r,y*r,z*r);}f operator%(vr){return x*r.x+y*r.y+z*r.z;}v(){}v operator^(v r){returnv(y*r.z-z*r.y,z*r.x-x*r.z,x*r.y-y*r.x);}v(f a,f b,f c){x=a;y=b;z=c;}voperator!(){return*this*(1/sqrt(*this%*this));}};iG[]={247570,280596,280600,249748,18578,18577,231184,16,16};fR(){return(f)rand()/RAND_MAX;}i T(v o,v d,f&t,v&n){t=1e9;i m=0;fp=-o.z/d.z;if(.01<p)t=p,n=v(0,0,1),m=1;for(i k=19;k--;)for(ij=9;j--;)if(G[j]&1<<k){v p=o+v(-k,0,-j-4);f b=p%d,c=p%p-1,q=b*b-c;if(q>0){fs=-b-sqrt(q);if(s<t&&s>.01)t=s,n=!(p+d*t),m=2;}}return m;}v S(v o,v d){f t;vn;i m=T(o,d,t,n);if(!m)return v(.7,.6,1)*pow(1-d.z,4);vh=o+d*t,l=!(v(9+R(),9+R(),16)+h*-1),r=d+n*(n%d*-2);fb=l%n;if(b<0||T(h,l,t,n))b=0;fp=pow(l%r*(b>0),99);if(m&1){h=h*.2;return((i)(ceil(h.x)+ceil(h.y))&1?v(3,1,1):v(3,3,3))*(b*.2+.1);}returnv(p,p,p)+S(h,r)*.5;}i main(){printf("P6 512 512 255 ");vg=!v(-6,-16,0),a=!(v(0,0,1)^g)*.002,b=!(g^a)*.002,c=(a+b)*-256+g;for(iy=512;y--;)for(i x=512;x--;){v p(13,13,13);for(i r=64;r--;){vt=a*(R()-.5)*99+b*(R()-.5)*99;p=S(v(17,16,8)+t,!(t*-1+(a*(R()+x)+b*(y+R())+c)*16))*3.5+p;}printf("%c%c%c",(i)p.x,(i)p.y,(i)p.z);}}
RÉSULTAT
EXEMPLEPLUSCOMPLEXE// [header]// A very basic raytracer example.// [/header]// [compile]// c++ -o raytracer -O3 -Wall raytracer.cpp// [/compile]// [ignore]// Copyright (C) 2012 www.scratchapixel.com//// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.// [/ignore]#include <cstdlib>#include <cstdio>#include <cmath>#include <fstream>#include <vector>#include <iostream>#include <cassert>
#if defined __linux__ || defined __APPLE__// "Compiled for Linux#else// Windows doesn't define these values by default, Linux does
RÉSULTAT