[Opensim-users] NPCs DoMoveToPosition vs DoAutoPilot

bodzette Coignet bodzettecoignet at gmail.com
Thu Oct 28 17:19:57 UTC 2010


Teravus,

Awesome!
I'll play with this over the weekend.

Thanks.

On Thu, Oct 28, 2010 at 9:54 AM, Teravus Ovares <teravus at gmail.com> wrote:

> You need to pump avatar movement updates for the autopilot code to work.
>
> Even if there are no movement flags, calling
> ScenePresence.HandleAgentUpdate with a proper AgentUpdateArgs will 'move'
> the avatar a step towards the target of the autopilot.
>
> The following code is for an older version of OpenSimulator but it might
> work with a few modifications on the current version.
> (AddRegion is INonSharedRegionModule.AddRegion)
>
> private int m_agentupdatepump = 5;
> private Scene m_scene;
> private List<ScenePresence> m_activeCharactersSP;
> private List<Character> m_activeCharacters;
>
> private Quaternion fourtyFiveDegreeAngle = new
> Quaternion(0,0,-0.70711f,0.70711f);
>
>
> public virtual void AddRegion(Scene scene)
> {
>     m_scene = scene;
>     m_scene.EventManager.OnFrame += EventManager_OnFrame;
> }
>
>  void EventManager_OnFrame()
> {
>      m_frame++;
>
>      if ((m_frame % m_agentupdatepump) == 0)
>      {
>           PumpAgentUpdate();
>      }
>
>      if (m_frame >= (int.MaxValue - 1))
>      {
>           m_frame = 0;
>      }
>  }
>
> void PumpAgentUpdate()
> {
>      lock (m_activeCharacters)
>      {
>          foreach (Character c in m_activeCharacters)
>          {
>               ScenePresence cSP = m_scene.GetScenePresence(c.AgentId);
>               PumpAgentUpdate(c, cSP);
>          }
>      }
> }
>
> void PumpAgentUpdate(Character pC, ScenePresence pSP)
> {
>      AgentUpdateArgs updateargs = new AgentUpdateArgs();
>      updateargs.AgentID = pC.AgentId;
>
>      updateargs.BodyRotation = Vector3.RotationBetween(Vector3.UnitX,
> Vector3.Normalize(pC.m_lastTarget - pSP.AbsolutePosition));
>
>      if (pC.ClientSideOrientation == fourtyFiveDegreeAngle)
>          pC.ClientSideOrientation = Quaternion.Identity;
>
>      updateargs.CameraAtAxis = Vector3.Zero;
>      updateargs.CameraCenter = new Vector3(pSP.AbsolutePosition  - (new
> Vector3(0,0,1) * updateargs.BodyRotation));
>      updateargs.CameraLeftAxis = Vector3.Zero;
>      updateargs.CameraUpAxis = Vector3.Zero;
>      updateargs.ControlFlags = uint.MinValue;//
> +(uint)OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FLY;
>      updateargs.Far = 128f;
>      updateargs.Flags = byte.MinValue;
>      updateargs.HeadRotation = Quaternion.Identity;
>      updateargs.SessionID = pC.SessionId;
>      updateargs.State = byte.MinValue;
>
>      pSP.HandleAgentUpdate(pC,updateargs);
> }
>
>
> Note that the Character class had NPC related stuff in it like 'last
> target'.   We need that information to send a proper BodyRotation in the
> AgentUpdateArgs
> updateargs.BodyRotation = Vector3.RotationBetween(Vector3.UnitX,
> Vector3.Normalize(Character.m_lastTarget - ScenePresence.AbsolutePosition));
>
> Hopefully, I've given you enough code to get started.
>
>
> Teravus
>
> On Wed, Oct 27, 2010 at 4:47 PM, bodzette Coignet <
> bodzettecoignet at gmail.com> wrote:
>
>> After some hair pulling and running into someone with complementary skills
>> I've made some progress:
>> I've managed to get a server side NPC to do the following:
>> Rezz, Say something, Play an Animation and Delete itself.
>>
>> Unfortunately at the moment I can't get it to move and am currently
>> investigating why not. Right now my understanding of things is somewhat
>> limited so forgive me if my questions sound stupid to those in the know:
>>
>> A couple questions:
>>
>> Given that the NPC code appears to use a bunch of different autopilot
>> code, I'm guessing that this is specific to NPCs and is not the way regular
>> avatars move. It appears to be broken somehow, because the code is called
>> but the NPC doesn't move. What is the difference between movement for a
>> regular avatar and an NPC? It's my position that there really shouldn't be
>> one, but could someone fill me in?
>>
>> What is the code that moves a standard (i.e. non-NPC avatar) is it
>> Region.Framework.Scenes.ScenePresence.DoMoveToPosition or is it somewhere
>> else?
>>
>> What is a ScenePresence? Is it that portion of a scene corresponding to a
>> single avatar? If so is there any reason why an NPC avatar should exhibit
>> different behavior here than a regular avatar?
>>
>> Can anyone give a program flow of how a regular avatar moves?
>> My guess is it's something like this:
>>  Intecerpt Arrow Key or Movement Control Arrow ->
>> Pass avatar UUID and force and vector to server ->
>> server finds avatar in scene (looping through scene dictionary of avatars
>> till it identifies the right one?) ->
>> server applies force and vector to appropriate avatar in dictionary ->
>> avatar enters, does and completes movement ->
>> server updates entire scene x times per second until avatar movement is
>> completed
>>
>> Anyone verify the flow?
>>
>> Thanks in advance.
>>
>> _______________________________________________
>> Opensim-users mailing list
>> Opensim-users at lists.berlios.de
>> https://lists.berlios.de/mailman/listinfo/opensim-users
>>
>>
>
> _______________________________________________
> Opensim-users mailing list
> Opensim-users at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/opensim-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://opensimulator.org/pipermail/opensim-users/attachments/20101028/11c7ce60/attachment.html>


More information about the Opensim-users mailing list