ubOde mouse look steer with some MOUSELOOK_BANK action

LSLKeyTest
UbitUmarov 2016-08-29 16:22:16 +01:00
parent d96c05a121
commit 155a861a4f
1 changed files with 51 additions and 18 deletions

View File

@ -799,12 +799,24 @@ namespace OpenSim.Region.PhysicsModule.ubOde
float ldampZ = 0;
bool mousemode = false;
if((m_flags & (VehicleFlag.MOUSELOOK_STEER |VehicleFlag.MOUSELOOK_BANK)) != 0 )
mousemode = true;
bool mousemodebank = false;
float bankingEfficiency;
if(mousemode)
bankingEfficiency = 0;
float verticalAttractionTimescale = m_verticalAttractionTimescale;
if((m_flags & (VehicleFlag.MOUSELOOK_STEER | VehicleFlag.MOUSELOOK_BANK)) != 0 )
{
mousemode = true;
mousemodebank = (m_flags & VehicleFlag.MOUSELOOK_BANK) != 0;
if(mousemodebank)
{
bankingEfficiency = m_bankingEfficiency;
if(verticalAttractionTimescale < 149.9)
verticalAttractionTimescale *= 2.0f; // reduce current instability
}
else
bankingEfficiency = 0;
}
else
bankingEfficiency = m_bankingEfficiency;
@ -944,12 +956,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde
}
// vertical atractor
if (m_verticalAttractionTimescale < 300)
if (verticalAttractionTimescale < 300)
{
float roll;
float pitch;
float ftmp = m_invtimestep / m_verticalAttractionTimescale / m_verticalAttractionTimescale;
float ftmp = m_invtimestep / verticalAttractionTimescale / verticalAttractionTimescale;
float ftmp2;
ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep;
@ -1039,36 +1051,57 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{
Vector3 dirv = cam.CameraAtAxis * irotq;
float invamts = 1.0f/m_angularMotorTimescale;
float tmp;
if(Math.Abs(dirv.X) > 0.01f)
// get out x == 0 plane
if(Math.Abs(dirv.X) < 0.001f)
dirv.X = 0001f;
if (Math.Abs(dirv.Z) > 0.01)
{
if (Math.Abs(dirv.Z) > 0.01)
tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y;
if(tmp < -4f)
tmp = -4f;
else if(tmp > 4f)
tmp = 4f;
torque.Y += (tmp - curLocalAngVel.Y) * invamts;
torque.Y -= curLocalAngVel.Y * m_amdampY;
}
else
torque.Y -= curLocalAngVel.Y * m_invtimestep;
if (Math.Abs(dirv.Y) > 0.01)
{
if(mousemodebank)
{
tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y;
tmp = -(float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.X;
if(tmp < -4f)
tmp = -4f;
else if(tmp > 4f)
tmp = 4f;
torque.Y += (tmp - curLocalAngVel.Y) / m_angularMotorTimescale;
torque.X += (tmp - curLocalAngVel.X) * invamts;
}
if (Math.Abs(dirv.Y) > 0.01)
else
{
tmp = (float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z;
tmp *= invamts;
if(tmp < -4f)
tmp = -4f;
else if(tmp > 4f)
tmp = 4f;
torque.Z += (tmp - curLocalAngVel.Z) / m_angularMotorTimescale;
torque.Z += (tmp - curLocalAngVel.Z) * invamts;
}
}
// angular friction
if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0)
{
torque.X -= curLocalAngVel.X * m_amdampX;
torque.Y -= curLocalAngVel.Y * m_amdampY;
torque.Z -= curLocalAngVel.Z * m_amdampZ;
}
else
{
if(mousemodebank)
torque.X -= curLocalAngVel.X * m_invtimestep;
else
torque.Z -= curLocalAngVel.Z * m_invtimestep;
}
}
else
{