aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorUbitUmarov2015-09-30 19:14:37 +0100
committerUbitUmarov2015-09-30 19:14:37 +0100
commitf87e284ec2dc056abd44b8497d346d36642c34ba (patch)
tree4218087c607032a67041276f2568c70763b515e5
parent add high level code suport for SetHoverHeight() called from a attachment, so... (diff)
downloadopensim-SC_OLD-f87e284ec2dc056abd44b8497d346d36642c34ba.zip
opensim-SC_OLD-f87e284ec2dc056abd44b8497d346d36642c34ba.tar.gz
opensim-SC_OLD-f87e284ec2dc056abd44b8497d346d36642c34ba.tar.bz2
opensim-SC_OLD-f87e284ec2dc056abd44b8497d346d36642c34ba.tar.xz
first steps adding suport for llSetHoverHeight() called from attachments on ubOde. Sure needs work.. like sp motion control still assumes stopped and not falling state. Only very basic test on flat land done
-rw-r--r--OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs159
1 files changed, 143 insertions, 16 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
index cc37ef5..1cebacf 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
@@ -157,6 +157,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde
157 157
158 float mu; 158 float mu;
159 159
160 // HoverHeight control
161 private float m_PIDHoverHeight;
162 private float m_PIDHoverTau;
163 private bool m_useHoverPID;
164 private PIDHoverType m_PIDHoverType;
165 private float m_targetHoverHeight;
166
167
160 public OdeCharacter(uint localID, String avName, ODEScene parent_scene, Vector3 pos, Vector3 pSize, float pfeetOffset, float density, float walk_divisor, float rundivisor) 168 public OdeCharacter(uint localID, String avName, ODEScene parent_scene, Vector3 pos, Vector3 pSize, float pfeetOffset, float density, float walk_divisor, float rundivisor)
161 { 169 {
162 m_uuid = UUID.Random(); 170 m_uuid = UUID.Random();
@@ -1042,7 +1050,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1042 Vector3 vel = new Vector3(dtmp.X, dtmp.Y, dtmp.Z); 1050 Vector3 vel = new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
1043 float velLengthSquared = vel.LengthSquared(); 1051 float velLengthSquared = vel.LengthSquared();
1044 1052
1045
1046 Vector3 ctz = _target_velocity; 1053 Vector3 ctz = _target_velocity;
1047 1054
1048 float movementdivisor = 1f; 1055 float movementdivisor = 1f;
@@ -1144,6 +1151,52 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1144 } 1151 }
1145 } 1152 }
1146 1153
1154 bool hoverPIDActive = false;
1155
1156 if (m_useHoverPID && m_PIDHoverTau != 0 && m_PIDHoverHeight != 0)
1157 {
1158 hoverPIDActive = true;
1159
1160 switch (m_PIDHoverType)
1161 {
1162 case PIDHoverType.Ground:
1163 m_targetHoverHeight = terrainheight + m_PIDHoverHeight;
1164 break;
1165
1166 case PIDHoverType.GroundAndWater:
1167 float waterHeight = _parent_scene.GetWaterLevel();
1168 if (terrainheight > waterHeight)
1169 m_targetHoverHeight = terrainheight + m_PIDHoverHeight;
1170 else
1171 m_targetHoverHeight = waterHeight + m_PIDHoverHeight;
1172 break;
1173 } // end switch (m_PIDHoverType)
1174
1175 // don't go underground
1176 if (m_targetHoverHeight > terrainheight + 0.5f * (aabb.MaxZ - aabb.MinZ))
1177 {
1178 float fz = (m_targetHoverHeight - localpos.Z);
1179
1180 // if error is zero, use position control; otherwise, velocity control
1181 if (Math.Abs(fz) < 0.01f)
1182 {
1183 ctz.Z = 0;
1184 }
1185 else
1186 {
1187 _zeroFlag = false;
1188 fz /= m_PIDHoverTau;
1189
1190 float tmp = Math.Abs(fz);
1191 if (tmp > 50)
1192 fz = 50 * Math.Sign(fz);
1193 else if (tmp < 0.1)
1194 fz = 0.1f * Math.Sign(fz);
1195
1196 ctz.Z = fz;
1197 }
1198 }
1199 }
1147 1200
1148 //****************************************** 1201 //******************************************
1149 if (!m_iscolliding) 1202 if (!m_iscolliding)
@@ -1151,8 +1204,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1151 1204
1152 bool tviszero = (ctz.X == 0.0f && ctz.Y == 0.0f && ctz.Z == 0.0f); 1205 bool tviszero = (ctz.X == 0.0f && ctz.Y == 0.0f && ctz.Z == 0.0f);
1153 1206
1154
1155
1156 if (!tviszero) 1207 if (!tviszero)
1157 { 1208 {
1158 m_freemove = false; 1209 m_freemove = false;
@@ -1172,7 +1223,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1172 1223
1173 } 1224 }
1174 1225
1175
1176 if (!m_freemove) 1226 if (!m_freemove)
1177 { 1227 {
1178 1228
@@ -1262,7 +1312,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1262 } 1312 }
1263 else // ie not colliding 1313 else // ie not colliding
1264 { 1314 {
1265 if (flying) //(!m_iscolliding && flying) 1315 if (flying || hoverPIDActive) //(!m_iscolliding && flying)
1266 { 1316 {
1267 // we're in mid air suspended 1317 // we're in mid air suspended
1268 vec.X += (ctz.X - vel.X) * (PID_D); 1318 vec.X += (ctz.X - vel.X) * (PID_D);
@@ -1304,18 +1354,21 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1304 vec.Z -= .16f* m_mass * vel.Z; 1354 vec.Z -= .16f* m_mass * vel.Z;
1305 } 1355 }
1306 1356
1307 if (flying) 1357 if (flying || hoverPIDActive)
1308 { 1358 {
1309 vec.Z -= _parent_scene.gravityz * m_mass; 1359 vec.Z -= _parent_scene.gravityz * m_mass;
1310 1360
1311 //Added for auto fly height. Kitto Flora 1361 if(!hoverPIDActive)
1312 float target_altitude = _parent_scene.GetTerrainHeightAtXY(localpos.X, localpos.Y) + MinimumGroundFlightOffset;
1313
1314 if (localpos.Z < target_altitude)
1315 { 1362 {
1316 vec.Z += (target_altitude - localpos.Z) * PID_P * 5.0f; 1363 //Added for auto fly height. Kitto Flora
1364 float target_altitude = terrainheight + MinimumGroundFlightOffset;
1365
1366 if (localpos.Z < target_altitude)
1367 {
1368 vec.Z += (target_altitude - localpos.Z) * PID_P * 5.0f;
1369 }
1370 // end add Kitto Flora
1317 } 1371 }
1318 // end add Kitto Flora
1319 } 1372 }
1320 1373
1321 if (vec.IsFinite()) 1374 if (vec.IsFinite())
@@ -1418,10 +1471,45 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1418 public override bool PIDActive {get {return m_pidControllerActive;} set { return; } } 1471 public override bool PIDActive {get {return m_pidControllerActive;} set { return; } }
1419 public override float PIDTau { set { return; } } 1472 public override float PIDTau { set { return; } }
1420 1473
1421 public override float PIDHoverHeight { set { return; } } 1474 public override float PIDHoverHeight
1422 public override bool PIDHoverActive { set { return; } } 1475 {
1423 public override PIDHoverType PIDHoverType { set { return; } } 1476 set
1424 public override float PIDHoverTau { set { return; } } 1477 {
1478 AddChange(changes.PIDHoverHeight,value);
1479 }
1480 }
1481 public override bool PIDHoverActive
1482 {
1483 set
1484 {
1485 AddChange(changes.PIDHoverActive, value);
1486 }
1487 }
1488
1489 public override PIDHoverType PIDHoverType
1490 {
1491 set
1492 {
1493 AddChange(changes.PIDHoverType,value);
1494 }
1495 }
1496
1497 public override float PIDHoverTau
1498 {
1499 set
1500 {
1501 float tmp =0;
1502 if (value > 0)
1503 {
1504 float mint = (0.05f > timeStep ? 0.05f : timeStep);
1505 if (value < mint)
1506 tmp = mint;
1507 else
1508 tmp = value;
1509 }
1510 AddChange(changes.PIDHoverTau, tmp);
1511 }
1512 }
1425 1513
1426 public override Quaternion APIDTarget { set { return; } } 1514 public override Quaternion APIDTarget { set { return; } }
1427 1515
@@ -1713,6 +1801,28 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1713 d.BodySetLinearVel(Body, newmomentum.X, newmomentum.Y, newmomentum.Z); 1801 d.BodySetLinearVel(Body, newmomentum.X, newmomentum.Y, newmomentum.Z);
1714 } 1802 }
1715 1803
1804 private void changePIDHoverHeight(float val)
1805 {
1806 m_PIDHoverHeight = val;
1807 if (val == 0)
1808 m_useHoverPID = false;
1809 }
1810
1811 private void changePIDHoverType(PIDHoverType type)
1812 {
1813 m_PIDHoverType = type;
1814 }
1815
1816 private void changePIDHoverTau(float tau)
1817 {
1818 m_PIDHoverTau = tau;
1819 }
1820
1821 private void changePIDHoverActive(bool active)
1822 {
1823 m_useHoverPID = active;
1824 }
1825
1716 private void donullchange() 1826 private void donullchange()
1717 { 1827 {
1718 } 1828 }
@@ -1792,6 +1902,23 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1792 case changes.Momentum: 1902 case changes.Momentum:
1793 changeMomentum((Vector3)arg); 1903 changeMomentum((Vector3)arg);
1794 break; 1904 break;
1905
1906 case changes.PIDHoverHeight:
1907 changePIDHoverHeight((float)arg);
1908 break;
1909
1910 case changes.PIDHoverType:
1911 changePIDHoverType((PIDHoverType)arg);
1912 break;
1913
1914 case changes.PIDHoverTau:
1915 changePIDHoverTau((float)arg);
1916 break;
1917
1918 case changes.PIDHoverActive:
1919 changePIDHoverActive((bool)arg);
1920 break;
1921
1795/* not in use for now 1922/* not in use for now
1796 case changes.Shape: 1923 case changes.Shape:
1797 changeShape((PrimitiveBaseShape)arg); 1924 changeShape((PrimitiveBaseShape)arg);