有噪音的自然运动
Natural Movement with Noise
我正在创建一个对象,它使用像这样的噪声(按预期工作)以自然方式随机移动:
物体发生碰撞,轨迹被操纵,运动路径变为直线(原意)
thisRabbit.x = _world.width * (noise(thisRabbit.t));
thisRabbit.y = _world.height * (noise(thisRabbit.t+5));
thisRabbit.t += 0.001;
问题是在这次移动之后,我希望对象像最初一样再次开始沿随机方向移动。如果我使用相同的功能,对象将跳转到修改轨迹之前的最后一个位置。
let vx = this.acquiredFood[0] - this.x;
let vy = this.acquiredFood[1] - this.y;
let f = (this.genes.speed + 10) / Math.sqrt(vx*vx+vy*vy);
vx = vx * f;
vy = vy * f;
let newX = this.x + vx;
let newY = this.y + vy;
那么如何让对象像以前一样移动,给定起始位置
在此处编辑:片段:https://editor.p5js.org/vince.chinner/sketches/HPFKR8eIw
你的问题是你使用了一个从 0 到 1 的因子,由 noise
和一个递增的种子通过直接乘以世界维度来生成位置。到达食物时,您不能将种子增加到获取食物的运动引导您的确切位置(我发现 noise
没有反函数从 return 值获取种子) .
你需要做的是使用噪音来增加或减少坐标,这样无论种子在哪里,你都不会失去你的当前位置。
这是我对代码应用的不同更正,因为也有语法错误,出于版权原因我不能真正将所有内容粘贴到这里(你没有在这里分享整个代码,草图属于给你)
主要更正:
- 使用了 var
found
因为 return 从 forEach
回调中调用不会让您离开 findFood
函数,而是离开回调函数。 forEach
循环不会停止。使用此 var 可防止进行进一步的 forEach
测试,并允许您从 findFood
到 return,以便在看到食物后不再进行进一步的移动。
noise
现在应用于值 4,我减去 2,因此 x
和 y
现在分别在 -2 到 2 的范围内变化。当然,使用这种方法,您需要检查世界维度,否则兔子可能会离开世界。种子增量也已更改,否则变化太慢(根据需要调整值)
findFood(){
var thisRabbit = this, found = false;
_world.food.forEach(f => {
if(!found){
let d = int(dist(f[0], f[1], thisRabbit.x, thisRabbit.y));
if(d < (thisRabbit.genes.vision / 2)+3){
thisRabbit.state = "foundFood";
this.acquiredFood = f;
found = true;
}
}
});
if(found){ return; }
thisRabbit.x += (noise(thisRabbit.t) * 4) - 2;
if(thisRabbit.x < 0){ thisRabbit.x = 0; }
if(thisRabbit.x > _world.width){ thisRabbit.x = _world.width; }
thisRabbit.y += (noise(thisRabbit.t + 5) * 4) - 2;
if(thisRabbit.y < 0){ thisRabbit.y = 0; }
if(thisRabbit.y > _world.height){ thisRabbit.y = _world.height; }
thisRabbit.t += 0.01;
}
语法错误:
第 23 / 24 行:赋值应带有一个值(null
或 false
)
this.genes = null;
this.acquiredFood = null;
第 129 到 133 行:以 ;
而不是 ,
结束指令
this.width = w;
this.height = h;
this.foodDensity = foodDensity;
this.food = [];
this.rabits = [];
第 156 到 160 行:rabbit
和 .t
之间不应有 space。此外,因为坐标没有直接链接到 t
,我更愿意使用 random
作为起始位置:
let x = this.width * random();
let y = this.height * random();
let _rabbit = new rabbit(x, y);
_rabbit.genes = genes;
_rabbit.t = t;
我正在创建一个对象,它使用像这样的噪声(按预期工作)以自然方式随机移动:
物体发生碰撞,轨迹被操纵,运动路径变为直线(原意)
thisRabbit.x = _world.width * (noise(thisRabbit.t));
thisRabbit.y = _world.height * (noise(thisRabbit.t+5));
thisRabbit.t += 0.001;
问题是在这次移动之后,我希望对象像最初一样再次开始沿随机方向移动。如果我使用相同的功能,对象将跳转到修改轨迹之前的最后一个位置。
let vx = this.acquiredFood[0] - this.x;
let vy = this.acquiredFood[1] - this.y;
let f = (this.genes.speed + 10) / Math.sqrt(vx*vx+vy*vy);
vx = vx * f;
vy = vy * f;
let newX = this.x + vx;
let newY = this.y + vy;
那么如何让对象像以前一样移动,给定起始位置
在此处编辑:片段:https://editor.p5js.org/vince.chinner/sketches/HPFKR8eIw
你的问题是你使用了一个从 0 到 1 的因子,由 noise
和一个递增的种子通过直接乘以世界维度来生成位置。到达食物时,您不能将种子增加到获取食物的运动引导您的确切位置(我发现 noise
没有反函数从 return 值获取种子) .
你需要做的是使用噪音来增加或减少坐标,这样无论种子在哪里,你都不会失去你的当前位置。
这是我对代码应用的不同更正,因为也有语法错误,出于版权原因我不能真正将所有内容粘贴到这里(你没有在这里分享整个代码,草图属于给你)
主要更正:
- 使用了 var
found
因为 return 从forEach
回调中调用不会让您离开findFood
函数,而是离开回调函数。forEach
循环不会停止。使用此 var 可防止进行进一步的forEach
测试,并允许您从findFood
到 return,以便在看到食物后不再进行进一步的移动。 noise
现在应用于值 4,我减去 2,因此x
和y
现在分别在 -2 到 2 的范围内变化。当然,使用这种方法,您需要检查世界维度,否则兔子可能会离开世界。种子增量也已更改,否则变化太慢(根据需要调整值)
findFood(){
var thisRabbit = this, found = false;
_world.food.forEach(f => {
if(!found){
let d = int(dist(f[0], f[1], thisRabbit.x, thisRabbit.y));
if(d < (thisRabbit.genes.vision / 2)+3){
thisRabbit.state = "foundFood";
this.acquiredFood = f;
found = true;
}
}
});
if(found){ return; }
thisRabbit.x += (noise(thisRabbit.t) * 4) - 2;
if(thisRabbit.x < 0){ thisRabbit.x = 0; }
if(thisRabbit.x > _world.width){ thisRabbit.x = _world.width; }
thisRabbit.y += (noise(thisRabbit.t + 5) * 4) - 2;
if(thisRabbit.y < 0){ thisRabbit.y = 0; }
if(thisRabbit.y > _world.height){ thisRabbit.y = _world.height; }
thisRabbit.t += 0.01;
}
语法错误:
第 23 / 24 行:赋值应带有一个值(null
或 false
)
this.genes = null;
this.acquiredFood = null;
第 129 到 133 行:以 ;
而不是 ,
this.width = w;
this.height = h;
this.foodDensity = foodDensity;
this.food = [];
this.rabits = [];
第 156 到 160 行:rabbit
和 .t
之间不应有 space。此外,因为坐标没有直接链接到 t
,我更愿意使用 random
作为起始位置:
let x = this.width * random();
let y = this.height * random();
let _rabbit = new rabbit(x, y);
_rabbit.genes = genes;
_rabbit.t = t;