Abbildungsmatrix einer Projektion aus dem dreidimensionalen Raum auf eine Bildebene P
Allgemeiner Fall Dreipunktperspektive (Horizont waagrecht u1:u2=z1:z2)
> | restart;with(linalg):with(plots): |
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
> | Z:=vector([z0,z1,z2,z3]); |
> | Eb:=vector([u0,u1,u2,u3]); |
> | X:=vector([x0,x1,x2,x3]); |
> | P:=matrix(4,4,[u1*z1+u2*z2+u3*z3,-u1*z0,-u2*z0,-u3*z0,-u0*z1,u0*z0+u2*z2+u3*z3,-u2*z1,-u3*z1,-u0*z2,-u1*z2,u1*z1+u0*z0+u3*z3,-u3*z2,-u0*z3,-u1*z3,-u2*z3,u1*z1+u2*z2+u0*z0]); |
> | rank(P);det(P); |
Berechnung der beiden Transformationsmatrizen, die die Bildtrafo bringen (auf das Koordinatensystem der Zeichenebene bzw. des Computerbildschirmes).
> | t[3]:=vector([u1,u2,u3]); |
> | nt3:=sqrt(u1^2+u2^2+u3^2); |
> | tn[3]:=evalm(t[3]*1/nt3); |
> | vw:=col(P,4); |
> | v:=vector([vw[2],vw[3],vw[4]]); |
> | uTz:=evalm(transpose(Eb)&*Z); |
> | t:=scalarmul(-vector([Z[2],Z[3],Z[4]]),u0/(u1*z1+u2*z2+u3*z3)); |
> | vs:=evalm(scalarmul(-v,1/(u3*z0))-t); |
> | tn[2]:=map(simplify,evalm(vs*1/(sqrt(vs[1]^2+vs[2]^2+vs[3]^2)))): |
> | tn[1]:=map(simplify,crossprod(tn[2],tn[3])): |
> | TI:=matrix(4,4,[1,0,0,0,evalm(-transpose(tn[1])&*t),tn[1][1],tn[1][2],tn[1][3],evalm(-transpose(tn[2])&*t),tn[2][1],tn[2][2],tn[2][3],evalm(-transpose(tn[3])&*t),tn[3][1],tn[3][2],tn[3][3]]): |
> | map(simplify,TI): |
> | M:=map(simplify,evalm(TI&*P)): |
> |
> |
Beispiel:
> | u0:=-5;u1:=3;u2:=-2;u3:=-2;z0:=1;z1:=3;z2:=-2;z3:=1; |
> | M:=map(simplify,evalm(TI&*P)):MB:=map(simplify,op(M)): |
Wir berechnen und plotten das Bild des Einheitswürfels (A,B,D,C,E,F,G,H)
> | A:=vector([1,1,1,0]);B:=vector([1,-1,1,0]);C:=vector([1,-1,-1,0]);Dd:=vector([1,1,-1,0]);E:=vector([1,1,1,2]);F:=vector([1,-1,1,2]);G:=vector([1,-1,-1,2]);H:=vector([1,1,-1,2]);Fx:=vector([0,1,0,0]);Fy:=vector([0,0,1,0]);Fz:=vector([0,0,0,1]); |
> | Ap:=evalm(MB&*A):Bp:=evalm(MB&*B);Cp:=evalm(MB&*C);Dp:=evalm(MB&*Dd);Ep:=evalm(MB&*E);Fp:=evalm(MB&*F);Gp:=evalm(MB&*G);Hp:=evalm(MB&*H);Fxp:=evalm(MB&*Fx);Fyp:=evalm(MB&*Fy);Fzp:=evalm(MB&*Fz); |
> | Wuerfel:=plot([[Ap[2]/Ap[1],Ap[3]/Ap[1]],[Bp[2]/Bp[1],Bp[3]/Bp[1]],[Cp[2]/Cp[1],Cp[3]/Cp[1]],[Dp[2]/Dp[1],Dp[3]/Dp[1]],[Ap[2]/Ap[1],Ap[3]/Ap[1]],[Ep[2]/Ep[1],Ep[3]/Ep[1]],[Fp[2]/Fp[1],Fp[3]/Fp[1]],[Gp[2]/Gp[1],Gp[3]/Gp[1]],[Hp[2]/Hp[1],Hp[3]/Hp[1]],[Ep[2]/Ep[1],Ep[3]/Ep[1]]],style=line,color=black,thickness=3): |
> | Wuerfel1:=plot([[Bp[2]/Bp[1],Bp[3]/Bp[1]],[Fp[2]/Fp[1],Fp[3]/Fp[1]]],style=line,color=black,thickness=3): |
> | Wuerfel2:=plot([[Cp[2]/Cp[1],Cp[3]/Cp[1]],[Gp[2]/Gp[1],Gp[3]/Gp[1]]],style=line,color=black,thickness=3): |
> | Wuerfel3:=plot([[Dp[2]/Dp[1],Dp[3]/Dp[1]],[Hp[2]/Hp[1],Hp[3]/Hp[1]]],style=line,color=black,thickness=3): |
> | Fernp:=plot([[Fxp[2]/Fxp[1],Fxp[3]/Fxp[1]],[Fyp[2]/Fyp[1],Fyp[3]/Fyp[1]],[Fzp[2]/Fzp[1],Fzp[3]/Fzp[1]]],style=point,color=black): |
> | display(Wuerfel,Wuerfel1,Wuerfel2,Wuerfel3,Fernp); |
> |