03 - Raymarching: Implémenter votre Raymarcher (Camera)

Dans cette vidéo nous allons continuer d'implémenter notre raymarcher en codant un meilleur model de caméra, ce qui nous permettra de naviguer plus aisément dans notre espace 3D.
Voici quelques liens utiles:
Site de Ignigo Quillez: www.iquilezles.org/
Sa chaîne KZread: www.youtube.com/watch?v=8--5L...
Explications par Jamie Wong: jamie-wong.com/2016/07/15/ray-...
Revisez vos maths:
Algèbre linéaire (vecteurs/matrices): kzread.info?list...
Calcul infinitésimale (dérivées, intégrales): kzread.info?list...

Пікірлер: 7

  • @antoinep9949
    @antoinep99492 жыл бұрын

    impressionnant

  • @leeroyd5982
    @leeroyd59823 жыл бұрын

    Super boulot

  • @paul-alexandreluck824
    @paul-alexandreluck8243 жыл бұрын

    Hello, y-a-t-il le source de ce shader de base ?

  • @paul-alexandreluck824
    @paul-alexandreluck8243 жыл бұрын

    Comment mettre un matériel sur une primitive : specular, diffuse, bump, normal ,* ?

  • @sociamix

    @sociamix

    3 жыл бұрын

    On va y venir :)

  • @paul-alexandreluck824

    @paul-alexandreluck824

    3 жыл бұрын

    @@sociamix OK Merci c'est super de voir les fondamentaux.. Bonne continuation...

  • @paul-alexandreluck824
    @paul-alexandreluck8243 жыл бұрын

    J'ai réécrit ton script pour l'adapter à l'IDF isf.video/ afin de jouer avec les paramètres de la scéne. (les 2 objets 1 et 2 par défaut sont fusionnes, même taille et position) Mais je ne vois sur quel paramètre agir pour déterminer la focale (petit ou grand angle de ma caméra). /*{ "CREDIT": "by PALUCK", "CATEGORIES" : [ "rayMarching de SOCIAMIX" ], "DESCRIPTION" : "", "INPUTS" : [ { "NAME" : "rLigth", "TYPE" : "float", "DEFAULT" : 0.0, "MIN" : -2, "MAX" : 2 }, { "NAME" : "hLigth", "TYPE" : "float", "DEFAULT" : 2.0, "MIN" : 0, "MAX" : 10 }, { "NAME" : "rayon1", "TYPE" : "float", "DEFAULT" : 0.5, "MIN" : 0, "MAX" : 1 }, { "NAME" : "rayon2", "TYPE" : "float", "DEFAULT" : 0.5, "MIN" : 0, "MAX" : 1 }, { "NAME" : "x1", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -2, "MAX" : 2 }, { "NAME" : "y1", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -10, "MAX" : 10 }, { "NAME" : "z1", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -10, "MAX" : 10 }, { "NAME" : "x2", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -2, "MAX" : 2 }, { "NAME" : "y2", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -10, "MAX" : 10 }, { "NAME" : "z2", "TYPE" : "float", "DEFAULT" : 0, "MIN" : -10, "MAX" : 10 }, { "NAME" : "rCam", "TYPE" : "float", "DEFAULT" : 0.0, "MIN" : -2, "MAX" : 2 }, { "NAME" : "yCam", "TYPE" : "float", "DEFAULT" : 0, "MIN" : 0, "MAX" : 10 }, { "NAME" : "zCam", "TYPE" : "float", "DEFAULT" : -4.0, "MIN" : -10, "MAX" : 0 }, { "NAME" : "color1", "TYPE" : "color", "DEFAULT" : [ 0.0, 0.0, 1.0, 1.0 ] }, { "NAME" : "color2", "TYPE" : "color", "DEFAULT" : [ 1.0, 0.0, 0.0, 1.0 ] }, { "NAME" : "colorSol", "TYPE" : "color", "DEFAULT" : [ 0.0, 1.0, 0.0, 1.0 ] }, { "NAME" : "ambiance", "TYPE" : "color", "DEFAULT" : [ 0.0, 0.0, 0.0, 1.0 ] }, { "NAME" : "fond", "TYPE" : "color", "DEFAULT" : [ 0.5, 0.5, 0.5, 1.0 ] } ] } */ #define STEPS 100 #define PI 3.14159265 uniform vec2 resolution; //uniform vec2 mouse; uniform float time; vec2 dPlane(vec3 p, float h, float i) { return vec2(i, p.y - h); } vec2 dSphere (vec3 p, float r, float i) { return vec2(i,length(p) - r); } vec2 minVec2(vec2 a, vec2 b) { return a.y } vec2 scene (vec3 p) { vec2 dp = dPlane(p, -0.5, 0.0); vec2 ds1 = dSphere(p - vec3(x1,y1,z1) , rayon1, 1.0) ; vec2 ds2 = dSphere(p - vec3(x2,y2,z2) , rayon2, 2.0) ; return minVec2(dp, minVec2(ds1, ds2)); } vec2 march(vec3 rO, vec3 rD) { vec3 cP = rO; float d = 0.0; vec2 s = vec2(0.0); for (int i = 0; i cP = rO + rD * d; s = scene (cP); d += s.y; if(s.y break; } if (d > 20.0) { return vec2(100.0,100.0); } } s.y = d; return s; } vec3 normal(vec3 p) { float dP =scene(p).y; float eps = 0.01; float dX = scene(p + vec3(eps,0.0,0.0)).y - dP; float dY = scene(p + vec3(0.0,eps,0.0)).y - dP; float dZ = scene(p + vec3(0.0,0.0,eps)).y - dP; return normalize(vec3(dX,dY,dZ)); } float lighting(vec3 p, vec3 n){ vec3 lP = vec3(cos((rLigth -0.5) * PI),hLigth,sin((rLigth + 0.5) * PI)); vec3 lD = lP - p; vec3 lN = normalize(lD); if(march(p + n * 0.01, lN).y return 0.0; return max(0.0,dot(n,lN)); } vec4 material(float i){ if (i return vec4(colorSol.rgba); } else if (i return vec4(color1.rgba); } else if (i return vec4(color2.rgba); } return vec4(fond.rgba); } void main() { vec2 uv = (vec2(isf_FragNormCoord.x,isf_FragNormCoord.y) - 0.5); // vec3 rO = vec3(0.0, mouse, 0.0); // vec3 rD = normalize(vec3(uv.x, uv.y, zCam) - rO); vec3 rO = vec3(cos((rCam - 0.5) * PI) * zCam,yCam,sin((rCam + 0.5) * PI) * zCam); // vec3 rO = vec3(xCam,yCam,zCam); vec3 target = vec3(0.0,0.0,0.0); vec3 fwd = normalize(target - rO); vec3 side = normalize(cross(vec3(0.0,1.0,0.0), fwd)); vec3 up = cross(fwd, side); vec3 rD = normalize(fwd + side * uv.x + up * uv.y); vec2 s = march(rO, rD); float d = s.y; vec4 col = material(s.x); if(d vec3 p = rO + rD * d; vec3 nor = normal(p); float l = lighting(p, nor); vec4 a = vec4(ambiance.rgba); col = col * (a + l); col = pow(col,vec4(0.4545)); } gl_FragColor = vec4(col.rgba); /* gl_FragColor = vec4( uv.x,uv.y,0.0, 1.0); if(length(uv) {gl_FragColor = vec4( 1.0,1.0,0.0, 1.0 );} */ }