Paolo Posted February 12, 2003 Share Posted February 12, 2003 I'm using vector data type for my studies on a 3D tree generation tool I already published, as a first release, at www.VectorDepot.com, plugins section. What I need is a function to rotate vectors in 3D space (same as the Rotate3D for 3D objects). Example: code: Function Vec3DRot(v: Vector; XRot, YRot, ZRot: Real):Vector; [/code] I do not know if VW10 has something like this on the vector data type function set, I'm using VW9.5 that has a poor set of functions about vectors. Thank you in advance for help. Quote Link to comment
MullinRJ Posted February 13, 2003 Share Posted February 13, 2003 Paolo, Can you describe how you want your function to work? In my limited understanding of 3D vector math, I do know that the order of rotations affects the orientation of the result. For example, rotate X 90?, rotate Y 90?, rotate Z 90? yields a different result than, rotate Y 90?, rotate Z 90?, rotate X 90?. In the case of the VS command, Rotate3D, the axes are rotated in XYZ order. Raymond Quote Link to comment
Paolo Posted February 13, 2003 Author Share Posted February 13, 2003 The order of rotation MUST respect the VW convention of XYZ order and because vectors are substantially 3D points (the vector starts from 0,0,0 and goes to that point), the rotation has to have the origin (0,0,0) as pivot. Quote Link to comment
MullinRJ Posted February 15, 2003 Share Posted February 15, 2003 Paolo, After overthinking the problem a bit, I finally realized it wasn't all that complicated. Here is my distilled version: code: function VecRot3D(V :Vector; RotX, RotY, RotZ :Real) :Vector; { Rotate a 3D vector by the amount specified in each axis. Rotation is in degrees. } { 14 February 2003 - Raymond Mullin } Var U :Vector; procedure PartialRot(var X, Y :Real; Ang :Real); var W : Vector; Begin W[1] := X; W[2] := Y; W[3] := 0; W := Ang2Vec(Vec2Ang(W)+Ang, Norm(W)); X := W[1]; Y := W[2]; End; { PartialRot } Begin U := V; PartialRot(U[2], U[3], RotX); PartialRot(U[3], U[1], RotY); PartialRot(U[1], U[2], RotZ); VecRot3D := U; End; { VecRot3D }[/code] Best wishes, Raymond Quote Link to comment
Paolo Posted February 17, 2003 Author Share Posted February 17, 2003 Thank you Raymond, I solved the problem also using matrices. Thanks to Dr. Math http://mathforum.org/dr.math/ Description: Given a vector and the three rotation angles (on x, y, z), the result is a new vector corresponding to the first vector rotated. The resulting function is as follows: code: function Vec3DRot(v1:Vector;xRot,yRot,zRot:real):vector; var m : array[1..3,1..3] of real; {matrice of transformation} c,s : real; {cosine and sine variables} vt,v2 : vector; {temporary vectors used in calculations} begin vt := v1; {********** X rotation **********} c := cos(deg2rad(xRot)); s := sin(deg2rad(xRot)); m[1,1] := 1; m[2,1] := 0; m[3,1] := 0; m[1,2] := 0; m[2,2] := c; m[3,2] :=-s; m[1,3] := 0; m[2,3] := s; m[3,3] := c; {rotation} v2.x := vt.x * m[1,1] + vt.y * m[2,1] + vt.z * m[3,1]; v2.y := vt.x * m[1,2] + vt.y * m[2,2] + vt.z * m[3,2]; v2.z := vt.x * m[1,3] + vt.y * m[2,3] + vt.z * m[3,3]; {************************************} vt := v2; {********** Y rotation **********} c := cos(deg2rad(yRot)); s := sin(deg2rad(yRot)); m[1,1] := c; m[2,1] := 0; m[3,1] := s; m[1,2] := 0; m[2,2] := 1; m[3,2] := 0; m[1,3] :=-s; m[2,3] := 0; m[3,3] := c; {rotation} v2.x := vt.x * m[1,1] + vt.y * m[2,1] + vt.z * m[3,1]; v2.y := vt.x * m[1,2] + vt.y * m[2,2] + vt.z * m[3,2]; v2.z := vt.x * m[1,3] + vt.y * m[2,3] + vt.z * m[3,3]; {************************************} vt := v2; {********** Z rotation **********} c := cos(deg2rad(zRot)); s := sin(deg2rad(zRot)); m[1,1] := c; m[2,1] :=-s; m[3,1] := 0; m[1,2] := s; m[2,2] := c; m[3,2] := 0; m[1,3] := 0; m[2,3] := 0; m[3,3] := 1; {rotation} v2.x := vt.x * m[1,1] + vt.y * m[2,1] + vt.z * m[3,1]; v2.y := vt.x * m[1,2] + vt.y * m[2,2] + vt.z * m[3,2]; v2.z := vt.x * m[1,3] + vt.y * m[2,3] + vt.z * m[3,3]; {************************************} Vec3DRot := v2; {the resulting vector} end;[/code] Quote Link to comment
Paolo Posted February 17, 2003 Author Share Posted February 17, 2003 By the way, for whom interested in 3d tree vectorscript tool, I made a mistake on the vectordepot link. Follow this link: http://www.VectorDepot.com/PlugIns1.shtml I'm working on a new, faster and more natural version. Next to come. Ciao Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.