lost once more in the world of rotations

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

Recommended Posts

Since my first attempt at creating a turret (http://community.secondlife.com/t5/LSL-Scripting/Lost-in-the-world-of-rotations/td-p/1666849) I've come across another turret script that I've been attempting to modify for my tank, however I've been having problems getting it to follow both the Z and Y axis at the same time, when I turn the turret and increase the elevation - it will return to zero rotation then will elevate up along the y axis before returning to zero rotation then back to its location along the Z axis.

Here is the script -

rotation old_rot;
key pilot;
vector calculate_rot;
float scan_delay = .01;
float max_roty=8;
float max_rotz=8;

rotateToz(float angle)
{

rotation new_rotz = llEuler2Rot(<0,0,angle>);
float aim_change=llFabs(llAngleBetween(old_rot,new_rotz));
if(aim_change > max_rotz)
{
calculate_rot = llRot2Euler(llEuler2Rot(<0,0,angle>)/old_rot);
if(calculate_rot.z > max_rotz) calculate_rot.z=max_rotz;
else calculate_rot.z=-max_rotz;
old_rot = llEuler2Rot(calculate_rot)*old_rot;
}
else{
old_rot = new_rotz;}
llSetLocalRot(new_rotz);
}

rotateToy(float angle)
{
rotation new_roty = llEuler2Rot(<0,angle,0>);
float aim_change=llFabs(llAngleBetween(old_rot,new_roty));
if(aim_change > max_roty)
{
calculate_rot = llRot2Euler(llEuler2Rot(<0,angle,0>)/old_rot);
if(calculate_rot.y > max_roty) calculate_rot.y=max_roty;
else calculate_rot.y=-max_roty;
old_rot = llEuler2Rot(calculate_rot)*old_rot;

}
else{
old_rot = new_roty;
}
llSetLocalRot(new_roty);
}

default
{

on_rez(integer t)
{
llResetScript();
}

link_message(integer sender, integer channel, string message, key id)
{
if(message=="seated")
{
pilot = id;
if(channel)
{
llSetTimerEvent(scan_delay);
}else
{
llSetTimerEvent(0);

}
}
}

timer()
{
llSetTimerEvent(0);
integer info = llGetAgentInfo(pilot);
if((info & AGENT_MOUSELOOK) && (info & AGENT_SITTING))
{
llSensor("", pilot, AGENT, 10.0, TWO_PI);
}else
{
llSetTimerEvent(scan_delay);
}
}

sensor(integer num_detected)
{
llSetTimerEvent(0);
{
vector compensated = llRot2Euler(llGetRootRotation() / llDetectedRot(0));
rotateToy(compensated.y * -1);
rotateToz(compensated.z * -1);
llSetTimerEvent(scan_delay);
}
}

}

Now I suspect this part here is the problem

{
vector compensated = llRot2Euler(llGetRootRotation() / llDetectedRot(0));
rotateToy(compensated.y * -1);
rotateToz(compensated.z * -1);
llSetTimerEvent(scan_delay);
}

But however I am a bit unsure as my abilities with second life script leaves a -lot- to be desired.

Any help would be appreciated.

Share on other sites

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