Operationen


In POVRAY können Entities durch die #declare - Klausel vereinbart werden. Diese Objekte werden nicht dargestellt. Sie können aber durch den vereinbarten Begriff mehrfach wiederholt werden. Obwohl das #declare dem C- #define sehr ähnlich ist, werden sie dennoch verschiedenartig benutzt. Man beachte, daß die Bezeichnung des vereinbarten Entities wiederholt werden muß. Wird eine Primitive benutzt, so muß das Wort object vorangestellt werden.



/* .................*/

#declare text1 = texture {
          pigment {
               color rgb <1, 0, 0>
          }
          finish {
               phong 0.9
          }
     }

#declare Kasten = box {
     <-0.4, -0.4, -0.4>, <0.4, 0.4, 0.4>
     texture {text1}
}

cylinder {
     <0, -2, 0>, <0, 2, 0>, 0.2
     texture {
          pigment {
               color rgb <1, 1, 0>
          }
          finish {
               phong 0.9
          }
     }
}

object {Kasten}

Da es keinen Sinn macht, einen Körper an ein und derselben Stelle zu wiederholen, muß man über ihn Operationen ausführen. Das sind die Verschiebung (translate), die Drehung (rotate) und die Skalierung (scale). Bei der Translation wird der Vektor angebenen, entlang dem der Körper verschoben werden soll. Bei der Drehung werden die Drehwinkel (im Grad-Maß) in der Reihenfolge X, Y, Z angegeben. Bei der Skalierung wird der Skalierungsfaktor in X-, Y- und Z-Richtung angegeben.


/*..............*/
#declare Kasten = box {
    <-0.4, -0.4, -0.4>, <0.4, 0.4, 0.4>
    texture {
        pigment {
            color rgb <1, 0, 0>
        }
        finish {
            phong 0.9
        }
    }
}

cylinder {
    <0, -2, 0>, <0, 2, 0>, 0.2
    texture {
        pigment {
            color rgb <1, 1, 0>
        }
        finish {
            phong 0.9
        }
    }
}

object {Kasten}
object {Kasten translate <2, 1, 0>}
object {Kasten scale <1.2, 2.0, 1.0>
	translate <-2, 1, 0>}

Die Operationen lassen sich beliebig kombinieren:


/* ............. */
#declare Kasten = box {
    <-0.4, -0.4, -0.4>, <0.4, 0.4, 0.4>
    texture {
        pigment {
            color rgb <1, 0, 0>
        }
        finish {
            phong 0.9
        }
    }
}

cylinder {
    <0, -2, 0>, <0, 2, 0>, 0.2
    texture {
        pigment {
            color rgb <1, 1, 0>
        }
        finish {
            phong 0.9
        }
    }
}

object {Kasten}
object {Kasten translate <2, 0, 0>
	rotate <0, 45, 30>}
object {Kasten scale <1.2, 2.0, 1.0>
	translate <-2, 1, 0>
	rotate <0, 45, 30>}

Achtung! Bei diesen Operationen handelt es sich um Matrix-Operationen und diese sind nicht kommutativ! Eine Verschiebung mit anschließender Drehung ...


/* ................ */
#declare L = 0.4
#declare H = 0.2
#declare B = 0.3

#declare Kasten = box {<-L, 0.1, -B>,
 	<L, 0.1 + 2 * H, B>}

object {Kasten texture {Rot}}
object {Kasten texture {Rot}
     translate <2, 0, 0>
     rotate    <0, 0, 45>
}


... führt zu einem anderen Ergebnis als eine Drehung mit anschließender Verschiebung:


/* .............. */
#declare L = 0.4
#declare H = 0.2
#declare B = 0.3

#declare Kasten = box {<-L, -H, -B>, 
		< L, H, B>}
object {Kasten texture {Rot}}
object {Kasten texture {Rot}
     rotate    <0, 0, 45>
     translate <2, 0, 0>
}