|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Hi All,
I want to rotate an object. I couls use the rotate command but this function
is defined by the use of angles. Instead, I want to use units vectors that
describe the orientation.
knowing the orientation vector of my object (for example i = <1,0,0>), I
want to rotate this object such that the new orientation is, let's say, u =
<0,1,0>.
The code below creates a cylinder, coloured half blue and half red.
then I use a macro to rotate it. for that, I calculate the three Euler
angles and then use the command matrix to perform the three rotations for
each dimension x, y and z.
Problem : it doesn't work properly. For example, the transformation:
<1,0,0>) --> <0,1,0> doesn't work at all, but
<1,0,0>) --> <0,0,1> does !!
I Don't understand what is wrong ? (the angles calculation ?, the rotation
matrixes ? me ?). Can someone crack this ? Or has someone has a better
solution ?
Cheers
David
#declare MyObject = union{
cylinder{<0,0,0>,<3,0,0>,0.5 open texture { pigment { color 0,0,1>
}}}
cylinder{<3,0,0>,<6,0,0>,0.5 open texture { pigment { color<1,0,0>
}}}
}
object{
MyObject
align(<1,0,0>,<0,1,0>)
}
//=================================================
#macro align(i_vector,u_vector)
#local i_x = vdot( x, i_vector );
#local i_y = vdot( y, i_vector );
#local i_z = vdot( z, i_vector );
#local u_x = vdot( x, u_vector );
#local u_y = vdot( y, u_vector );
#local u_z = vdot( z, u_vector );
#local angl_z =
acos((u_x*i_x+u_y*i_y)/(sqrt(u_x*u_x+u_y*u_y)*sqrt(i_x*i_x+i_y*i_y)));
#local angl_y =
acos((u_x*i_x+u_z*i_z)/(sqrt(u_x*u_x+u_z*u_z)*sqrt(i_x*i_x+i_z*i_z)));
#local angl_x =
acos((u_y*i_y+u_z*i_z)/(sqrt(u_y*u_y+u_z*u_z)*sqrt(i_y*i_y+i_z*i_z)));
matrix< 1,0,0,
0,cos(angl_x),sin(angl_x),
0,-sin(angl_x),cos(angl_x),
0,0,0 >
matrix< cos(angl_y),0,-sin(angl_y),
0,1,0,
sin(angl_y),0,cos(angl_y),
0,0,0 >
matrix< cos(angl_z),sin(angl_z),0,
-sin(angl_z),cos(angl_z),0,
0,0,1,
0,0,0 >
#end
Post a reply to this message
|
|
| |
| |
|
|
From: Zeger Knaepen
Subject: Re: rotation of an object using orientation vectors ?
Date: 17 Jun 2006 14:08:12
Message: <4494450c$1@news.povray.org>
|
|
|
| |
| |
|
|
why don't you use Reorient_Trans(Axis1, Axis2) or Point_At_Trans(YAxis)
?
cu!
--
#macro G(b,e)b+(e-b)*C/50#end#macro _(b,e,k,l)#local C=0;#while(C<50)
sphere{G(b,e)+3*z.1pigment{rgb G(k,l)}finish{ambient 1}}#local C=C+1;
#end#end _(y-x,y,x,x+y)_(y,-x-y,x+y,y)_(-x-y,-y,y,y+z)_(-y,y,y+z,x+y)
_(0x+y.5+y/2x)_(0x-y.5+y/2x) // ZK http://www.povplace.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
If you are given three orthogonal unit vectors, or two from which the third
would be their cross product, describing the orientation of the rotated
object, those vectors *are* the columns (or rows?) of the rotation matrix
you want. If i understand the question correctly, this is what you're
looking for.
Suppose you start with <1,0,0>, <0,1,0>, and <0,0,1> vectors glued onto
your object, and your object rotates so that now you have vectors U,V,W.
then the matrix to perform that rotation would be
matrix< U[0], U[1], U[2],
V[0], V[1], V[2],
W[0], W[1], W[2],
0, 0, 0>
(or maybe the transpose; i just had a Mike's Hard Lemonade, got tipsy. i'm
never sure of anything anyway...)
Note that you need at least two unit vectors stuck to your object. Only one
would lead to ambiguity, allowing an axis of rotation about which the
object isn't nailed down.
Does this answer the question?
DSW
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"darenw" <Gre### [at] comcastnet> wrote:
> matrix< U[0], U[1], U[2],
> V[0], V[1], V[2],
> W[0], W[1], W[2],
> 0, 0, 0>
>
Duh! I meant U.x, U.y, U.z and so on, not anything with square brackets.
I hop too often between C++, ruby, IDL and povray.
Embarrassed,
DSW.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Thanks guys...I'll try this out and come back here to post the results...
Have been very busy these days so I am sorry I didn't reply earlier than
that
Cheers !
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|