lundi 30 décembre 2013

Dessiner l’ombre d’un objet avec pst-solides3d

La source de lumière étant ponctuelle, il est simple avec pst-solides3d, de dessiner l’ombre portée d’un objet sur un plan, horizontal(le sol) ou vertical (un mur).

Ombres sur un sol horizontal
Pour que l’ombre de l’objet soit visible, il faut que les coordonnées de la source de lumière et du point de vue soient différentes.

Ombres sur un mur vertical
Les explications théoriques et les macros sont dans le document "ombre1.pdf" (fichier source : ombre1.tex) du répertoire :

 Les fichiers de données de la tête de Néfertiti sont inclus dans ce répertoire.

Le listing du fichier :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{pst-solides3d}
\title{Dessiner l'ombre d'un objet avec pst-solides3d}
\date{29 décembre 2013}
\begin{document}
\maketitle

La source de lumière étant ponctuelle, il est simple avec pst-solides3d, de dessiner l'ombre portée d'un objet sur un plan, horizontal(le sol) ou vertical (un mur). Ce court document décrit une méthode pour le faire.
\section{Ombre sur un sol horizontal}
\begin{center}
\psset{viewpoint=100 30 30 rtp2xyz,Decran=30,lightsrc=20 120 30 rtp2xyz,a=4}%
\begin{pspicture}(-5,-4)(5,3)
\pstVerb{
20 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -2 def
/Hshadow {
5 dict begin
/M defpoint3d
 M
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},action=draw,
         base=-15 15 -15 15,
         ngrid=5 5]%
\psSolid[object=cube,
         grid,fillcolor=black,
         transform=Hshadow,
         ](0,0,0)%
\psSolid[object=cube](0,0,0)%
% la source de lumière
\pstVerb{20 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
%Un sommet du cube
\psPoint(2,2,2){A}
\psPoint(-2,-2,2){B}
\psPoint(2,-2,2){C}
\pcline[nodesepB=4cm]{->}(L)(A)
\pcline[nodesepB=4cm]{->}(L)(B)
\pcline[nodesepB=5cm]{->}(L)(C)
\psline{->}(L)(A)\psline{->}(L)(B)\psline{->}(L)(C)
\pstVerb{2 2 2 Hshadow /zA' exch def /yA' exch def /xA' exch def}%
\psPoint(xA',yA',zA'){A'}
\pstVerb{-2 -2 2 Hshadow /zB' exch def /yB' exch def /xB' exch def}%
\psPoint(xB',yB',zB'){B'}
\pstVerb{2 -2 2 Hshadow /zC' exch def /yC' exch def /xC' exch def}%
\psPoint(xC',yC',zC'){C'}
\psline[linecolor=gray!20](A)(A')
\psline[linecolor=gray!20](B)(B')
\psline[linecolor=gray!20](C)(C')
\uput[r](L){L}
\uput[u](A){A}
\uput[d](A'){A'}
\end{pspicture}
\end{center}
Connaissant les coordonnées de la source de lumière $(x_L,y_L,z_L)$, celles du point à projeter, par exemple un sommet du cube $(x_A,y_A,z_A)$ et l'équation du plan $(z=h$, on en déduit les coordonnées de l'ombre portée du sommet sur le plan horizontal :
\[
\left\{
\begin{array}[m]{l}
x'=x_V+\lambda(x_A-x_V)\\
y'=y_V+\lambda(y_A-y_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{h-z_V}{z_A-z_V}
\]
Pour que l'ombre de l'objet soit visible, il faut que les coordonnées de la source de lumière et du point de vue soient différentes. On utilise l'option \texttt{trasform=Hshadow} de pst-solides3d après avoir défini la transformation \texttt{Hshadow} :
\begin{verbatim}
\psset{viewpoint=100 60 30 rtp2xyz,Decran=50,lightsrc=100 120 30 rtp2xyz,a=2}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -1 def % position du plan horizontal (le sol)
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\end{verbatim}
\newpage
Quelques exemples, la source de lumière n'est pas toujours représentée. On dessine d'abord le plan de projection, puis l'ombre et enfin l'objet.

%\begin{center}
\begin{minipage}{9cm}
\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=100 60 30 rtp2xyz,Decran=40,lightsrc=100 120 30 rtp2xyz,a=4}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -2 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         grid,fillcolor=gray,linecolor=gray,
         transform=Hshadow,
%         opacity=0.9
         ](0,0,0)%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         fcol=6 1 13 { (rouge) } for,
         ](0,0,0)%
\end{pspicture}
\end{minipage}
\begin{minipage}{6cm}
\begin{verbatim}
\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=100 60 30 rtp2xyz,Decran=50,lightsrc=100 120 30 rtp2xyz,a=2}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -1 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         grid,fillcolor=gray,linecolor=gray,
         transform=Hshadow,
         opacity=0.9
         ](0,0,0)%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         fcol=6 1 13 { (rouge) } for,
         ](0,0,0)%
\end{pspicture}
\end{verbatim}
\end{minipage}
%\end{center}

\begin{center}
\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=20 120 60 rtp2xyz}%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
20 120 60 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,linecolor=black,
         transform=Hshadow,
         opacity=0.9,
         ngrid=18 18,
         ](0,0,2)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,2)%
\pstVerb{20 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot(L)
\end{pspicture}

\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=50 20 30 rtp2xyz}%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
50 20 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
%         linewidth=0.001,
         ngrid=18 18,
%         opacity=0.95,
%         strokeopacity=0.95
         ](0,0,2)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,2)%
\end{pspicture}

\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
50 20 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cylindre,r=2,h=6,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
%         linewidth=0.001,
         ngrid=1 36,
%         opacity=0.95,
%         strokeopacity=0.95
         ](5,0,0)%
\psSolid[object=cylindre,h=6,
         ngrid=1 36
         ](5,0,0)%
\end{pspicture}

\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=50 60 5 rtp2xyz,Decran=25,lightsrc=10 120 30 rtp2xyz}%
\psframe(-5,-5)(5,5)
\pstVerb{
10 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -4 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[r1=2.5,r0=1.5,
         object=tore,
         ngrid=18 36,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
         ngrid=1 36,
         ](0,0,0)%
\psSolid[r1=2.5,r0=1.5,
         object=tore,
         ngrid=18 36
         ](0,0,0)%
\pstVerb{10 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot[linecolor=red](L)
\end{pspicture}
\end{center}
\newpage
\section{Ombre sur un mur vertical}
Mur parallèle au plan $Oyz$ : $x=x_0$. Les équations précédentes s'écrivent :
\[
\left\{
\begin{array}[m]{l}
y'=y_V+\lambda(y_A-y_V)\\
z'=z_V+\lambda(z_A-z_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{x_0-x_V}{x_A-x_V}
\]
\begin{center}
\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=10 0 20 rtp2xyz}%
\begin{pspicture}(-5,-6)(5,7)
\psframe(-5,-6)(5,7)
\pstVerb{
10 0 20 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/x_0 -8 def
/Vshadow {
4 dict begin
/z exch def
/y exch def
/x exch def
/lambda x_0 xV sub x xV sub div def
    x_0
    yV lambda y yV sub mul add % y
    zV lambda z zV sub mul add % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[1 0 0 x_0 neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,linecolor=black,
         transform=Vshadow,
         ngrid=18 18,
         ](0,0,0)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,0)%
\pstVerb{10 0 20 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot[linecolor=red](L)
\end{pspicture}
\end{center}
\newpage
Mur parallèle au plan $Oxz$ : $y=y_0$. Les équations précédentes s'écrivent :
\[
\left\{
\begin{array}[m]{l}
x'=x_V+\lambda(x_A-x_V)\\
z'=z_V+\lambda(z_A-z_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{y_0-y_V}{y_A-y_V}
\]
\begin{center}
%\psset{unit=0.4}
\psset{viewpoint=50 60 0 rtp2xyz,Decran=25,lightsrc=50 100 -10 rtp2xyz}
\begin{pspicture}(-5,-7)(6,6)
\definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84}
\definecolor{rose}{rgb}{1,0.75,0.74}
\psframe*[linecolor=AntiqueWhite](-7,-7)(6,6)
\pstVerb{
50 100 -10 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/y_0 -8 def
/Vshadow {
4 dict begin
/z exch def
/y exch def
/x exch def
/lambda y_0 yV sub y yV sub div def
    xV lambda x xV sub mul add % x
    y_0
    zV lambda z zV sub mul add % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 1 0 y_0 neg]},
         base=-10 10 -10 15,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psset{RotX=90,RotZ=90,sommets= (sommets_nefer0.dat) run}
\psSolid[object=new,hollow,
         grid,fillcolor=black,linecolor=black,incolor=black,
         transform=Vshadow,
         faces={(faces_nefer.dat) run}
         ](0,0,0)%
\psSolid[object=new,fillcolor=rose,linewidth=0.5\pslinewidth,hollow,incolor=yellow!50,
    faces={(faces_nefer.dat) run}]%
\psSolid[object=new,fillcolor=red,linewidth=0.5\pslinewidth,
    faces={(faces_nefer_levres.dat) run}]%
\psSolid[object=new,fillcolor=black,
    faces={(faces_nefer_sourcils.dat) run}]%
\end{pspicture}
\end{center}
\end{document}


Aucun commentaire:

Enregistrer un commentaire