官术网_书友最值得收藏!

Avoiding blocks and agents

Modifying the SeekingAgent.lua script by adding the weighted sum of the ForceToAvoidAgents and ForceToAvoidObjects functions allows for the seeking agent to avoid potential collisions. When running the sandbox, try shooting boxes in the path of the agent and watch it navigate around the boxes:

SeekingAgent.lua

function Agent_Update(agent, deltaTimeInMillis)
    local destination = agent:GetTarget();
    local deltaTimeInSeconds = deltaTimeInMillis / 1000;
    local avoidAgentForce = agent:ForceToAvoidAgents(1.5);
    local avoidObjectForce = agent:ForceToAvoidObjects(1.5);
    local seekForce = agent:ForceToPosition(destination);
    local targetRadius = agent:GetTargetRadius();
    local radius = agent:GetRadius();
    local position = agent:GetPosition();
    local avoidanceMultiplier = 3;

    -- Sum all forces and apply higher priority to avoidance 
    -- forces.
    local steeringForces =
        seekForce +
        avoidAgentForce * avoidanceMultiplier +
        avoidObjectForce * avoidanceMultiplier;

    AgentUtilities_ApplyForce(
        agent, steeringForces, deltaTimeInSeconds);

    ...

end

Sandbox.lua:

require "DebugUtilities";

function Sandbox_Update(sandbox, deltaTimeInMillis)
    -- Grab all Sandbox objects, not including agents.
    local objects = Sandbox.GetObjects(sandbox);
    
    -- Draw debug bounding sphere representations for objects with 
    -- mass.
    DebugUtilities_DrawDynamicBoundingSpheres(objects); 
end

Now when we run the sandbox, we can shoot boxes at our seeking agent and watch it steer around each object.

Avoiding obstacles using avoidance

主站蜘蛛池模板: 洛宁县| 临夏县| 资源县| 盈江县| 新乡县| 巴楚县| 广宗县| 分宜县| 贡山| 柳河县| 商水县| 大邑县| 银川市| 滨海县| 泊头市| 松原市| 永嘉县| 丽水市| 宁德市| 昌乐县| 龙海市| 麻江县| 正镶白旗| 孝昌县| 襄樊市| 新沂市| 土默特左旗| 永春县| 永春县| 九龙县| 于都县| 肥乡县| 梁河县| 建瓯市| 专栏| 商南县| 普安县| 封丘县| 安国市| 万盛区| 房产|