Jump to content

Not Quite Right Rotation


Selphie Wirefly
 Share

You are about to reply to a thread that has been inactive for 1152 days.

Please take a moment to consider if this thread is worth bumping.

Recommended Posts

So, I've read quite a bit but it seems like I am not quite getting how to work with rotations.  The script below basically creates a (useless) moving object.  Everything mostly works except the rotation isn't quite right.  Basically, when it runs, one cube, will "roll" around a second linked root prim cube in a sort of stepping motion. 

It moves around fine, it even rotates in the expected direction, except it rolls 180 degrees every step, when it should only roll 90 degrees.  For example, I've textured it with a Dice Texture, and it only ever shows 6 or 1 on the top face.  I've tried replacing my rotation vector set with PI/2 and 1.58xx and removing the DEG_TO_RAD and using rotation instead of vectors.   I think the main issue lies somewhere in the conversions between vectors and rotations and degrees and radians.

//Prim Positions 
vector pos = <0.00000, -.5000, 0.0>;
rotation rot = <0.00000, 0.00000, 0.0, 1.0>;

list x_range = [  0, -.5, -.5, -.5,  0, .5, .5,  .5];
list y_range = [-.5, -.5,   0,  .5, .5, .5,  0, -.5];
list rot_range = [<0, -90, 0>,<0, -90, 0>,<-90, 0, 0>,<-90, 0, 0>,<0, 90, 0>,<0, 90, 0>,<90, 0, 0>,<90, 0, 0>];
integer position;

rotation NormRot(rotation Q)
{
    float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s);
    return <Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ>;
}

prim_mover()
{
        float next_x=(float)llList2String(x_range,position);
        float next_y=(float)llList2String(y_range,position);
        
        pos = <next_x, next_y, pos.z>;
        vector rot_vector = (llList2Vector(rot_range,position)* DEG_TO_RAD);
        rotation next_rot = <rot_vector.x, rot_vector.y, rot_vector.z, 0.0>;
        rot = rot * next_rot;
        rot = NormRot(rot);
        
        llSetPrimitiveParams([
        PRIM_POS_LOCAL,pos,
        PRIM_ROT_LOCAL,rot]);

        if(position== 7)
        { position = 0;
        
         }
        else
        { position++;}
}       

default
{
    state_entry()
    {
        position = 0;
        prim_mover();
        
        llSetTimerEvent(1);
    }
    
    timer()
    {
         prim_mover();
    }
    
}

 

Link to comment
Share on other sites

You are about to reply to a thread that has been inactive for 1152 days.

Please take a moment to consider if this thread is worth bumping.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...