OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
BasicVehicles.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Collections.Generic;
30 using System.Linq;
31 using System.Text;
32 
33 using NUnit.Framework;
34 using log4net;
35 
36 using OpenSim.Framework;
37 using OpenSim.Region.PhysicsModule.BulletS;
38 using OpenSim.Region.PhysicsModules.SharedBase;
39 using OpenSim.Tests.Common;
40 
41 using OpenMetaverse;
42 
43 namespace OpenSim.Region.PhysicsModule.BulletS.Tests
44 {
45 [TestFixture]
47 {
48  // Documentation on attributes: http://www.nunit.org/index.php?p=attributes&r=2.6.1
49  // Documentation on assertions: http://www.nunit.org/index.php?p=assertions&r=2.6.1
50 
51  BSScene PhysicsScene { get; set; }
52  BSPrim TestVehicle { get; set; }
53  Vector3 TestVehicleInitPosition { get; set; }
54  float simulationTimeStep = 0.089f;
55 
56  [TestFixtureSetUp]
57  public void Init()
58  {
59  Dictionary<string, string> engineParams = new Dictionary<string, string>();
60  engineParams.Add("VehicleEnableAngularVerticalAttraction", "true");
61  engineParams.Add("VehicleAngularVerticalAttractionAlgorithm", "1");
62  PhysicsScene = BulletSimTestsUtil.CreateBasicPhysicsEngine(engineParams);
63 
64  PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateSphere();
65  Vector3 pos = new Vector3(100.0f, 100.0f, 0f);
66  pos.Z = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos) + 2f;
67  TestVehicleInitPosition = pos;
68  Vector3 size = new Vector3(1f, 1f, 1f);
69  pbs.Scale = size;
70  Quaternion rot = Quaternion.Identity;
71  bool isPhys = false;
72  uint localID = 123;
73 
74  PhysicsScene.AddPrimShape("testPrim", pbs, pos, size, rot, isPhys, localID);
75  TestVehicle = (BSPrim)PhysicsScene.PhysObjects[localID];
76  // The actual prim shape creation happens at taint time
77  PhysicsScene.ProcessTaints();
78 
79  }
80 
81  [TestFixtureTearDown]
82  public void TearDown()
83  {
84  if (PhysicsScene != null)
85  {
86  // The Dispose() will also free any physical objects in the scene
87  PhysicsScene.Dispose();
88  PhysicsScene = null;
89  }
90  }
91 
92  [TestCase(2f, 0.2f, 0.25f, 0.25f, 0.25f)]
93  [TestCase(2f, 0.2f, -0.25f, 0.25f, 0.25f)]
94  [TestCase(2f, 0.2f, 0.25f, -0.25f, 0.25f)]
95  [TestCase(2f, 0.2f, -0.25f, -0.25f, 0.25f)]
96  // [TestCase(2f, 0.2f, 0.785f, 0.0f, 0.25f) /*, "Leaning 45 degrees to the side" */]
97  // [TestCase(2f, 0.2f, 1.650f, 0.0f, 0.25f) /*, "Leaning more than 90 degrees to the side" */]
98  // [TestCase(2f, 0.2f, 2.750f, 0.0f, 0.25f) /*, "Almost upside down, tipped right" */]
99  // [TestCase(2f, 0.2f,-2.750f, 0.0f, 0.25f) /*, "Almost upside down, tipped left" */]
100  // [TestCase(2f, 0.2f, 0.0f, 0.785f, 0.25f) /*, "Tipped back 45 degrees" */]
101  // [TestCase(2f, 0.2f, 0.0f, 1.650f, 0.25f) /*, "Tipped back more than 90 degrees" */]
102  // [TestCase(2f, 0.2f, 0.0f, 2.750f, 0.25f) /*, "Almost upside down, tipped back" */]
103  // [TestCase(2f, 0.2f, 0.0f,-2.750f, 0.25f) /*, "Almost upside down, tipped forward" */]
104  public void AngularVerticalAttraction(float timeScale, float efficiency, float initRoll, float initPitch, float initYaw)
105  {
106  // Enough simulation steps to cover the timescale the operation should take
107  int simSteps = (int)(timeScale / simulationTimeStep) + 1;
108 
109  // Tip the vehicle
110  Quaternion initOrientation = Quaternion.CreateFromEulers(initRoll, initPitch, initYaw);
111  TestVehicle.Orientation = initOrientation;
112 
113  TestVehicle.Position = TestVehicleInitPosition;
114 
115  // The vehicle controller is not enabled directly (by setting a vehicle type).
116  // Instead the appropriate values are set and calls are made just the parts of the
117  // controller we want to exercise. Stepping the physics engine then applies
118  // the actions of that one feature.
119  BSDynamics vehicleActor = TestVehicle.GetVehicleActor(true /* createIfNone */);
120  if (vehicleActor != null)
121  {
122  vehicleActor.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_EFFICIENCY, efficiency);
123  vehicleActor.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_TIMESCALE, timeScale);
124  // vehicleActor.enableAngularVerticalAttraction = true;
125 
126  TestVehicle.IsPhysical = true;
127  PhysicsScene.ProcessTaints();
128 
129  // Step the simulator a bunch of times and vertical attraction should orient the vehicle up
130  for (int ii = 0; ii < simSteps; ii++)
131  {
132  vehicleActor.ForgetKnownVehicleProperties();
133  vehicleActor.ComputeAngularVerticalAttraction();
134  vehicleActor.PushKnownChanged();
135 
136  PhysicsScene.Simulate(simulationTimeStep);
137  }
138  }
139 
140  TestVehicle.IsPhysical = false;
141  PhysicsScene.ProcessTaints();
142 
143  // After these steps, the vehicle should be upright
144  /*
145  float finalRoll, finalPitch, finalYaw;
146  TestVehicle.Orientation.GetEulerAngles(out finalRoll, out finalPitch, out finalYaw);
147  Assert.That(finalRoll, Is.InRange(-0.01f, 0.01f));
148  Assert.That(finalPitch, Is.InRange(-0.01f, 0.01f));
149  Assert.That(finalYaw, Is.InRange(initYaw - 0.1f, initYaw + 0.1f));
150  */
151 
152  Vector3 upPointer = Vector3.UnitZ * TestVehicle.Orientation;
153  Assert.That(upPointer.Z, Is.GreaterThan(0.99f));
154  }
155 }
156 }
void AngularVerticalAttraction(float timeScale, float efficiency, float initRoll, float initPitch, float initYaw)
Interactive OpenSim region server
Definition: OpenSim.cs:55